mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-26 18:31:34 +01:00
## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - Paperclip Runner needs repeatable evaluation contracts. > - Evaluation code must stay separate from provider launch and production orchestration. > - Offline fixtures need stable compatibility, scoring, traceability, and report rules. > - Published Runner consumers need only the supported evaluation contract surface. > - This pull request adds offline evaluation tooling and a workspace-private matrix kernel. > - The benefit is deterministic evaluation without credentials or paid provider calls. ## Linked Issues or Issue Description Refs #11297 This pull request extracts the offline evaluation unit from the earlier aggregate Runner work. ## What Changed - Add a workspace-private, provider-neutral evaluation matrix kernel. - Add the public `@paperclipai/paperclip-runner/evals` compatibility and native execution contracts. - Add fail-closed runnerd artifact and protocol compatibility checks. - Add deterministic workflow catalogs, scoring, traceability, and report generation. - Add sanitized Codex, OpenCode, and ACPX fixtures. - Add package-boundary and clean-consumer checks. - Add the eval package manifest to the Docker dependency stage. - Add the generated protocol fixture digest without changing the lockfile. ## Verification GitHub Actions must run: - Runner TypeScript and Rust type checks. - Runner unit and protocol tests. - Evaluation kernel tests. - Workflow traceability checks. - Clean-consumer and package-boundary checks. - Repository test, type-check, build, policy, and security gates. No local test command was run. The repository owner requested GitHub-only verification. ## Risks This is a large greenfield review surface with 51 files. The code does not launch a live provider or load credentials. Package and protocol drift fail closed. The workspace lockfile remains under the existing CI-owned process. ## Model Used OpenAI Codex with the GPT-5 agent model. The work used high reasoning, repository inspection, tool use, and parallel code review. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [ ] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [ ] All Paperclip CI gates are green - [ ] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge
259 lines
8.0 KiB
JSON
259 lines
8.0 KiB
JSON
{
|
|
"schema": "paperclip-runner/native-execution/v1",
|
|
"provenance": "seeded",
|
|
"identity": {
|
|
"runId": "run_evals_seeded",
|
|
"caseId": "case_semantic_denial",
|
|
"configId": "config_deterministic_v1",
|
|
"attemptId": "attempt_semantic_denial_0001"
|
|
},
|
|
"input": {
|
|
"caseSha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"configSha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
"deterministicSeed": "paperclip-evals-v1-seed"
|
|
},
|
|
"runner": {
|
|
"package": {
|
|
"name": "@paperclipai/paperclip-runner",
|
|
"version": "0.0.0"
|
|
},
|
|
"binary": {
|
|
"name": "paperclip-runnerd",
|
|
"sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
|
|
},
|
|
"prpVersion": 1,
|
|
"nativeExecutionVersion": 1,
|
|
"catalogVersion": 1,
|
|
"catalogSha256": "sha256:e5a90079e1641e50f2f07a320856bbef622c04810384ffdd1895576cc16c4c5c",
|
|
"driverContractVersion": 1,
|
|
"driverKind": "paperclip-deterministic",
|
|
"driverVersion": "1.0.0"
|
|
},
|
|
"events": [
|
|
{
|
|
"schema": "paperclip.prp.event.v1",
|
|
"sourceEventId": "evals_seeded_01",
|
|
"sourceSeq": 1,
|
|
"sourceInstanceId": "runner_evals_seeded",
|
|
"sourceKind": "runner",
|
|
"runId": "run_evals_seeded",
|
|
"normalizedSessionId": "session_evals_seeded",
|
|
"turnId": "turn_evals_seeded",
|
|
"itemId": "item_evals_seeded",
|
|
"eventType": "mcp_app.tool_input",
|
|
"schemaVersion": 1,
|
|
"priority": 1,
|
|
"emittedAt": "2026-08-11T12:00:00.000Z",
|
|
"payload": {
|
|
"semantic_tool": {
|
|
"schema": "paperclip.prp.semantic_tool.v1",
|
|
"schemaVersion": 1,
|
|
"phase": "input",
|
|
"operationId": "decide_approval",
|
|
"callId": "call_evals_seeded",
|
|
"correlation": {
|
|
"runId": "run_evals_seeded",
|
|
"normalizedSessionId": "session_evals_seeded",
|
|
"turnId": "turn_evals_seeded",
|
|
"itemId": "item_evals_seeded"
|
|
},
|
|
"idempotencyKey": "decide_evals_seeded",
|
|
"content": {
|
|
"digest": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
|
|
"redactionDisposition": "redacted",
|
|
"references": []
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"schema": "paperclip.prp.event.v1",
|
|
"sourceEventId": "evals_seeded_02",
|
|
"sourceSeq": 2,
|
|
"sourceInstanceId": "runner_evals_seeded",
|
|
"sourceKind": "runner",
|
|
"runId": "run_evals_seeded",
|
|
"normalizedSessionId": "session_evals_seeded",
|
|
"turnId": "turn_evals_seeded",
|
|
"itemId": "item_evals_seeded",
|
|
"eventType": "mcp_app.tool_result",
|
|
"schemaVersion": 1,
|
|
"priority": 1,
|
|
"emittedAt": "2026-08-11T12:00:00.010Z",
|
|
"payload": {
|
|
"semantic_tool": {
|
|
"schema": "paperclip.prp.semantic_tool.v1",
|
|
"schemaVersion": 1,
|
|
"phase": "result",
|
|
"operationId": "decide_approval",
|
|
"callId": "call_evals_seeded",
|
|
"correlation": {
|
|
"runId": "run_evals_seeded",
|
|
"normalizedSessionId": "session_evals_seeded",
|
|
"turnId": "turn_evals_seeded",
|
|
"itemId": "item_evals_seeded"
|
|
},
|
|
"idempotencyKey": "decide_evals_seeded",
|
|
"content": {
|
|
"digest": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
|
"redactionDisposition": "redacted",
|
|
"references": []
|
|
},
|
|
"outcome": "denied",
|
|
"code": "required_claim_missing",
|
|
"retryable": false,
|
|
"authorizationBoundary": "grant",
|
|
"operationReceiptId": "receipt_evals_seeded",
|
|
"auditReceiptId": "audit_evals_seeded"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"schema": "paperclip.prp.event.v1",
|
|
"sourceEventId": "evals_seeded_03",
|
|
"sourceSeq": 3,
|
|
"sourceInstanceId": "runner_evals_seeded",
|
|
"sourceKind": "runner",
|
|
"runId": "run_evals_seeded",
|
|
"normalizedSessionId": "session_evals_seeded",
|
|
"turnId": "turn_evals_seeded",
|
|
"eventType": "run.result.proposed",
|
|
"schemaVersion": 1,
|
|
"priority": 0,
|
|
"emittedAt": "2026-08-11T12:00:00.020Z",
|
|
"payload": {
|
|
"schema": "paperclip.run_result.v1",
|
|
"reportedWorkDisposition": "needs_review",
|
|
"summary": "The governed tool effect was rejected and preserved as a denial.",
|
|
"completionClaim": {
|
|
"contractRevision": "evals-native-execution-v1",
|
|
"objectiveSatisfied": false,
|
|
"criteria": [],
|
|
"remainingWork": [
|
|
{
|
|
"description": "An authorized approver must decide.",
|
|
"blocksCompletion": true
|
|
}
|
|
]
|
|
},
|
|
"evidence": [{ "receiptId": "receipt_evals_seeded" }],
|
|
"verification": [
|
|
{
|
|
"commandOrCheck": "rejected tool effect stays denied",
|
|
"status": "passed"
|
|
}
|
|
],
|
|
"attentionRequests": [],
|
|
"artifacts": []
|
|
}
|
|
},
|
|
{
|
|
"schema": "paperclip.prp.event.v1",
|
|
"sourceEventId": "evals_seeded_04",
|
|
"sourceSeq": 4,
|
|
"sourceInstanceId": "runner_evals_seeded",
|
|
"sourceKind": "runner",
|
|
"runId": "run_evals_seeded",
|
|
"normalizedSessionId": "session_evals_seeded",
|
|
"turnId": "turn_evals_seeded",
|
|
"eventType": "run.terminal",
|
|
"schemaVersion": 1,
|
|
"priority": 0,
|
|
"emittedAt": "2026-08-11T12:00:00.030Z",
|
|
"payload": {
|
|
"schema": "paperclip.prp.terminal.v1",
|
|
"turnTerminalState": "completed",
|
|
"runTerminalState": "succeeded",
|
|
"reportedWorkDisposition": "needs_review",
|
|
"workAssessmentId": "assessment_evals_seeded",
|
|
"statusDecisionId": "decision_evals_seeded"
|
|
}
|
|
}
|
|
],
|
|
"semanticTools": {
|
|
"definitions": [
|
|
{
|
|
"operationId": "decide_approval",
|
|
"schemaVersion": 1,
|
|
"availability": "denied"
|
|
}
|
|
],
|
|
"calls": [
|
|
{
|
|
"callId": "call_evals_seeded",
|
|
"operationId": "decide_approval",
|
|
"eventId": "evals_seeded_01"
|
|
}
|
|
],
|
|
"results": [
|
|
{
|
|
"callId": "call_evals_seeded",
|
|
"operationId": "decide_approval",
|
|
"eventId": "evals_seeded_02",
|
|
"outcome": "denied"
|
|
}
|
|
],
|
|
"denials": [
|
|
{
|
|
"callId": "call_evals_seeded",
|
|
"code": "required_claim_missing",
|
|
"authorizationBoundary": "grant",
|
|
"retryable": false
|
|
}
|
|
]
|
|
},
|
|
"terminal": {
|
|
"schema": "paperclip.prp.terminal.v1",
|
|
"turnTerminalState": "completed",
|
|
"runTerminalState": "succeeded",
|
|
"reportedWorkDisposition": "needs_review",
|
|
"workAssessmentId": "assessment_evals_seeded",
|
|
"statusDecisionId": "decision_evals_seeded"
|
|
},
|
|
"observations": {
|
|
"checks": [
|
|
{
|
|
"id": "tool-effect-denied",
|
|
"passed": true,
|
|
"receiptId": "receipt_evals_seeded"
|
|
}
|
|
]
|
|
},
|
|
"usage": {
|
|
"inputTokens": 12,
|
|
"outputTokens": 8,
|
|
"totalTokens": 20,
|
|
"requestCount": 1,
|
|
"durationMs": 30,
|
|
"cost": {
|
|
"currency": "USD",
|
|
"amountMicros": 0
|
|
}
|
|
},
|
|
"transcript": {
|
|
"uri": "artifact://native/attempt_semantic_denial_0001/transcript.jsonl",
|
|
"sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
|
"byteSize": 2048,
|
|
"mediaType": "application/x-ndjson",
|
|
"complete": true,
|
|
"eventCount": 4,
|
|
"omissionReason": null
|
|
},
|
|
"artifactRoot": {
|
|
"uri": "artifact://native/attempt_semantic_denial_0001/",
|
|
"sha256": "sha256:1212121212121212121212121212121212121212121212121212121212121212",
|
|
"byteSize": 4096,
|
|
"mediaType": "application/vnd.paperclip.runner-artifact-root+json"
|
|
},
|
|
"artifacts": [
|
|
{
|
|
"uri": "artifact://native/attempt_semantic_denial_0001/denial-receipt.json",
|
|
"sha256": "sha256:1313131313131313131313131313131313131313131313131313131313131313",
|
|
"byteSize": 512,
|
|
"mediaType": "application/json"
|
|
}
|
|
],
|
|
"failure": null,
|
|
"x_fixturePurpose": "Proves seeded provenance, denied effects, and additive field preservation."
|
|
}
|