mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-30 05:16:50 +01:00
Define durable runtime activity events (#18129)
## Thinking Path > - Paperclip manages agents and tasks. > - Runner reports durable run events through PRP. > - Runtime clients need a typed record of reported activity. > - The event must keep the normal run authority and read boundaries. > - This pull request adds the generic runtime activity event contract. > - Later PRs can publish and consume this contract without private plugin coupling. ## Linked Issues or Issue Description First feature prerequisite extracted from #18050. Runner publishing is #18050; the dependent consumer is #18131. Related independent test stability work: #18128. The parent search and review history is preserved in [the verification archive](https://github.com/paperclipai/paperclip/pull/18050#issuecomment-6489369676). **Subsystem affected** Runner event protocol, server run-event persistence and redaction, and UI event taxonomy. **Problem or motivation** Core needs a durable, typed activity record tied to the authenticated run. A text marker is not an event contract. **Proposed solution** Add `runtime.activity.recorded` as a P1 event with a closed `{ namespace, activityKey }` payload. Runner knows no plugin or panel identity. Run/session identity, sequence and emission time stay in the outer envelope; Core resolves company, task and agent through the authorized run binding. Use the existing authenticated persistence, acknowledgement, replay and redaction paths. ## What Changed - Define and validate the event in PRP v1, v2 and v3. Update the generated protocol artifacts and event catalog. - Preserve saved and live event redaction. Test persistence, replay deduplication and the existing run-read boundary. - Register the event in the UI taxonomy without changing panel display behavior. - Advance the source-bound Copilot identity to 78. Retain all published historical identity fixtures without changing their bytes. ## Verification - Root `pnpm typecheck` and `pnpm build`: passed for the revised activity contract. - Node protocol checks: 14 passed. Provider identity and registry tests: 185 passed. Server tests: 103 passed. UI event registry: five passed. - Maintained Grok and Copilot identity generator checks and `git diff --check`: passed. - The first activity-contract review scored 4/5 because the dependent producer and readers still used the earlier contract. Both dependent PRs are now updated and restacked; the finding is resolved and review is running again. - Initial extraction retained a consumer-only import in one server suite. That suite failed to load. The consumer case and import were moved out; the final three server files passed all 103 cases. - Earlier panel-specific head `6137c50bc` had green CI and standard/Apex 5/5. Those scores do not qualify this revised activity contract. Fresh CI and reviews are pending. Earlier combined results in the archive apply only to their recorded source revisions. ## Risks This change is additive. It adds no route, publisher, filesystem transport, provider sandbox grant, or panel display behavior. Activation hints grant no permission to read a plugin view. Provider identities bind the changed protocol source; historical identities remain decode-only. No schema migration or dependency change is required. ## Model Used OpenAI Codex, based on GPT-6, with reasoning, repository tools and code execution. The exact serving snapshot is not exposed. ## 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 - [x] 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 - [x] All Paperclip CI gates are green - [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <noreply@paperclip.ing>
This commit is contained in:
1 parent
ec3b558277
commit
80a2b9284b
32 files changed
+1289
-105
No files matched your search
@@ -632,3 +632,24 @@ write the warning must not replace the provider outcome or stop lease release.
|
||||
cannot apply company export settings. Its payload contains only a closed reason
|
||||
and the settings revision. It carries no endpoint, credential, secret reference
|
||||
or resolver error. Recording the diagnostic never contacts a destination.
|
||||
|
||||
## Runtime activity
|
||||
|
||||
`runtime.activity.recorded` is a P1 Runner PRP event with a closed
|
||||
`{ namespace, activityKey }` payload. `namespace` groups a producer's activity
|
||||
types under a stable name. `activityKey` identifies an activity within that group.
|
||||
Consumers use the pair to select a response to activity in the current run.
|
||||
|
||||
For example, `{ namespace: "example.computer", activityKey: "desktop.used" }`
|
||||
records successful desktop use. Core can map that activity to a Desktop viewer
|
||||
for the task's running agent. The authenticated event envelope supplies the run,
|
||||
session, source sequence and emission time. Core resolves the company, task and
|
||||
agent through the run's existing authorization checks.
|
||||
|
||||
Both activity identifiers contain 1–160 Unicode code points and exclude C0
|
||||
controls and DEL. Callers cannot supply run, task or agent identity in this payload.
|
||||
|
||||
The ordinary authenticated Runner event is the durable record. Normal source-event
|
||||
acknowledgement and replay deduplicate delivery. Existing run-read authorization
|
||||
and secret redaction apply to saved and live events. Recording reported activity
|
||||
is not independent proof that it happened and grants no resource permission.
|
||||
@@ -32,12 +32,12 @@
|
||||
"requiresProviderPolicy": true
|
||||
},
|
||||
"copilot": {
|
||||
"agentProfileVersion": 74,
|
||||
"agentProfileVersion": 78,
|
||||
"agentServerPackage": "@github/copilot",
|
||||
"agentServerVersion": "1.0.88",
|
||||
"agentRuntimePackage": null,
|
||||
"agentRuntimeVersion": null,
|
||||
"commandDigest": "sha256:c3e059a6c68afa2216f0315d85be084126c91d9bdbe21c2e65790fb2fc577fcd",
|
||||
"commandDigest": "sha256:f7e7cff356db4b1b37458bd62fd76e9d81aa1cc46795e54b168755fb68bcee8c",
|
||||
"requiresProviderPolicy": true
|
||||
},
|
||||
"claude": {
|
||||
|
||||
@@ -131,3 +131,14 @@ The files in `fixtures/local-runner/scripts/` drive the package-local fake
|
||||
harness. They cover successful, failed, interrupted, interactive, duplicate
|
||||
terminal, process-cleanup, and oversized-frame behavior without starting a
|
||||
production adapter.
|
||||
|
||||
`runtime.activity.recorded` is a P1 Runner event in v1, v2 and v3 with exactly
|
||||
`{ namespace, activityKey }`. Both opaque identifiers contain 1–160 Unicode code
|
||||
points and exclude C0 controls and DEL. `namespace` groups a producer's activity
|
||||
types; `activityKey` names an activity within that group. Consumers use the pair
|
||||
to select a response to activity in the run. The authenticated outer envelope
|
||||
provides run and session identity, source sequence and emission time. Core resolves
|
||||
the run's company, task and agent through its existing authorized run binding;
|
||||
callers cannot supply those identities in the payload. Recording activity does
|
||||
not independently verify the reported action or grant access to any resource.
|
||||
The event uses the ordinary durable outbox, acknowledgement and replay contract.
|
||||
@@ -55,17 +55,17 @@
|
||||
{
|
||||
"path": "schemas/event-v2.schema.json",
|
||||
"id": "https://paperclip.dev/schemas/prp/v2/event.schema.json",
|
||||
"sha256": "f9e1f36e08aafe8c28218cb3b032423be4d59d3720e26d10dcfb45bc624cdb48"
|
||||
"sha256": "d7aef6f8ce3acf700462b30f52b38153a8a1b4ee86782cfa2991fff258c9e907"
|
||||
},
|
||||
{
|
||||
"path": "schemas/event-v3.schema.json",
|
||||
"id": "https://paperclip.dev/schemas/prp/v3/event.schema.json",
|
||||
"sha256": "1b167f2f5736ebdc9dfe0b3e8c0812337c002141412de8a80901ca3e1b58332e"
|
||||
"sha256": "cee13d1d3c5de444722af5d83e2c96dbba17b1aef8eb6d4c036e9c71fb717f47"
|
||||
},
|
||||
{
|
||||
"path": "schemas/event.schema.json",
|
||||
"id": "https://paperclip.dev/schemas/prp/v1/event.schema.json",
|
||||
"sha256": "a21661fbb7094fb36df235031bddac582785f368981912cf23e86af3d6f9d57f"
|
||||
"sha256": "67611b6d3adbd5731d94d01963e5a35924b7424063851bf60e394fe392685995"
|
||||
},
|
||||
{
|
||||
"path": "schemas/fixture.schema.json",
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
"runner.connected", "runner.reconnected", "runner.reconciled", "runner.disconnected", "runner.draining", "runner.suspending", "runner.suspended", "runner.stopped", "runner.diagnostic",
|
||||
"runtime.phase.changed", "sandbox.metric", "workspace.ready", "workspace.change.updated", "workspace.diff.recorded", "workspace.file.referenced",
|
||||
"auth.credentials.updated",
|
||||
"runtime.activity.recorded",
|
||||
"harness.starting", "harness.ready", "harness.exited", "harness.diagnostic", "plan.updated",
|
||||
"tool.execution.started", "tool.execution.progressed", "tool.execution.completed", "research.started", "research.progressed", "research.completed",
|
||||
"delegation.started", "delegation.updated", "delegation.completed", "model.route.changed", "model.verification.updated", "context.compacted",
|
||||
@@ -83,6 +84,47 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"eventType": {
|
||||
"const": "runtime.activity.recorded"
|
||||
}
|
||||
}
|
||||
},
|
||||
"then": {
|
||||
"properties": {
|
||||
"sourceKind": {
|
||||
"const": "runner"
|
||||
},
|
||||
"priority": {
|
||||
"const": 1
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"namespace",
|
||||
"activityKey"
|
||||
],
|
||||
"properties": {
|
||||
"namespace": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
},
|
||||
"activityKey": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"additionalProperties": true
|
||||
|
||||
@@ -173,7 +173,8 @@
|
||||
"external_provider.dispatch_requested",
|
||||
"external_provider.operation_settled",
|
||||
"external_provider.input_available",
|
||||
"auth.credentials.updated"
|
||||
"auth.credentials.updated",
|
||||
"runtime.activity.recorded"
|
||||
]
|
||||
},
|
||||
"schemaVersion": {
|
||||
@@ -689,6 +690,47 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"eventType": {
|
||||
"const": "runtime.activity.recorded"
|
||||
}
|
||||
}
|
||||
},
|
||||
"then": {
|
||||
"properties": {
|
||||
"sourceKind": {
|
||||
"const": "runner"
|
||||
},
|
||||
"priority": {
|
||||
"const": 1
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"namespace",
|
||||
"activityKey"
|
||||
],
|
||||
"properties": {
|
||||
"namespace": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
},
|
||||
"activityKey": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"additionalProperties": true
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
"runner.connected", "runner.reconnected", "runner.reconciled", "runner.disconnected", "runner.draining", "runner.backpressure", "runner.suspending", "runner.suspended", "runner.stopped", "runner.diagnostic",
|
||||
"runtime.phase.changed", "sandbox.metric", "workspace.ready", "workspace.change.updated", "workspace.diff.recorded", "workspace.file.referenced",
|
||||
"auth.credentials.updated",
|
||||
"runtime.activity.recorded",
|
||||
"harness.starting", "harness.ready", "harness.exited", "harness.diagnostic",
|
||||
"plan.updated",
|
||||
"tool.execution.started", "tool.execution.progressed", "tool.execution.completed",
|
||||
@@ -188,6 +189,47 @@
|
||||
"payload": { "$ref": "https://paperclip.dev/schemas/prp/v1/result.schema.json" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"eventType": {
|
||||
"const": "runtime.activity.recorded"
|
||||
}
|
||||
}
|
||||
},
|
||||
"then": {
|
||||
"properties": {
|
||||
"sourceKind": {
|
||||
"const": "runner"
|
||||
},
|
||||
"priority": {
|
||||
"const": 1
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"namespace",
|
||||
"activityKey"
|
||||
],
|
||||
"properties": {
|
||||
"namespace": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
},
|
||||
"activityKey": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"additionalProperties": true
|
||||
|
||||
@@ -47,7 +47,7 @@ pub(crate) fn acpx_release_profile(agent: &str) -> Option<AcpxReleaseProfile> {
|
||||
agent_runtime_package: None,
|
||||
agent_runtime_version: None,
|
||||
command_digest:
|
||||
"sha256:c3e059a6c68afa2216f0315d85be084126c91d9bdbe21c2e65790fb2fc577fcd",
|
||||
"sha256:f7e7cff356db4b1b37458bd62fd76e9d81aa1cc46795e54b168755fb68bcee8c",
|
||||
requires_provider_policy: true,
|
||||
},
|
||||
"claude" => AcpxReleaseProfile {
|
||||
|
||||
@@ -7,9 +7,9 @@ import { fileURLToPath } from "node:url";
|
||||
import { resolve, dirname } from "node:path";
|
||||
|
||||
const root = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
||||
const fixture = resolve(root, "test/fixtures/copilot-profile-v74-identity.json");
|
||||
const fixture = resolve(root, "test/fixtures/copilot-profile-v78-identity.json");
|
||||
const historical = JSON.parse(readFileSync(resolve(root, "test/fixtures/copilot-profile-v12-identity.json"), "utf8"));
|
||||
const declaration = { ...historical.declaration, agentProfileVersion: 74 };
|
||||
const declaration = { ...historical.declaration, agentProfileVersion: 78 };
|
||||
delete declaration.permissionIdentitySourceSha256;
|
||||
const sources = {
|
||||
displayEventSourceSha256: "src/drivers/acpx/copilot-events.ts",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"evalRepositoryUrl": "https://github.com/paperclipai/paperclip-evals/blob/master/",
|
||||
"prpEventFamilyDescriptions": {
|
||||
"runner": "Runner connection, drain, and diagnostic lifecycle.",
|
||||
"runtime": "Runner phase transitions.",
|
||||
"runtime": "Runner phase transitions and run-scoped reported activity.",
|
||||
"sandbox": "Sandbox resource measurements.",
|
||||
"workspace": "Workspace readiness.",
|
||||
"harness": "Provider harness startup, readiness, exit, and diagnostics.",
|
||||
@@ -49,67 +49,129 @@
|
||||
{
|
||||
"id": "feedback",
|
||||
"description": "Internally attributed complaints and improvement suggestions; no additional grant required beyond active run authority.",
|
||||
"operationIds": ["submit_complaint", "submit_suggestion"]
|
||||
"operationIds": [
|
||||
"submit_complaint",
|
||||
"submit_suggestion"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "discovery",
|
||||
"description": "Company-visible task, agent, project, and goal discovery.",
|
||||
"operationIds": ["search_tasks", "list_agents", "get_agent", "list_projects", "list_goals", "set_task_title"]
|
||||
"operationIds": [
|
||||
"search_tasks",
|
||||
"list_agents",
|
||||
"get_agent",
|
||||
"list_projects",
|
||||
"list_goals",
|
||||
"set_task_title"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "projects",
|
||||
"description": "Project creation and authorized repository discovery through the live company/run authority.",
|
||||
"operationIds": ["create_project", "list_project_repositories"]
|
||||
"operationIds": [
|
||||
"create_project",
|
||||
"list_project_repositories"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "delegation_dependencies",
|
||||
"description": "Create or reassign delegated work and maintain dependency edges.",
|
||||
"operationIds": ["create_task", "reassign_task", "set_dependencies", "hire_agent"]
|
||||
"operationIds": [
|
||||
"create_task",
|
||||
"reassign_task",
|
||||
"set_dependencies",
|
||||
"hire_agent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "governance",
|
||||
"description": "Read, request, comment on, and decide approvals under governed-action checks.",
|
||||
"operationIds": ["list_approvals", "get_approval", "get_approval_context", "request_approval", "decide_approval", "comment_on_approval"]
|
||||
"operationIds": [
|
||||
"list_approvals",
|
||||
"get_approval",
|
||||
"get_approval_context",
|
||||
"request_approval",
|
||||
"decide_approval",
|
||||
"comment_on_approval"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cases",
|
||||
"description": "Read and update authorized case facts and revisioned documents, author company workflow prompts, and durably hand off the primary task. list_cases and upsert_case remain scenario mocks.",
|
||||
"operationIds": ["list_cases", "upsert_case", "create_case", "read_case", "update_case", "list_workflows", "read_workflow", "create_workflow", "update_workflow", "handoff_case"]
|
||||
"operationIds": [
|
||||
"list_cases",
|
||||
"upsert_case",
|
||||
"create_case",
|
||||
"read_case",
|
||||
"update_case",
|
||||
"list_workflows",
|
||||
"read_workflow",
|
||||
"create_workflow",
|
||||
"update_workflow",
|
||||
"handoff_case"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "workspace_runtime",
|
||||
"description": "Inspect and select task workspaces, prepare repositories, and control workspace runtime services.",
|
||||
"operationIds": ["get_workspace_runtime", "control_workspace_service", "get_workspace", "list_workspaces", "select_workspace", "prepare_repository"]
|
||||
"operationIds": [
|
||||
"get_workspace_runtime",
|
||||
"control_workspace_service",
|
||||
"get_workspace",
|
||||
"list_workspaces",
|
||||
"select_workspace",
|
||||
"prepare_repository"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "wake_scheduling",
|
||||
"description": "Schedule a bounded continuation wake when the current task owns the future check.",
|
||||
"operationIds": ["schedule_wake", "set_task_monitor"]
|
||||
"operationIds": [
|
||||
"schedule_wake",
|
||||
"set_task_monitor"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "routines",
|
||||
"description": "Inspect or manage company routines.",
|
||||
"operationIds": ["list_routines", "manage_routine"]
|
||||
"operationIds": [
|
||||
"list_routines",
|
||||
"manage_routine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "company_skills",
|
||||
"description": "Create, update, or inspect company skills and synchronize the current agent's skills.",
|
||||
"operationIds": ["create_skill", "update_skill", "list_company_skills", "sync_company_skills"]
|
||||
"operationIds": [
|
||||
"create_skill",
|
||||
"update_skill",
|
||||
"list_company_skills",
|
||||
"sync_company_skills"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "secrets",
|
||||
"description": "Inspect secret metadata or use a brokered secret value without exposing plaintext evidence.",
|
||||
"operationIds": ["list_secret_metadata", "read_secret_value"]
|
||||
"operationIds": [
|
||||
"list_secret_metadata",
|
||||
"read_secret_value"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "portability_admin",
|
||||
"description": "Export portable company state; broad administration remains deferred until split into governed operations.",
|
||||
"operationIds": ["export_company", "administer_company"]
|
||||
"operationIds": [
|
||||
"export_company",
|
||||
"administer_company"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "test_escape_hatch",
|
||||
"description": "Controlled skill-test transport only; never product coverage.",
|
||||
"operationIds": ["generic_api_request"]
|
||||
"operationIds": [
|
||||
"generic_api_request"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "api_fallback",
|
||||
@@ -126,10 +188,23 @@
|
||||
"legacyGroup": 1,
|
||||
"name": "Heartbeat",
|
||||
"owner": "control plane + always tools",
|
||||
"operationIds": ["get_task_context", "set_task_title"],
|
||||
"controlPlaneOperationIds": ["select_work", "enforce_budget"],
|
||||
"operationIds": [
|
||||
"get_task_context",
|
||||
"set_task_title"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"select_work",
|
||||
"enforce_budget"
|
||||
],
|
||||
"realSurface": "agent identity, inbox-lite, heartbeat context, budget and active-issue services",
|
||||
"mockStateDomains": ["company", "actor", "wake", "task", "budget", "run"],
|
||||
"mockStateDomains": [
|
||||
"company",
|
||||
"actor",
|
||||
"wake",
|
||||
"task",
|
||||
"budget",
|
||||
"run"
|
||||
],
|
||||
"prpEvidence": "runner/session/run context plus bounded task-context tool results",
|
||||
"gap": "Production semantic binding is unbound; identity and work selection remain injected/control-plane-owned."
|
||||
},
|
||||
@@ -139,9 +214,17 @@
|
||||
"name": "Checkout",
|
||||
"owner": "control plane",
|
||||
"operationIds": [],
|
||||
"controlPlaneOperationIds": ["checkout_task"],
|
||||
"controlPlaneOperationIds": [
|
||||
"checkout_task"
|
||||
],
|
||||
"realSurface": "POST /api/issues/:id/checkout and execution-lock services",
|
||||
"mockStateDomains": ["task", "actor", "run", "idempotency", "fault"],
|
||||
"mockStateDomains": [
|
||||
"task",
|
||||
"actor",
|
||||
"run",
|
||||
"idempotency",
|
||||
"fault"
|
||||
],
|
||||
"prpEvidence": "run preparation and issue-status decision evidence with checkout receipt",
|
||||
"gap": "Intentionally no model tool; the production checkout receipt still needs the additive semantic-receipt envelope."
|
||||
},
|
||||
@@ -150,10 +233,25 @@
|
||||
"legacyGroup": 3,
|
||||
"name": "Status",
|
||||
"owner": "always tools + control-plane arbitration",
|
||||
"operationIds": ["answer_status_question", "finish_task", "block_task", "request_review"],
|
||||
"controlPlaneOperationIds": ["reconcile_run", "append_audit_record"],
|
||||
"operationIds": [
|
||||
"answer_status_question",
|
||||
"finish_task",
|
||||
"block_task",
|
||||
"request_review"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"reconcile_run",
|
||||
"append_audit_record"
|
||||
],
|
||||
"realSurface": "issue PATCH, review/liveness policy, and native finalization arbitration",
|
||||
"mockStateDomains": ["task", "comments", "interactions", "blockers", "audit", "run"],
|
||||
"mockStateDomains": [
|
||||
"task",
|
||||
"comments",
|
||||
"interactions",
|
||||
"blockers",
|
||||
"audit",
|
||||
"run"
|
||||
],
|
||||
"prpEvidence": "semantic operation receipt, work assessment, issue-status decision, and terminal causality",
|
||||
"gap": "Production semantic binding and additive typed operation/conflict receipts remain unimplemented."
|
||||
},
|
||||
@@ -162,10 +260,21 @@
|
||||
"legacyGroup": 4,
|
||||
"name": "Comments",
|
||||
"owner": "always tools",
|
||||
"operationIds": ["get_task_history", "report_progress"],
|
||||
"controlPlaneOperationIds": ["append_audit_record"],
|
||||
"operationIds": [
|
||||
"get_task_history",
|
||||
"report_progress"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"append_audit_record"
|
||||
],
|
||||
"realSurface": "issue comment list/get/create routes",
|
||||
"mockStateDomains": ["task", "comments", "actor", "idempotency", "audit"],
|
||||
"mockStateDomains": [
|
||||
"task",
|
||||
"comments",
|
||||
"actor",
|
||||
"idempotency",
|
||||
"audit"
|
||||
],
|
||||
"prpEvidence": "bounded read result or idempotent comment-write receipt plus audit reference",
|
||||
"gap": "Active-task binding is unbound; cross-task comment mutation is deliberately outside V1."
|
||||
},
|
||||
@@ -174,10 +283,23 @@
|
||||
"legacyGroup": 5,
|
||||
"name": "Search",
|
||||
"owner": "optional discovery tools",
|
||||
"operationIds": ["search_tasks", "list_agents", "get_agent", "list_projects", "list_goals", "list_project_repositories"],
|
||||
"operationIds": [
|
||||
"search_tasks",
|
||||
"list_agents",
|
||||
"get_agent",
|
||||
"list_projects",
|
||||
"list_goals",
|
||||
"list_project_repositories"
|
||||
],
|
||||
"controlPlaneOperationIds": [],
|
||||
"realSurface": "company issue search and agent/project/goal list/get routes",
|
||||
"mockStateDomains": ["company", "task", "actor", "project", "goal"],
|
||||
"mockStateDomains": [
|
||||
"company",
|
||||
"task",
|
||||
"actor",
|
||||
"project",
|
||||
"goal"
|
||||
],
|
||||
"prpEvidence": "bounded redacted read projections through tool-result item events",
|
||||
"gap": "Goal operations remain scenario-only. Project and repository discovery contracts are delivered by the live server authority; they are not implemented by the mock command dispatcher."
|
||||
},
|
||||
@@ -186,10 +308,24 @@
|
||||
"legacyGroup": 6,
|
||||
"name": "Subtasks",
|
||||
"owner": "optional delegation tools",
|
||||
"operationIds": ["create_task", "reassign_task", "hire_agent", "handoff_case"],
|
||||
"controlPlaneOperationIds": ["route_wake"],
|
||||
"operationIds": [
|
||||
"create_task",
|
||||
"reassign_task",
|
||||
"hire_agent",
|
||||
"handoff_case"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"route_wake"
|
||||
],
|
||||
"realSurface": "company issue create, child issue, guarded reassignment, and wake services",
|
||||
"mockStateDomains": ["company", "task", "actor", "blockers", "wake", "audit"],
|
||||
"mockStateDomains": [
|
||||
"company",
|
||||
"task",
|
||||
"actor",
|
||||
"blockers",
|
||||
"wake",
|
||||
"audit"
|
||||
],
|
||||
"prpEvidence": "company/task state diff, audit reference, and continuation wake evidence",
|
||||
"gap": "create_task is production-bound to ordinary active-issue child creation with assignment, dependency-ready wake, company checks, child limits, and durable source-scoped idempotency. handoff_case is live-only: the dedicated case service moves the same primary task after source execution settles, or records completion intent subject to ordinary completion gates; legacy scenarios do not claim that coverage."
|
||||
},
|
||||
@@ -198,10 +334,23 @@
|
||||
"legacyGroup": 7,
|
||||
"name": "Blockers",
|
||||
"owner": "always/optional tools + control plane",
|
||||
"operationIds": ["block_task", "set_dependencies"],
|
||||
"controlPlaneOperationIds": ["schedule_blocker_wake", "route_wake"],
|
||||
"operationIds": [
|
||||
"block_task",
|
||||
"set_dependencies"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"schedule_blocker_wake",
|
||||
"route_wake"
|
||||
],
|
||||
"realSurface": "issue relations, blocker projection, liveness validation, and blocker wake services",
|
||||
"mockStateDomains": ["task", "blockers", "wake", "actor", "audit", "fault"],
|
||||
"mockStateDomains": [
|
||||
"task",
|
||||
"blockers",
|
||||
"wake",
|
||||
"actor",
|
||||
"audit",
|
||||
"fault"
|
||||
],
|
||||
"prpEvidence": "dependency diff, block receipt, attention routing, and issue-status decision",
|
||||
"gap": "set_dependencies is production-bound for the active issue; block_task remains unbound, and cancelled-blocker receipts still need typed additive evidence."
|
||||
},
|
||||
@@ -210,10 +359,24 @@
|
||||
"legacyGroup": 8,
|
||||
"name": "Documents and plans",
|
||||
"owner": "always task-document tools; restore optional; destructive lifecycle control-plane-only",
|
||||
"operationIds": ["list_documents", "read_document", "list_document_revisions", "write_document"],
|
||||
"controlPlaneOperationIds": ["append_audit_record"],
|
||||
"operationIds": [
|
||||
"list_documents",
|
||||
"read_document",
|
||||
"list_document_revisions",
|
||||
"write_document"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"append_audit_record"
|
||||
],
|
||||
"realSurface": "issue document list/read/upsert/revision/restore/lock/unlock/delete routes",
|
||||
"mockStateDomains": ["task", "documents", "interactions", "idempotency", "audit", "fault"],
|
||||
"mockStateDomains": [
|
||||
"task",
|
||||
"documents",
|
||||
"interactions",
|
||||
"idempotency",
|
||||
"audit",
|
||||
"fault"
|
||||
],
|
||||
"prpEvidence": "bounded reads and revision-safe write/conflict/denial receipts with revision lineage",
|
||||
"gap": "restore_document_revision is an approved optional-tool gap; lock/unlock/delete are intentionally control-plane-only. Case kickoff initialDocuments become ordinary task documents in the same transaction. Case reads roll up authorized task document metadata; historical case-document REST storage remains readable without dedicated native document tools."
|
||||
},
|
||||
@@ -222,10 +385,21 @@
|
||||
"legacyGroup": 9,
|
||||
"name": "Interactions",
|
||||
"owner": "always tools + addressed resolver",
|
||||
"operationIds": ["request_human_input"],
|
||||
"controlPlaneOperationIds": ["route_wake"],
|
||||
"operationIds": [
|
||||
"request_human_input"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"route_wake"
|
||||
],
|
||||
"realSurface": "issue-thread interaction create/respond/accept/reject/withdraw services",
|
||||
"mockStateDomains": ["task", "documents", "interactions", "wake", "actor", "idempotency"],
|
||||
"mockStateDomains": [
|
||||
"task",
|
||||
"documents",
|
||||
"interactions",
|
||||
"wake",
|
||||
"actor",
|
||||
"idempotency"
|
||||
],
|
||||
"prpEvidence": "interaction proposal/materialization/response/delivery and attention events",
|
||||
"gap": "Production binding and semantic resolution receipts are unbound."
|
||||
},
|
||||
@@ -234,10 +408,28 @@
|
||||
"legacyGroup": 10,
|
||||
"name": "Approvals",
|
||||
"owner": "optional governance tools + governed approver",
|
||||
"operationIds": ["list_approvals", "get_approval", "get_approval_context", "request_approval", "decide_approval", "comment_on_approval"],
|
||||
"controlPlaneOperationIds": ["route_wake", "append_audit_record"],
|
||||
"operationIds": [
|
||||
"list_approvals",
|
||||
"get_approval",
|
||||
"get_approval_context",
|
||||
"request_approval",
|
||||
"decide_approval",
|
||||
"comment_on_approval"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"route_wake",
|
||||
"append_audit_record"
|
||||
],
|
||||
"realSurface": "company approval, decision, issue-link, comment, and governed-action services",
|
||||
"mockStateDomains": ["company", "task", "approvals", "actor", "wake", "audit", "idempotency"],
|
||||
"mockStateDomains": [
|
||||
"company",
|
||||
"task",
|
||||
"approvals",
|
||||
"actor",
|
||||
"wake",
|
||||
"audit",
|
||||
"idempotency"
|
||||
],
|
||||
"prpEvidence": "governed semantic receipts, audit references, and attention/continuation linkage",
|
||||
"gap": "Production binding and additive governed-action receipts are unbound; board-only authority stays outside grants."
|
||||
},
|
||||
@@ -246,10 +438,21 @@
|
||||
"legacyGroup": 11,
|
||||
"name": "Artifacts",
|
||||
"owner": "always tools + artifact/work-product services",
|
||||
"operationIds": ["register_deliverable"],
|
||||
"controlPlaneOperationIds": ["append_audit_record"],
|
||||
"operationIds": [
|
||||
"register_deliverable"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"append_audit_record"
|
||||
],
|
||||
"realSurface": "attachment upload and issue work-product routes",
|
||||
"mockStateDomains": ["task", "artifacts", "workProducts", "workspace", "audit", "idempotency"],
|
||||
"mockStateDomains": [
|
||||
"task",
|
||||
"artifacts",
|
||||
"workProducts",
|
||||
"workspace",
|
||||
"audit",
|
||||
"idempotency"
|
||||
],
|
||||
"prpEvidence": "artifact/work-product reference and durable inspectability receipt; never binary bytes",
|
||||
"gap": "Production upload/register composite and additive durable-reference receipt are unbound."
|
||||
},
|
||||
@@ -258,10 +461,33 @@
|
||||
"legacyGroup": 12,
|
||||
"name": "Errors and critical rules",
|
||||
"owner": "runner/control plane + optional workspace/wake tools",
|
||||
"operationIds": ["get_workspace_runtime", "control_workspace_service", "get_workspace", "list_workspaces", "select_workspace", "prepare_repository", "schedule_wake", "inspect_operation_result"],
|
||||
"controlPlaneOperationIds": ["release_task", "enforce_budget", "persist_run", "replay_run", "reconcile_run"],
|
||||
"operationIds": [
|
||||
"get_workspace_runtime",
|
||||
"control_workspace_service",
|
||||
"get_workspace",
|
||||
"list_workspaces",
|
||||
"select_workspace",
|
||||
"prepare_repository",
|
||||
"schedule_wake",
|
||||
"inspect_operation_result"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"release_task",
|
||||
"enforce_budget",
|
||||
"persist_run",
|
||||
"replay_run",
|
||||
"reconcile_run"
|
||||
],
|
||||
"realSurface": "workspace runtime, monitor/recovery, budget, run persistence/replay, release, and terminal services",
|
||||
"mockStateDomains": ["workspace", "budget", "run", "wake", "audit", "idempotency", "fault"],
|
||||
"mockStateDomains": [
|
||||
"workspace",
|
||||
"budget",
|
||||
"run",
|
||||
"wake",
|
||||
"audit",
|
||||
"idempotency",
|
||||
"fault"
|
||||
],
|
||||
"prpEvidence": "runtime/workspace/attention/run lifecycle, typed denials, replay facts, and terminal causality",
|
||||
"gap": "Budget stop reasons and semantic denial/conflict receipts require additive v1 envelopes; inspect_operation_result remains scenario-only. Task workspace inspection, discovery, selection and repository preparation use live authenticated service contracts; the legacy scenarios do not claim coverage for these operations."
|
||||
},
|
||||
@@ -270,10 +496,50 @@
|
||||
"legacyGroup": 13,
|
||||
"name": "Reference files",
|
||||
"owner": "always instruction tools + optional domain tools + test-only escape hatch",
|
||||
"operationIds": ["list_cases", "upsert_case", "create_case", "read_case", "update_case", "list_workflows", "read_workflow", "create_workflow", "update_workflow", "list_routines", "manage_routine", "create_skill", "update_skill", "list_company_skills", "sync_company_skills", "list_secret_metadata", "read_secret_value", "export_company", "administer_company", "generic_api_request", "search_api", "call_api", "create_project", "read_agent_instructions", "update_agent_instructions", "get_agent_instruction_history", "restore_agent_instructions", "submit_complaint", "submit_suggestion"],
|
||||
"controlPlaneOperationIds": ["append_audit_record"],
|
||||
"operationIds": [
|
||||
"list_cases",
|
||||
"upsert_case",
|
||||
"create_case",
|
||||
"read_case",
|
||||
"update_case",
|
||||
"list_workflows",
|
||||
"read_workflow",
|
||||
"create_workflow",
|
||||
"update_workflow",
|
||||
"list_routines",
|
||||
"manage_routine",
|
||||
"create_skill",
|
||||
"update_skill",
|
||||
"list_company_skills",
|
||||
"sync_company_skills",
|
||||
"list_secret_metadata",
|
||||
"read_secret_value",
|
||||
"export_company",
|
||||
"administer_company",
|
||||
"generic_api_request",
|
||||
"search_api",
|
||||
"call_api",
|
||||
"create_project",
|
||||
"read_agent_instructions",
|
||||
"update_agent_instructions",
|
||||
"get_agent_instruction_history",
|
||||
"restore_agent_instructions",
|
||||
"submit_complaint",
|
||||
"submit_suggestion"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"append_audit_record"
|
||||
],
|
||||
"realSurface": "agent instruction revisions, project, case, routine, company-skill, secret, portability, and administration services, and run-attributed agent commentary",
|
||||
"mockStateDomains": ["company", "cases", "routines", "skills", "secrets", "audit", "fault"],
|
||||
"mockStateDomains": [
|
||||
"company",
|
||||
"cases",
|
||||
"routines",
|
||||
"skills",
|
||||
"secrets",
|
||||
"audit",
|
||||
"fault"
|
||||
],
|
||||
"prpEvidence": "bounded domain projections, redacted broker receipts, company diffs, and audit references",
|
||||
"gap": "Instruction read/update/history/restore require the live canonical revision service, current responsible-user permissions, and pinned base revisions for writes. Their service, authority, and product E2E tests are separate from the legacy mock scenarios. Project and skill creation and API tools require the live server authority; generic_api_request is test-only. Workflow definition tools are live-only company-scoped prompt authoring and bounded retrieval under the Cases flag. create_case, read_case and update_case are live-only authorized case creation, projections and fact mutations; list_cases and upsert_case remain scenario mocks. Other domain operations remain scenario-only. Broad administer_company is deferred and cannot claim product coverage. Production API and paired dedicated-tool regressions are recorded separately in paperclip-evals/evals/runner-api-tools; the legacy scenario count is not evidence of that coverage. Feedback actions are live-only: shared persistence, authority, API, and actual Codex smoke tests cover them; the legacy scenario count does not claim feedback coverage."
|
||||
},
|
||||
@@ -282,10 +548,28 @@
|
||||
"legacyGroup": 14,
|
||||
"name": "Multi-hop",
|
||||
"owner": "composed semantic operations + control-plane continuation",
|
||||
"operationIds": ["create_task", "set_dependencies", "request_human_input", "request_approval", "register_deliverable"],
|
||||
"controlPlaneOperationIds": ["route_wake", "reconcile_run"],
|
||||
"operationIds": [
|
||||
"create_task",
|
||||
"set_dependencies",
|
||||
"request_human_input",
|
||||
"request_approval",
|
||||
"register_deliverable"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"route_wake",
|
||||
"reconcile_run"
|
||||
],
|
||||
"realSurface": "delegation, dependency, interaction, approval, artifact, and terminal orchestration services",
|
||||
"mockStateDomains": ["task", "blockers", "interactions", "approvals", "artifacts", "wake", "run", "audit"],
|
||||
"mockStateDomains": [
|
||||
"task",
|
||||
"blockers",
|
||||
"interactions",
|
||||
"approvals",
|
||||
"artifacts",
|
||||
"wake",
|
||||
"run",
|
||||
"audit"
|
||||
],
|
||||
"prpEvidence": "correlated operation receipts, state diffs, attention hops, work assessment, status decision, and terminal outcome",
|
||||
"gap": "No generic transaction tool is allowed; shared mock/real conformance must prove each composed effect."
|
||||
},
|
||||
@@ -294,10 +578,23 @@
|
||||
"legacyGroup": 15,
|
||||
"name": "Restraint and no-call",
|
||||
"owner": "policy/exposure layer",
|
||||
"operationIds": ["answer_status_question", "read_secret_value", "generic_api_request"],
|
||||
"controlPlaneOperationIds": ["enforce_budget"],
|
||||
"operationIds": [
|
||||
"answer_status_question",
|
||||
"read_secret_value",
|
||||
"generic_api_request"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"enforce_budget"
|
||||
],
|
||||
"realSurface": "task-mode, secret-broker, test-scope, pause, and budget policy checks",
|
||||
"mockStateDomains": ["actor", "task", "budget", "secrets", "audit", "fault"],
|
||||
"mockStateDomains": [
|
||||
"actor",
|
||||
"task",
|
||||
"budget",
|
||||
"secrets",
|
||||
"audit",
|
||||
"fault"
|
||||
],
|
||||
"prpEvidence": "absence of forbidden effects plus typed policy denial/redaction receipts when a call is attempted",
|
||||
"gap": "Typed redaction/authorization receipts need additive v1 evidence; generic_api_request is never a product fallback."
|
||||
},
|
||||
@@ -306,10 +603,26 @@
|
||||
"legacyGroup": 16,
|
||||
"name": "Wake situations",
|
||||
"owner": "control plane + always context/history tools",
|
||||
"operationIds": ["get_task_context", "get_task_history", "schedule_wake", "set_task_monitor"],
|
||||
"controlPlaneOperationIds": ["select_work", "route_wake"],
|
||||
"operationIds": [
|
||||
"get_task_context",
|
||||
"get_task_history",
|
||||
"schedule_wake",
|
||||
"set_task_monitor"
|
||||
],
|
||||
"controlPlaneOperationIds": [
|
||||
"select_work",
|
||||
"route_wake"
|
||||
],
|
||||
"realSurface": "wakeup requests, heartbeat context, comment/interaction/approval/blocker wake routing, and scheduled wake services",
|
||||
"mockStateDomains": ["wake", "task", "comments", "interactions", "approvals", "blockers", "run"],
|
||||
"mockStateDomains": [
|
||||
"wake",
|
||||
"task",
|
||||
"comments",
|
||||
"interactions",
|
||||
"approvals",
|
||||
"blockers",
|
||||
"run"
|
||||
],
|
||||
"prpEvidence": "attention request routing/resolution plus resumed session/run causality",
|
||||
"gap": "set_task_monitor binds the one-shot monitor scheduler in production; schedule_wake remains mock-backed. Control-plane routing remains non-callable."
|
||||
}
|
||||
@@ -350,28 +663,150 @@
|
||||
"Locked-document fallback may create a deterministic new key only when lockedDocumentStrategy is create_new_document; the source stays locked and the returned receipt names the redirected key."
|
||||
],
|
||||
"operations": [
|
||||
{"action": "create", "semanticOperation": "write_document", "placement": "always_agent_tool", "contract": "baseRevisionId is null; create revision 1 and return document/revision/audit identity.", "status": "supported contract; production binding unbound"},
|
||||
{"action": "read", "semanticOperation": "list_documents / read_document", "placement": "always_agent_tool", "contract": "List metadata or read the current active-task document by stable key.", "status": "supported contract; production binding unbound"},
|
||||
{"action": "update", "semanticOperation": "write_document", "placement": "always_agent_tool", "contract": "Require the exact latest baseRevisionId and an idempotency key; append an immutable revision.", "status": "supported contract; production binding unbound"},
|
||||
{"action": "revisions", "semanticOperation": "list_document_revisions", "placement": "always_agent_tool", "contract": "Return bounded immutable revision history newest first.", "status": "supported contract; production binding unbound"},
|
||||
{"action": "restore", "semanticOperation": "restore_document_revision", "placement": "optional_agent_tool (documents:restore)", "contract": "Validate same-document lineage, reject locked documents, append a new revision, and return source/new revision identity; restoring current is a no-change duplicate.", "status": "approved catalog gap"},
|
||||
{"action": "lock", "semanticOperation": "none", "placement": "control_plane_owned", "contract": "Board/administrative lifecycle action; agent writes receive document_locked or use explicit create-new fallback.", "status": "intentionally non-callable"},
|
||||
{"action": "unlock", "semanticOperation": "none", "placement": "control_plane_owned", "contract": "Board/administrative lifecycle action; never inferred from a failed write.", "status": "intentionally non-callable"},
|
||||
{"action": "delete", "semanticOperation": "none", "placement": "control_plane_owned", "contract": "Destructive audited action; pending targets become stale and the runner never recreates them automatically.", "status": "intentionally non-callable"}
|
||||
{
|
||||
"action": "create",
|
||||
"semanticOperation": "write_document",
|
||||
"placement": "always_agent_tool",
|
||||
"contract": "baseRevisionId is null; create revision 1 and return document/revision/audit identity.",
|
||||
"status": "supported contract; production binding unbound"
|
||||
},
|
||||
{
|
||||
"action": "read",
|
||||
"semanticOperation": "list_documents / read_document",
|
||||
"placement": "always_agent_tool",
|
||||
"contract": "List metadata or read the current active-task document by stable key.",
|
||||
"status": "supported contract; production binding unbound"
|
||||
},
|
||||
{
|
||||
"action": "update",
|
||||
"semanticOperation": "write_document",
|
||||
"placement": "always_agent_tool",
|
||||
"contract": "Require the exact latest baseRevisionId and an idempotency key; append an immutable revision.",
|
||||
"status": "supported contract; production binding unbound"
|
||||
},
|
||||
{
|
||||
"action": "revisions",
|
||||
"semanticOperation": "list_document_revisions",
|
||||
"placement": "always_agent_tool",
|
||||
"contract": "Return bounded immutable revision history newest first.",
|
||||
"status": "supported contract; production binding unbound"
|
||||
},
|
||||
{
|
||||
"action": "restore",
|
||||
"semanticOperation": "restore_document_revision",
|
||||
"placement": "optional_agent_tool (documents:restore)",
|
||||
"contract": "Validate same-document lineage, reject locked documents, append a new revision, and return source/new revision identity; restoring current is a no-change duplicate.",
|
||||
"status": "approved catalog gap"
|
||||
},
|
||||
{
|
||||
"action": "lock",
|
||||
"semanticOperation": "none",
|
||||
"placement": "control_plane_owned",
|
||||
"contract": "Board/administrative lifecycle action; agent writes receive document_locked or use explicit create-new fallback.",
|
||||
"status": "intentionally non-callable"
|
||||
},
|
||||
{
|
||||
"action": "unlock",
|
||||
"semanticOperation": "none",
|
||||
"placement": "control_plane_owned",
|
||||
"contract": "Board/administrative lifecycle action; never inferred from a failed write.",
|
||||
"status": "intentionally non-callable"
|
||||
},
|
||||
{
|
||||
"action": "delete",
|
||||
"semanticOperation": "none",
|
||||
"placement": "control_plane_owned",
|
||||
"contract": "Destructive audited action; pending targets become stale and the runner never recreates them automatically.",
|
||||
"status": "intentionally non-callable"
|
||||
}
|
||||
]
|
||||
},
|
||||
"legacySemanticTargetDispositions": {
|
||||
"injected_actor_context": {"kind": "control_plane", "targets": ["select_work"], "reason": "Identity is launch context, not a model tool."},
|
||||
"runner_work_selection": {"kind": "control_plane", "targets": ["select_work"], "reason": "Inbox selection belongs to the control plane."},
|
||||
"get_project": {"kind": "folded", "targets": ["list_projects"], "reason": "The bounded discovery operation owns project list/get projection in V1."},
|
||||
"wait_for_workspace_service": {"kind": "folded", "targets": ["control_workspace_service"], "reason": "Wait is a bounded action of workspace service control."},
|
||||
"get_goal": {"kind": "folded", "targets": ["list_goals"], "reason": "The bounded discovery operation owns goal list/get projection in V1."},
|
||||
"semantic_task_disposition": {"kind": "composite", "targets": ["answer_status_question", "finish_task", "block_task", "request_review"], "reason": "Generic issue PATCH is replaced by intent-specific terminal/status operations."},
|
||||
"atomic_checkout": {"kind": "control_plane", "targets": ["checkout_task"], "reason": "Checkout is an atomic control-plane transaction."},
|
||||
"runtime_release": {"kind": "control_plane", "targets": ["release_task"], "reason": "Release is runner/control-plane cleanup."},
|
||||
"restore_document_revision": {"kind": "known_gap", "targets": [], "reason": "Approved optional documents:restore operation is not yet in the canonical catalog."},
|
||||
"link_approval": {"kind": "folded", "targets": ["request_approval", "get_task_context"], "reason": "Issue linkage is part of approval request/context composites."},
|
||||
"unlink_approval": {"kind": "control_plane", "targets": ["append_audit_record"], "reason": "No standalone agent unlink tool is approved in V1."},
|
||||
"test_only_api_escape_hatch": {"kind": "folded", "targets": ["generic_api_request"], "reason": "Compatibility alias for the test-only escape hatch."}
|
||||
"injected_actor_context": {
|
||||
"kind": "control_plane",
|
||||
"targets": [
|
||||
"select_work"
|
||||
],
|
||||
"reason": "Identity is launch context, not a model tool."
|
||||
},
|
||||
"runner_work_selection": {
|
||||
"kind": "control_plane",
|
||||
"targets": [
|
||||
"select_work"
|
||||
],
|
||||
"reason": "Inbox selection belongs to the control plane."
|
||||
},
|
||||
"get_project": {
|
||||
"kind": "folded",
|
||||
"targets": [
|
||||
"list_projects"
|
||||
],
|
||||
"reason": "The bounded discovery operation owns project list/get projection in V1."
|
||||
},
|
||||
"wait_for_workspace_service": {
|
||||
"kind": "folded",
|
||||
"targets": [
|
||||
"control_workspace_service"
|
||||
],
|
||||
"reason": "Wait is a bounded action of workspace service control."
|
||||
},
|
||||
"get_goal": {
|
||||
"kind": "folded",
|
||||
"targets": [
|
||||
"list_goals"
|
||||
],
|
||||
"reason": "The bounded discovery operation owns goal list/get projection in V1."
|
||||
},
|
||||
"semantic_task_disposition": {
|
||||
"kind": "composite",
|
||||
"targets": [
|
||||
"answer_status_question",
|
||||
"finish_task",
|
||||
"block_task",
|
||||
"request_review"
|
||||
],
|
||||
"reason": "Generic issue PATCH is replaced by intent-specific terminal/status operations."
|
||||
},
|
||||
"atomic_checkout": {
|
||||
"kind": "control_plane",
|
||||
"targets": [
|
||||
"checkout_task"
|
||||
],
|
||||
"reason": "Checkout is an atomic control-plane transaction."
|
||||
},
|
||||
"runtime_release": {
|
||||
"kind": "control_plane",
|
||||
"targets": [
|
||||
"release_task"
|
||||
],
|
||||
"reason": "Release is runner/control-plane cleanup."
|
||||
},
|
||||
"restore_document_revision": {
|
||||
"kind": "known_gap",
|
||||
"targets": [],
|
||||
"reason": "Approved optional documents:restore operation is not yet in the canonical catalog."
|
||||
},
|
||||
"link_approval": {
|
||||
"kind": "folded",
|
||||
"targets": [
|
||||
"request_approval",
|
||||
"get_task_context"
|
||||
],
|
||||
"reason": "Issue linkage is part of approval request/context composites."
|
||||
},
|
||||
"unlink_approval": {
|
||||
"kind": "control_plane",
|
||||
"targets": [
|
||||
"append_audit_record"
|
||||
],
|
||||
"reason": "No standalone agent unlink tool is approved in V1."
|
||||
},
|
||||
"test_only_api_escape_hatch": {
|
||||
"kind": "folded",
|
||||
"targets": [
|
||||
"generic_api_request"
|
||||
],
|
||||
"reason": "Compatibility alias for the test-only escape hatch."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ Status: canonical explanatory contract for the Paperclip runner V1 surface.
|
||||
|
||||
This document keeps three independent meanings of **group** separate. PRP families describe wire evidence and controller commands; capability placement decides who owns an operation; behavioral eval groups organize the 106 scenario corpus. None of the three axes can be used as a substitute for another.
|
||||
|
||||
The generated totals are **106 PRP events in 32 event families**, **18 controller commands in 7 command families**, **10 control-plane operations**, **69 reconciled semantic operations** (18 always, 51 optional), and **106 scenarios in 16 behavior groups**.
|
||||
The generated totals are **107 PRP events in 32 event families**, **18 controller commands in 7 command families**, **10 control-plane operations**, **69 reconciled semantic operations** (18 always, 51 optional), and **106 scenarios in 16 behavior groups**.
|
||||
|
||||
## Axis 1: PRP v1 event and command families
|
||||
|
||||
@@ -17,7 +17,7 @@ PRP records ordered, replayable execution evidence. It is not the model's Paperc
|
||||
| Family | Purpose | Events | Count |
|
||||
| --- | --- | --- | ---: |
|
||||
| `runner` | Runner connection, drain, and diagnostic lifecycle. | `runner.connected`<br>`runner.reconnected`<br>`runner.reconciled`<br>`runner.disconnected`<br>`runner.draining`<br>`runner.backpressure`<br>`runner.suspending`<br>`runner.suspended`<br>`runner.stopped`<br>`runner.diagnostic` | 10 |
|
||||
| `runtime` | Runner phase transitions. | `runtime.phase.changed` | 1 |
|
||||
| `runtime` | Runner phase transitions and run-scoped reported activity. | `runtime.phase.changed`<br>`runtime.activity.recorded` | 2 |
|
||||
| `sandbox` | Sandbox resource measurements. | `sandbox.metric` | 1 |
|
||||
| `workspace` | Workspace readiness. | `workspace.ready`<br>`workspace.change.updated`<br>`workspace.diff.recorded`<br>`workspace.file.referenced` | 4 |
|
||||
| `auth` | Content-free harness credential changes observed by the runner. | `auth.credentials.updated` | 1 |
|
||||
|
||||
@@ -656,6 +656,10 @@ describe("native backend factory", () => {
|
||||
|
||||
it.each([
|
||||
["cursor", "../../test/fixtures/cursor-acp/profile-v7-identity.json"],
|
||||
["copilot", "../../test/fixtures/copilot-profile-v74-identity.json"],
|
||||
["copilot", "../../test/fixtures/copilot-profile-v75-identity.json"],
|
||||
["copilot", "../../test/fixtures/copilot-profile-v76-identity.json"],
|
||||
["copilot", "../../test/fixtures/copilot-profile-v77-identity.json"],
|
||||
["cursor", "../../test/fixtures/cursor-acp/profile-v10-identity.json"],
|
||||
["copilot", "../../test/fixtures/copilot-profile-v14-identity.json"],
|
||||
["copilot", "../../test/fixtures/copilot-profile-v60-identity.json"],
|
||||
|
||||
@@ -68,7 +68,9 @@ describe("canonical operation-groups specification", () => {
|
||||
expect(input.source.behaviorGroups).toHaveLength(16);
|
||||
expect(input.scenarios).toHaveLength(106);
|
||||
expect(new Set(input.scenarios.map((scenario) => scenario.id)).size).toBe(106);
|
||||
expect(input.eventTypes).toHaveLength(106);
|
||||
expect(input.eventTypes).toHaveLength(107);
|
||||
expect(input.eventTypes).toContain("runtime.activity.recorded");
|
||||
expect(input.source.prpEventFamilyDescriptions.runtime).toBe("Runner phase transitions and run-scoped reported activity.");
|
||||
expect(input.commandTypes).toHaveLength(18);
|
||||
});
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ export interface OperationGroupsInput {
|
||||
catalogIndexSource: string;
|
||||
}
|
||||
|
||||
const EXPECTED_EVENT_COUNT = 106;
|
||||
const EXPECTED_EVENT_COUNT = 107;
|
||||
const EXPECTED_COMMAND_COUNT = 18;
|
||||
const EXPECTED_SCENARIO_COUNT = 106;
|
||||
const EXPECTED_BEHAVIOR_GROUP_COUNT = 16;
|
||||
|
||||
@@ -87,9 +87,18 @@ vi.mock("./installation-integrity.js", () => ({ verifyNativeAcpxInstallation: vi
|
||||
|
||||
describe("Copilot build-owned installation", () => {
|
||||
it("admits the current profile with environment launch preparation", () => {
|
||||
expect(QUALIFIED_ACPX_PROFILES.copilot.agentProfileVersion).toBe(74);
|
||||
expect(QUALIFIED_ACPX_PROFILES.copilot.agentProfileVersion).toBe(78);
|
||||
expect(QUALIFIED_ACPX_PROFILES.copilot.qualificationStatus).toBeUndefined();
|
||||
expect(QUALIFIED_ACPX_PROFILES.copilot.commandDigest).toBe("sha256:c3e059a6c68afa2216f0315d85be084126c91d9bdbe21c2e65790fb2fc577fcd");
|
||||
expect(QUALIFIED_ACPX_PROFILES.copilot.commandDigest).toBe("sha256:f7e7cff356db4b1b37458bd62fd76e9d81aa1cc46795e54b168755fb68bcee8c");
|
||||
});
|
||||
|
||||
it("retains the published profile 75 fixture while advancing the event contract", async () => {
|
||||
const bytes = readFileSync(new URL("../../../test/fixtures/copilot-profile-v75-identity.json", import.meta.url));
|
||||
expect(createHash("sha256").update(bytes).digest("hex")).toBe("4178dad6cf43a6026c85f45a0606f30c72570549d517e49f705dbf8f9f41650b");
|
||||
expect(isSupportedAcpxProfileVersion("copilot", 75)).toBe(true);
|
||||
const prior = JSON.parse(bytes.toString("utf8"));
|
||||
await expect(verifyCopilotInstallation({ ...QUALIFIED_ACPX_PROFILES.copilot,
|
||||
agentProfileVersion: 75, commandDigest: prior.commandDigest })).rejects.toThrow("exact pinned");
|
||||
});
|
||||
|
||||
it("preserves v70 while binding historical Grok recovery decoding in v71", async () => {
|
||||
|
||||
@@ -48,12 +48,12 @@ export const QUALIFIED_ACPX_PROFILE_DATA = {
|
||||
"protocolVersion": 1,
|
||||
"acpxVersion": "0.13.1",
|
||||
"agent": "copilot",
|
||||
"agentProfileVersion": 74,
|
||||
"agentProfileVersion": 78,
|
||||
"agentServerPackage": "@github/copilot",
|
||||
"agentServerVersion": "1.0.88",
|
||||
"agentRuntimePackage": null,
|
||||
"agentRuntimeVersion": null,
|
||||
"commandDigest": "sha256:c3e059a6c68afa2216f0315d85be084126c91d9bdbe21c2e65790fb2fc577fcd",
|
||||
"commandDigest": "sha256:f7e7cff356db4b1b37458bd62fd76e9d81aa1cc46795e54b168755fb68bcee8c",
|
||||
"permissionPolicy": "interactive"
|
||||
},
|
||||
"claude": {
|
||||
|
||||
@@ -2,13 +2,13 @@ import { QUALIFIED_ACPX_PROFILE_DATA } from "./generated-profiles.js";
|
||||
|
||||
/** Decodable historical profile revisions, not permission to launch them.
|
||||
* Exact current profile/package/digest admission is checked separately. */
|
||||
type HistoricalAcpxProfileVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73;
|
||||
type HistoricalAcpxProfileVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77;
|
||||
type CurrentAcpxProfileVersion = typeof QUALIFIED_ACPX_PROFILE_DATA[keyof typeof QUALIFIED_ACPX_PROFILE_DATA]["agentProfileVersion"];
|
||||
export type AcpxProfileVersion = HistoricalAcpxProfileVersion | CurrentAcpxProfileVersion;
|
||||
|
||||
const historicalVersions: Readonly<Record<string, readonly HistoricalAcpxProfileVersion[]>> = {
|
||||
pi: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], claude: [1, 2, 3, 4, 5], codex: [1, 2, 3, 4, 5],
|
||||
grok: [1, 2, 3, 4, 5, 6, 7, 8, 9], copilot: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73],
|
||||
grok: [1, 2, 3, 4, 5, 6, 7, 8, 9], copilot: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77],
|
||||
cursor: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
|
||||
};
|
||||
|
||||
|
||||
@@ -27,6 +27,10 @@ afterEach(async () => {
|
||||
|
||||
describe("ACPX recovery identity", () => {
|
||||
it.each([
|
||||
["copilot", "../../../test/fixtures/copilot-profile-v74-identity.json"],
|
||||
["copilot", "../../../test/fixtures/copilot-profile-v75-identity.json"],
|
||||
["copilot", "../../../test/fixtures/copilot-profile-v76-identity.json"],
|
||||
["copilot", "../../../test/fixtures/copilot-profile-v77-identity.json"],
|
||||
["cursor", "../../../test/fixtures/cursor-acp/profile-v10-identity.json"],
|
||||
["copilot", "../../../test/fixtures/copilot-profile-v14-identity.json"],
|
||||
["pi", "../../../test-fixtures/pi-acp/profile-v13-identity.json"],
|
||||
|
||||
@@ -4705,6 +4705,7 @@ export const eventSchema = {
|
||||
"workspace.diff.recorded",
|
||||
"workspace.file.referenced",
|
||||
"auth.credentials.updated",
|
||||
"runtime.activity.recorded",
|
||||
"harness.starting",
|
||||
"harness.ready",
|
||||
"harness.exited",
|
||||
@@ -5342,6 +5343,47 @@ export const eventSchema = {
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"eventType": {
|
||||
"const": "runtime.activity.recorded"
|
||||
}
|
||||
}
|
||||
},
|
||||
"then": {
|
||||
"properties": {
|
||||
"sourceKind": {
|
||||
"const": "runner"
|
||||
},
|
||||
"priority": {
|
||||
"const": 1
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"namespace",
|
||||
"activityKey"
|
||||
],
|
||||
"properties": {
|
||||
"namespace": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
},
|
||||
"activityKey": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"additionalProperties": true
|
||||
@@ -5428,6 +5470,7 @@ export const eventV2Schema = {
|
||||
"workspace.diff.recorded",
|
||||
"workspace.file.referenced",
|
||||
"auth.credentials.updated",
|
||||
"runtime.activity.recorded",
|
||||
"harness.starting",
|
||||
"harness.ready",
|
||||
"harness.exited",
|
||||
@@ -5634,6 +5677,47 @@ export const eventV2Schema = {
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"eventType": {
|
||||
"const": "runtime.activity.recorded"
|
||||
}
|
||||
}
|
||||
},
|
||||
"then": {
|
||||
"properties": {
|
||||
"sourceKind": {
|
||||
"const": "runner"
|
||||
},
|
||||
"priority": {
|
||||
"const": 1
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"namespace",
|
||||
"activityKey"
|
||||
],
|
||||
"properties": {
|
||||
"namespace": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
},
|
||||
"activityKey": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"additionalProperties": true
|
||||
@@ -5814,7 +5898,8 @@ export const eventV3Schema = {
|
||||
"external_provider.dispatch_requested",
|
||||
"external_provider.operation_settled",
|
||||
"external_provider.input_available",
|
||||
"auth.credentials.updated"
|
||||
"auth.credentials.updated",
|
||||
"runtime.activity.recorded"
|
||||
]
|
||||
},
|
||||
"schemaVersion": {
|
||||
@@ -6330,6 +6415,47 @@ export const eventV3Schema = {
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"eventType": {
|
||||
"const": "runtime.activity.recorded"
|
||||
}
|
||||
}
|
||||
},
|
||||
"then": {
|
||||
"properties": {
|
||||
"sourceKind": {
|
||||
"const": "runner"
|
||||
},
|
||||
"priority": {
|
||||
"const": 1
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"namespace",
|
||||
"activityKey"
|
||||
],
|
||||
"properties": {
|
||||
"namespace": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
},
|
||||
"activityKey": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160,
|
||||
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"additionalProperties": true
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
import equalModule from "ajv/dist/runtime/equal.js";
|
||||
import ucs2LengthModule from "ajv/dist/runtime/ucs2length.js";
|
||||
|
||||
"use strict";export const authCredentialsValidator: unknown = validate20;const schema31 = {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://paperclip.dev/schemas/prp/v1/auth-credentials.schema.json","title":"PRP credential update notification","description":"Content-free evidence of changed credentials for the harness-auth binding in this normalized session. Credential-store detection does not prove an OAuth refresh succeeded.","type":"object","required":["schema","provider","bindingId","revision","detection"],"properties":{"schema":{"const":"paperclip.auth.credentials.updated.v1"},"provider":{"type":"string","minLength":1,"maxLength":160,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"bindingId":{"type":"string","minLength":1,"maxLength":160,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"revision":{"type":"integer","minimum":1,"maximum":9007199254740991},"detection":{"enum":["credential_store","native_hook"]}},"additionalProperties":false};const func1 = typeof ucs2LengthModule === "function" ? ucs2LengthModule : ucs2LengthModule.default;const pattern4 = new RegExp("^[A-Za-z0-9][A-Za-z0-9._:-]*$", "u");function validate20(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){/*# sourceURL="https://paperclip.dev/schemas/prp/v1/auth-credentials.schema.json" */;let vErrors = null;let errors = 0;const evaluated0 = validate20.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.schema === undefined){const err0 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(data.provider === undefined){const err1 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "provider"},message:"must have required property '"+"provider"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}if(data.bindingId === undefined){const err2 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "bindingId"},message:"must have required property '"+"bindingId"+"'"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}if(data.revision === undefined){const err3 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "revision"},message:"must have required property '"+"revision"+"'"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}if(data.detection === undefined){const err4 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "detection"},message:"must have required property '"+"detection"+"'"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}for(const key0 in data){if(!(((((key0 === "schema") || (key0 === "provider")) || (key0 === "bindingId")) || (key0 === "revision")) || (key0 === "detection"))){const err5 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data.schema !== undefined){if("paperclip.auth.credentials.updated.v1" !== data.schema){const err6 = {instancePath:instancePath+"/schema",schemaPath:"#/properties/schema/const",keyword:"const",params:{allowedValue: "paperclip.auth.credentials.updated.v1"},message:"must be equal to constant"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data.provider !== undefined){let data1 = data.provider;if(typeof data1 === "string"){if(func1(data1) > 160){const err7 = {instancePath:instancePath+"/provider",schemaPath:"#/properties/provider/maxLength",keyword:"maxLength",params:{limit: 160},message:"must NOT have more than 160 characters"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}if(func1(data1) < 1){const err8 = {instancePath:instancePath+"/provider",schemaPath:"#/properties/provider/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}if(!pattern4.test(data1)){const err9 = {instancePath:instancePath+"/provider",schemaPath:"#/properties/provider/pattern",keyword:"pattern",params:{pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]*$"},message:"must match pattern \""+"^[A-Za-z0-9][A-Za-z0-9._:-]*$"+"\""};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}else {const err10 = {instancePath:instancePath+"/provider",schemaPath:"#/properties/provider/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}if(data.bindingId !== undefined){let data2 = data.binLine truncated
|
||||
"use strict";export const authCredentialsValidator: unknown = validate20;const schema31 = {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://paperclip.dev/schemas/prp/v1/auth-credentials.schema.json","title":"PRP credential update notification","description":"Content-free evidence of changed credentials for the harness-auth binding in this normalized session. Credential-store detection does not prove an OAuth refresh succeeded.","type":"object","required":["schema","provider","bindingId","revision","detection"],"properties":{"schema":{"const":"paperclip.auth.credentials.updated.v1"},"provider":{"type":"string","minLength":1,"maxLength":160,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"bindingId":{"type":"string","minLength":1,"maxLength":160,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"revision":{"type":"integer","minimum":1,"maximum":9007199254740991},"detection":{"enum":["credential_store","native_hook"]}},"additionalProperties":false};const func1 = typeof ucs2LengthModule === "function" ? ucs2LengthModule : ucs2LengthModule.default;const pattern4 = new RegExp("^[A-Za-z0-9][A-Za-z0-9._:-]*$", "u");function validate20(data, {instancePath="", parentData, parentDataProperty, rootData=data, dynamicAnchors={}}={}){/*# sourceURL="https://paperclip.dev/schemas/prp/v1/auth-credentials.schema.json" */;let vErrors = null;let errors = 0;const evaluated0 = validate20.evaluated;if(evaluated0.dynamicProps){evaluated0.props = undefined;}if(evaluated0.dynamicItems){evaluated0.items = undefined;}if(data && typeof data == "object" && !Array.isArray(data)){if(data.schema === undefined){const err0 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "schema"},message:"must have required property '"+"schema"+"'"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(data.provider === undefined){const err1 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "provider"},message:"must have required property '"+"provider"+"'"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}if(data.bindingId === undefined){const err2 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "bindingId"},message:"must have required property '"+"bindingId"+"'"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}if(data.revision === undefined){const err3 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "revision"},message:"must have required property '"+"revision"+"'"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;}if(data.detection === undefined){const err4 = {instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: "detection"},message:"must have required property '"+"detection"+"'"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}for(const key0 in data){if(!(((((key0 === "schema") || (key0 === "provider")) || (key0 === "bindingId")) || (key0 === "revision")) || (key0 === "detection"))){const err5 = {instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}if(data.schema !== undefined){if("paperclip.auth.credentials.updated.v1" !== data.schema){const err6 = {instancePath:instancePath+"/schema",schemaPath:"#/properties/schema/const",keyword:"const",params:{allowedValue: "paperclip.auth.credentials.updated.v1"},message:"must be equal to constant"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}}if(data.provider !== undefined){let data1 = data.provider;if(typeof data1 === "string"){if(func1(data1) > 160){const err7 = {instancePath:instancePath+"/provider",schemaPath:"#/properties/provider/maxLength",keyword:"maxLength",params:{limit: 160},message:"must NOT have more than 160 characters"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;}if(func1(data1) < 1){const err8 = {instancePath:instancePath+"/provider",schemaPath:"#/properties/provider/minLength",keyword:"minLength",params:{limit: 1},message:"must NOT have fewer than 1 characters"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}if(!pattern4.test(data1)){const err9 = {instancePath:instancePath+"/provider",schemaPath:"#/properties/provider/pattern",keyword:"pattern",params:{pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]*$"},message:"must match pattern \""+"^[A-Za-z0-9][A-Za-z0-9._:-]*$"+"\""};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}else {const err10 = {instancePath:instancePath+"/provider",schemaPath:"#/properties/provider/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}}if(data.bindingId !== undefined){let data2 = data.binLine truncated
|
||||
@@ -0,0 +1,30 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { validatePrpEvent, type PrpEvent } from "./replay-contract.js";
|
||||
|
||||
function event(version: 1 | 2 | 3, activityKey: string): PrpEvent {
|
||||
return {
|
||||
schema: `paperclip.prp.event.v${version}`, schemaVersion: version,
|
||||
sourceEventId: "activity-1", sourceSeq: 1, sourceInstanceId: "runner", sourceKind: "runner",
|
||||
runId: "run", normalizedSessionId: "session", eventType: "runtime.activity.recorded", priority: 1,
|
||||
emittedAt: "2099-01-01T00:00:00.000Z", payload: { namespace: "example.runtime", activityKey },
|
||||
};
|
||||
}
|
||||
|
||||
describe.each([1, 2, 3] as const)("PRP v%s runtime activity identifiers", version => {
|
||||
it("counts Unicode code points and excludes only ASCII controls", () => {
|
||||
for (const value of ["视".repeat(60), "😀".repeat(160), "view-0", "\u0085"]) {
|
||||
expect(validatePrpEvent(event(version, value)).ok).toBe(true);
|
||||
}
|
||||
for (const value of ["😀".repeat(161), "", "\u001f", "\u007f"]) {
|
||||
expect(validatePrpEvent(event(version, value)).ok).toBe(false);
|
||||
}
|
||||
});
|
||||
it("keeps activity payload independent of UI and caller-supplied attribution", () => {
|
||||
for (const payload of [
|
||||
{ pluginKey: "example.plugin", slotId: "panel" },
|
||||
{ namespace: "example.runtime", activityKey: "desktop.used", runId: "other-run" },
|
||||
{ namespace: "example.runtime", activityKey: "desktop.used", agentId: "other-agent" },
|
||||
{ namespace: "example.runtime", activityKey: "desktop.used", issueId: "other-task" },
|
||||
]) expect(validatePrpEvent({ ...event(version, "desktop.used"), payload }).ok).toBe(false);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"commandDigest": "sha256:b7448f79ddca7d4177f0b2094dd3ec211057ee991ae31f3a1f4681bad69ec6e6",
|
||||
"declaration": {
|
||||
"schema": "paperclip.acpx_profile_declaration.v1",
|
||||
"agent": "copilot",
|
||||
"agentProfileVersion": 75,
|
||||
"acpxVersion": "0.13.1",
|
||||
"agentServerVersion": "1.0.88",
|
||||
"protocolPolicyRevision": "copilot-agent-manual-v1",
|
||||
"acpxPatchSha256": "00d6af17216cb0cad902b48633eb19bf0ec6b05837a984cb24661fca593f09c1",
|
||||
"policySha256": "a4be69be43db84052560420a3ca546a665c9165573c24d543eb33d144ba138a3",
|
||||
"distributionSourceSha256": "c0a65e247fc47b263bd369a3d5ab505c4b323d4e6493be8a9ecbeb0e9dbb9107",
|
||||
"agentFilesBinding": "registered-runtime-context-v1",
|
||||
"systemInstructionDelivery": "COPILOT_HOME/copilot-instructions.md:replace-under-lifetime-lease-before-launch:v1",
|
||||
"sharedRuntimeContract": "paperclip.acpx-runtime-contract.v1",
|
||||
"innerDistributionSourceSha256": "9bb08347eed01f1ab44e065c8b06ead9be3a25973d6e6329dc4c0a099096279a",
|
||||
"upstreamAppSha256": "7b48282a19b5b0814a0c96ad5e3a125173d792cc55f9525b2effea962f6063c0",
|
||||
"patchedAppSha256": "61f8eebe0c30cc03b311c6818b2acb158a6d16ca58c8bfac5ebd42db095c2679",
|
||||
"messageIdentityContract": "copilot-native-message-id-v1",
|
||||
"ownedDistributionDelivery": "COPILOT_CLI_DIST_DIR:lease-owned-guarded-inner-distribution:v1",
|
||||
"permissionContextContract": "copilot-edit-permission-context-v1",
|
||||
"permissionContextSourceSha256": "de2d38d702b3c574161af0c0c04790fb6f6347916eb3916ce7a131a8c229121b",
|
||||
"permissionAdapterSourceSha256": "ee5929ed2ee647ad0369465dee9d51a00b2dd28e1ff735b43e969ddc9c164668",
|
||||
"permissionLocationsSourceSha256": "f39a81da395b6e23aa2a1a45572a28846e5e81bfd3d764d9a456f74a79c752e9",
|
||||
"permissionRedactionSourceSha256": "ad6770c69269087951790e2e87e22ac088e3d432769adf17ebc865ed512e6c4f",
|
||||
"permissionClassifierSourceSha256": "1161eabd82e26133e3b3db3ab567f65d52808b03f176e93497e02c8330349fb4",
|
||||
"semanticToolReceiptContract": "paperclip.semantic_tool_receipt.v2",
|
||||
"semanticReceiptSourceSha256": "b2795726b2234a663fec1a6ca11f0551ae69882fe9e82aa39686e952d036e791",
|
||||
"semanticBridgeSourceSha256": "8764b8c9032fdc7d1415b01e75a9fc57c550e7a5e11da4bed7d9100082872ae5",
|
||||
"toolEvidenceSourceSha256": "6eef5039afc75bb851eaf9cd82a6f099e4bd398ca2deb59dd66f5b2a81a7a706",
|
||||
"semanticNormalizedInputContract": "validated-forwarded-input-commit-v1",
|
||||
"semanticSidecarSourceSha256": "7d6e948b7cff4df52a9afc916db46ace0f42b4b2d3134ba0c21ee0a928857e62",
|
||||
"semanticDirectDriverSourceSha256": "d683429427dd8a1a5efe50952018ea486f808bdbf0a92fc5946ee267fe2c72ee",
|
||||
"semanticValidationSourceSha256": "02fbb92681c78c5de5d2f1aae25aabc25a0e5df6b0ff4baccac652192a8da975",
|
||||
"semanticNormalizationSourceSha256": "8b628b82e8eacc91cdcc6fdca2210ba4cf282f01e9c6f74e95ff271655b5047e",
|
||||
"semanticCompletionContractSourceSha256": "f49398b682a5623812f5d3c33d6bb9a749008e47cc0ed969072041615f66df59",
|
||||
"semanticValidatorsSourceSha256": "74887ee00c428a8a7f5060d3402cdb16caca3583b9decf58d5a7a147a95b6c68",
|
||||
"semanticSchemaBundleSourceSha256": "af254e5115d9dbedfc6be1b6b52b41516ec3900001aa16b592712e463364a934",
|
||||
"semanticSidecarProtocolSourceSha256": "26dd0cfbef8b2b401de6b7862a4af7f243fb703e23678a1a5ed8fa68d4784d42",
|
||||
"semanticSidecarReceiptCommitContract": "correlated-tool-resolve-v1",
|
||||
"displayEventSourceSha256": "d72f9a6035c247bc6a42c067c05753076c54322c4b58984e93922f3325dc6877",
|
||||
"displayProjectionSourceSha256": "75952606b26dd93bbc582c1f0a4424487377272ea745fb3a27ceae031fd5dc7e",
|
||||
"configuredEnvironmentSourceSha256": "ecef0ada320a762e0a3d91c38c72d4e19e2c8e8be8c060938a47e7f1a029058a",
|
||||
"configuredEnvironmentRustSourceSha256": "054ce778765690c35a4bbb4e73d923d7dd181226865b7a2e76e7952b4a0f44a3",
|
||||
"profileActivitySourceSha256": "4fdb6b0f9125fd8372ba6f27945fa5c8a3d3b2ec891df544092e3dc7a75d5282",
|
||||
"profileExtensionsSourceSha256": "a80ddc95eb4505095bfdbbf85c758199949ab20be9c84b34c77f762eb7180571",
|
||||
"profileInstallationSourceSha256": "3e61c4cdd4b78e38fcb16eaadae4f1fd65ce3c7127184ea7a80948c8e5d77f88",
|
||||
"attachmentPolicySourceSha256": "4f7638b7cc64e18f6a4ba33fd46de2b3d49225e32aeab41f5c695b268fa4f8e2",
|
||||
"singleReadEvidenceSourceSha256": "4069393405089bde613cecec04f5123c426594811da4c668bd96f0e7e283550f",
|
||||
"nativeSessionRuntimeSourceSha256": "1fe6fa9e6b96d84d70432b85a57c473f833606d4a521563d5022b4d3c41576ce",
|
||||
"nativeRuntimeContextSourceSha256": "71607f80dbb8dc5cc6c123d0b8f3995d6c5407277695a8c82cbedc90fb8f4842",
|
||||
"nativeRuntimePromptsSourceSha256": "fff5755dba9b7dce8a5f10ff6ac6d5ed06b92ed079ce1e0a44ac72f2ce7869c1",
|
||||
"nativeSessionContractSourceSha256": "22a8c96ce41ba4f03e976fc37f0cc7c5d05cee99fa789941da31ee1dab440b90",
|
||||
"harnessSessionContractSourceSha256": "baba1a210b863518f01e0c875606ed37f9467c433222251438578bd999bc43b5",
|
||||
"harnessBackendSourceSha256": "dc827e281ae6731545b166ee4d709a4f67f594a556dcbe63c70fe8f1aca26249",
|
||||
"harnessSessionSourceSha256": "81361733e86b56dd5a66415aefc6f72e69be24acc8d3417370154ebb7fef6e94",
|
||||
"transportContractSourceSha256": "03fca93d36a89b0cc0917335e293ad097fdf04356d21b307827bb0ea4c13f523",
|
||||
"nativeBackendSourceSha256": "7495d9898d22dca1ebf6336361d332bafefc4498f6e49f1135025fad846c8586",
|
||||
"nativeBackendFactorySourceSha256": "7e431c926b76d53c4c08e3a4105353dcd34bd940f6588a1a68f79631f6feeb44",
|
||||
"nativeInstructionsSourceSha256": "82ac6e5f7275b4ef79fb166c7330efc504e80cab3d7e9081e4e40a8b570bc50b",
|
||||
"providerLaunchSourceSha256": "c744235b3067ea75973523f78f1e13399337bc155f1775af694e34782d5c9bef",
|
||||
"launchPreparationStoreSourceSha256": "ff6025568bbc0aa6ce545772d73dfca2d3da226740bd3a7b386b069e76cff296",
|
||||
"runtimeRequestBridgeSourceSha256": "93a631b8439df1590b0cf442cf84a9b05f004f12bfee90291651ccfc0861effe",
|
||||
"runtimeRequestFacadeSourceSha256": "d0ed28e0c5ddad34db8f437e704c8a755eb0b47f27e08e44185f66d1d2205295",
|
||||
"runtimeRequestNotificationSourceSha256": "6196c6175f11c69295dc00fc773201f4fdeca26c500653870253c43b81e65211",
|
||||
"guardedInstallationSourceSha256": "56a177d3e702914818dca4ca50e061f0d25f988bfc4c0582c36ce23c1696d82f",
|
||||
"nativeExecutionSourceSha256": "d60b8ea63bad975c0144f0702b2749d7db9a7da50680a6147f20d4d11f2d5297",
|
||||
"profileCompatibilitySourceSha256": "43013f5942b1436ddbc171ecb8af1b5d332400d03ed0cc773b18f86f3efe4c90",
|
||||
"installationSourceSha256": "a1c7c6f103b898216973e77ffbac0ef7572e250aa574d1a4065270e9dfa0dc2d",
|
||||
"assetOwnershipSourceSha256": "1785e3f31e5dad5a13b53e25d8cf9482a9bd89a27b6c127830aed6b81acc605c",
|
||||
"assetInstallerSourceSha256": "d3bd9514e5920d0cc3567aa50487fb534c57a6f66b8da0d3f22c5f6e499c841f",
|
||||
"credentialBindingSourceSha256": "fbc9fc037dab8134d090ac7c3eb23f80026cd84085d56a9704fcf9ceb0478926",
|
||||
"admissionDiagnosticsSourceSha256": "df8f1aa4f2d1bc63b2635bdd09cb8165c8b7681ddcc2618435c7c08ca90475af",
|
||||
"grokAdmissionSourceSha256": "f1e46cf2e1e36b7704bd797b678e3db8db2003f97bdb9d827cfa3d7662698777",
|
||||
"sidecarErrorSourceSha256": "17948ad74350dc487ab20d24a0fb89daf0b426b98396454fff0e3856e922d82c",
|
||||
"profileSourceSha256": "f5538b3dbefa7634a332b87d5ededcefb56aa7e5790cede1c7a0d948a548a456",
|
||||
"metadataProbeSourceSha256": "be4c8416edd27061109bc1f33d0c26071b4facbb3f651beaae6b3c0275cce727",
|
||||
"permissionToolIdentitySourceSha256": "770b47305e571a81f344883057d0e4a482a1cd59ac77d045836593a8e739deb1",
|
||||
"semanticContinuationSourceSha256": "c9cc0fd516b3df92a6655f56ee9bef37615a889c371e2e137d8ac5c1176de811",
|
||||
"preparedHarnessHomeSourceSha256": "bb286f7ddc6e9597c56d46bf7ff6e3b556c5b680d7e147fd46518724432b083e",
|
||||
"runtimeHostSourceSha256": "13f9ac382a279a67adb8974c36bbed38fe43d9b93b87bd7a05e879ead7f03d63",
|
||||
"runtimeAdapterSourceSha256": "7c47c05306ebe7d1ca6b5d046a96f5726a48adec4d27e7c16788f505f25b5db2",
|
||||
"runtimeSandboxSourceSha256": "04a49a24e3828ce8fca908de15e31ae932b8b1b4f7ecec0308627f6a8da9ba20",
|
||||
"cancellationSourceSha256": "a07d1a9e982dec0ae130c1ad1efa5bc75c6a39e013b730ba3ee45256f09ceeca",
|
||||
"agentFilesSourceSha256": "fb32f6badc13dfa22f231479509b631b2f0eba0c99b1ab9f3cd5c0c601aa03ba",
|
||||
"nativeDistributionSourceSha256": "aed327c389e957483a503cb1bb8b247ee7cd7ff4b528fb4567c39bcb4577690b"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"commandDigest": "sha256:e596375ec1bccfb15d89d69a8358ed4c2ef95e7c8c0982440bc98d5995eab70e",
|
||||
"declaration": {
|
||||
"schema": "paperclip.acpx_profile_declaration.v1",
|
||||
"agent": "copilot",
|
||||
"agentProfileVersion": 76,
|
||||
"acpxVersion": "0.13.1",
|
||||
"agentServerVersion": "1.0.88",
|
||||
"protocolPolicyRevision": "copilot-agent-manual-v1",
|
||||
"acpxPatchSha256": "00d6af17216cb0cad902b48633eb19bf0ec6b05837a984cb24661fca593f09c1",
|
||||
"policySha256": "a4be69be43db84052560420a3ca546a665c9165573c24d543eb33d144ba138a3",
|
||||
"distributionSourceSha256": "c0a65e247fc47b263bd369a3d5ab505c4b323d4e6493be8a9ecbeb0e9dbb9107",
|
||||
"agentFilesBinding": "registered-runtime-context-v1",
|
||||
"systemInstructionDelivery": "COPILOT_HOME/copilot-instructions.md:replace-under-lifetime-lease-before-launch:v1",
|
||||
"sharedRuntimeContract": "paperclip.acpx-runtime-contract.v1",
|
||||
"innerDistributionSourceSha256": "9bb08347eed01f1ab44e065c8b06ead9be3a25973d6e6329dc4c0a099096279a",
|
||||
"upstreamAppSha256": "7b48282a19b5b0814a0c96ad5e3a125173d792cc55f9525b2effea962f6063c0",
|
||||
"patchedAppSha256": "61f8eebe0c30cc03b311c6818b2acb158a6d16ca58c8bfac5ebd42db095c2679",
|
||||
"messageIdentityContract": "copilot-native-message-id-v1",
|
||||
"ownedDistributionDelivery": "COPILOT_CLI_DIST_DIR:lease-owned-guarded-inner-distribution:v1",
|
||||
"permissionContextContract": "copilot-edit-permission-context-v1",
|
||||
"permissionContextSourceSha256": "de2d38d702b3c574161af0c0c04790fb6f6347916eb3916ce7a131a8c229121b",
|
||||
"permissionAdapterSourceSha256": "ee5929ed2ee647ad0369465dee9d51a00b2dd28e1ff735b43e969ddc9c164668",
|
||||
"permissionLocationsSourceSha256": "f39a81da395b6e23aa2a1a45572a28846e5e81bfd3d764d9a456f74a79c752e9",
|
||||
"permissionRedactionSourceSha256": "ad6770c69269087951790e2e87e22ac088e3d432769adf17ebc865ed512e6c4f",
|
||||
"permissionClassifierSourceSha256": "1161eabd82e26133e3b3db3ab567f65d52808b03f176e93497e02c8330349fb4",
|
||||
"semanticToolReceiptContract": "paperclip.semantic_tool_receipt.v2",
|
||||
"semanticReceiptSourceSha256": "b2795726b2234a663fec1a6ca11f0551ae69882fe9e82aa39686e952d036e791",
|
||||
"semanticBridgeSourceSha256": "8764b8c9032fdc7d1415b01e75a9fc57c550e7a5e11da4bed7d9100082872ae5",
|
||||
"toolEvidenceSourceSha256": "6eef5039afc75bb851eaf9cd82a6f099e4bd398ca2deb59dd66f5b2a81a7a706",
|
||||
"semanticNormalizedInputContract": "validated-forwarded-input-commit-v1",
|
||||
"semanticSidecarSourceSha256": "7d6e948b7cff4df52a9afc916db46ace0f42b4b2d3134ba0c21ee0a928857e62",
|
||||
"semanticDirectDriverSourceSha256": "d683429427dd8a1a5efe50952018ea486f808bdbf0a92fc5946ee267fe2c72ee",
|
||||
"semanticValidationSourceSha256": "02fbb92681c78c5de5d2f1aae25aabc25a0e5df6b0ff4baccac652192a8da975",
|
||||
"semanticNormalizationSourceSha256": "8b628b82e8eacc91cdcc6fdca2210ba4cf282f01e9c6f74e95ff271655b5047e",
|
||||
"semanticCompletionContractSourceSha256": "f49398b682a5623812f5d3c33d6bb9a749008e47cc0ed969072041615f66df59",
|
||||
"semanticValidatorsSourceSha256": "74887ee00c428a8a7f5060d3402cdb16caca3583b9decf58d5a7a147a95b6c68",
|
||||
"semanticSchemaBundleSourceSha256": "af254e5115d9dbedfc6be1b6b52b41516ec3900001aa16b592712e463364a934",
|
||||
"semanticSidecarProtocolSourceSha256": "26dd0cfbef8b2b401de6b7862a4af7f243fb703e23678a1a5ed8fa68d4784d42",
|
||||
"semanticSidecarReceiptCommitContract": "correlated-tool-resolve-v1",
|
||||
"displayEventSourceSha256": "d72f9a6035c247bc6a42c067c05753076c54322c4b58984e93922f3325dc6877",
|
||||
"displayProjectionSourceSha256": "75952606b26dd93bbc582c1f0a4424487377272ea745fb3a27ceae031fd5dc7e",
|
||||
"configuredEnvironmentSourceSha256": "5c9008d121979a3a8987e6b8a5752172eafdc4a2b5d725a73f3bbb8fb83be8ff",
|
||||
"configuredEnvironmentRustSourceSha256": "85c87fae62b8a9377e4f0a4c00302c7519fae4397b1c48253f8f2b7ba7faf994",
|
||||
"profileActivitySourceSha256": "4fdb6b0f9125fd8372ba6f27945fa5c8a3d3b2ec891df544092e3dc7a75d5282",
|
||||
"profileExtensionsSourceSha256": "a80ddc95eb4505095bfdbbf85c758199949ab20be9c84b34c77f762eb7180571",
|
||||
"profileInstallationSourceSha256": "3e61c4cdd4b78e38fcb16eaadae4f1fd65ce3c7127184ea7a80948c8e5d77f88",
|
||||
"attachmentPolicySourceSha256": "4f7638b7cc64e18f6a4ba33fd46de2b3d49225e32aeab41f5c695b268fa4f8e2",
|
||||
"singleReadEvidenceSourceSha256": "4069393405089bde613cecec04f5123c426594811da4c668bd96f0e7e283550f",
|
||||
"nativeSessionRuntimeSourceSha256": "1fe6fa9e6b96d84d70432b85a57c473f833606d4a521563d5022b4d3c41576ce",
|
||||
"nativeRuntimeContextSourceSha256": "71607f80dbb8dc5cc6c123d0b8f3995d6c5407277695a8c82cbedc90fb8f4842",
|
||||
"nativeRuntimePromptsSourceSha256": "fff5755dba9b7dce8a5f10ff6ac6d5ed06b92ed079ce1e0a44ac72f2ce7869c1",
|
||||
"nativeSessionContractSourceSha256": "22a8c96ce41ba4f03e976fc37f0cc7c5d05cee99fa789941da31ee1dab440b90",
|
||||
"harnessSessionContractSourceSha256": "baba1a210b863518f01e0c875606ed37f9467c433222251438578bd999bc43b5",
|
||||
"harnessBackendSourceSha256": "dc827e281ae6731545b166ee4d709a4f67f594a556dcbe63c70fe8f1aca26249",
|
||||
"harnessSessionSourceSha256": "81361733e86b56dd5a66415aefc6f72e69be24acc8d3417370154ebb7fef6e94",
|
||||
"transportContractSourceSha256": "03fca93d36a89b0cc0917335e293ad097fdf04356d21b307827bb0ea4c13f523",
|
||||
"nativeBackendSourceSha256": "7495d9898d22dca1ebf6336361d332bafefc4498f6e49f1135025fad846c8586",
|
||||
"nativeBackendFactorySourceSha256": "7e431c926b76d53c4c08e3a4105353dcd34bd940f6588a1a68f79631f6feeb44",
|
||||
"nativeInstructionsSourceSha256": "82ac6e5f7275b4ef79fb166c7330efc504e80cab3d7e9081e4e40a8b570bc50b",
|
||||
"providerLaunchSourceSha256": "c744235b3067ea75973523f78f1e13399337bc155f1775af694e34782d5c9bef",
|
||||
"launchPreparationStoreSourceSha256": "ff6025568bbc0aa6ce545772d73dfca2d3da226740bd3a7b386b069e76cff296",
|
||||
"runtimeRequestBridgeSourceSha256": "93a631b8439df1590b0cf442cf84a9b05f004f12bfee90291651ccfc0861effe",
|
||||
"runtimeRequestFacadeSourceSha256": "d0ed28e0c5ddad34db8f437e704c8a755eb0b47f27e08e44185f66d1d2205295",
|
||||
"runtimeRequestNotificationSourceSha256": "6196c6175f11c69295dc00fc773201f4fdeca26c500653870253c43b81e65211",
|
||||
"guardedInstallationSourceSha256": "56a177d3e702914818dca4ca50e061f0d25f988bfc4c0582c36ce23c1696d82f",
|
||||
"nativeExecutionSourceSha256": "d60b8ea63bad975c0144f0702b2749d7db9a7da50680a6147f20d4d11f2d5297",
|
||||
"profileCompatibilitySourceSha256": "5337f35800935b17c3b49e92e454b1f799646a42bc96baeee6cc135193d9e272",
|
||||
"installationSourceSha256": "a1c7c6f103b898216973e77ffbac0ef7572e250aa574d1a4065270e9dfa0dc2d",
|
||||
"assetOwnershipSourceSha256": "1785e3f31e5dad5a13b53e25d8cf9482a9bd89a27b6c127830aed6b81acc605c",
|
||||
"assetInstallerSourceSha256": "d3bd9514e5920d0cc3567aa50487fb534c57a6f66b8da0d3f22c5f6e499c841f",
|
||||
"credentialBindingSourceSha256": "3a93267146bfc3c489f43262386d6dcb05ec4e3a8b1765414cd43d80d0c64d4a",
|
||||
"admissionDiagnosticsSourceSha256": "df8f1aa4f2d1bc63b2635bdd09cb8165c8b7681ddcc2618435c7c08ca90475af",
|
||||
"grokAdmissionSourceSha256": "f1e46cf2e1e36b7704bd797b678e3db8db2003f97bdb9d827cfa3d7662698777",
|
||||
"sidecarErrorSourceSha256": "17948ad74350dc487ab20d24a0fb89daf0b426b98396454fff0e3856e922d82c",
|
||||
"profileSourceSha256": "f5538b3dbefa7634a332b87d5ededcefb56aa7e5790cede1c7a0d948a548a456",
|
||||
"metadataProbeSourceSha256": "be4c8416edd27061109bc1f33d0c26071b4facbb3f651beaae6b3c0275cce727",
|
||||
"permissionToolIdentitySourceSha256": "770b47305e571a81f344883057d0e4a482a1cd59ac77d045836593a8e739deb1",
|
||||
"semanticContinuationSourceSha256": "c9cc0fd516b3df92a6655f56ee9bef37615a889c371e2e137d8ac5c1176de811",
|
||||
"preparedHarnessHomeSourceSha256": "bb286f7ddc6e9597c56d46bf7ff6e3b556c5b680d7e147fd46518724432b083e",
|
||||
"runtimeHostSourceSha256": "13f9ac382a279a67adb8974c36bbed38fe43d9b93b87bd7a05e879ead7f03d63",
|
||||
"runtimeAdapterSourceSha256": "7c47c05306ebe7d1ca6b5d046a96f5726a48adec4d27e7c16788f505f25b5db2",
|
||||
"runtimeSandboxSourceSha256": "04a49a24e3828ce8fca908de15e31ae932b8b1b4f7ecec0308627f6a8da9ba20",
|
||||
"cancellationSourceSha256": "a07d1a9e982dec0ae130c1ad1efa5bc75c6a39e013b730ba3ee45256f09ceeca",
|
||||
"agentFilesSourceSha256": "fb32f6badc13dfa22f231479509b631b2f0eba0c99b1ab9f3cd5c0c601aa03ba",
|
||||
"nativeDistributionSourceSha256": "aed327c389e957483a503cb1bb8b247ee7cd7ff4b528fb4567c39bcb4577690b"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"commandDigest": "sha256:6739ae80201a9bfd3739ad03707c22302251d9fe14092c1fc412b9bde2b49712",
|
||||
"declaration": {
|
||||
"schema": "paperclip.acpx_profile_declaration.v1",
|
||||
"agent": "copilot",
|
||||
"agentProfileVersion": 77,
|
||||
"acpxVersion": "0.13.1",
|
||||
"agentServerVersion": "1.0.88",
|
||||
"protocolPolicyRevision": "copilot-agent-manual-v1",
|
||||
"acpxPatchSha256": "00d6af17216cb0cad902b48633eb19bf0ec6b05837a984cb24661fca593f09c1",
|
||||
"policySha256": "a4be69be43db84052560420a3ca546a665c9165573c24d543eb33d144ba138a3",
|
||||
"distributionSourceSha256": "c0a65e247fc47b263bd369a3d5ab505c4b323d4e6493be8a9ecbeb0e9dbb9107",
|
||||
"agentFilesBinding": "registered-runtime-context-v1",
|
||||
"systemInstructionDelivery": "COPILOT_HOME/copilot-instructions.md:replace-under-lifetime-lease-before-launch:v1",
|
||||
"sharedRuntimeContract": "paperclip.acpx-runtime-contract.v1",
|
||||
"innerDistributionSourceSha256": "9bb08347eed01f1ab44e065c8b06ead9be3a25973d6e6329dc4c0a099096279a",
|
||||
"upstreamAppSha256": "7b48282a19b5b0814a0c96ad5e3a125173d792cc55f9525b2effea962f6063c0",
|
||||
"patchedAppSha256": "61f8eebe0c30cc03b311c6818b2acb158a6d16ca58c8bfac5ebd42db095c2679",
|
||||
"messageIdentityContract": "copilot-native-message-id-v1",
|
||||
"ownedDistributionDelivery": "COPILOT_CLI_DIST_DIR:lease-owned-guarded-inner-distribution:v1",
|
||||
"permissionContextContract": "copilot-edit-permission-context-v1",
|
||||
"permissionContextSourceSha256": "de2d38d702b3c574161af0c0c04790fb6f6347916eb3916ce7a131a8c229121b",
|
||||
"permissionAdapterSourceSha256": "ee5929ed2ee647ad0369465dee9d51a00b2dd28e1ff735b43e969ddc9c164668",
|
||||
"permissionLocationsSourceSha256": "f39a81da395b6e23aa2a1a45572a28846e5e81bfd3d764d9a456f74a79c752e9",
|
||||
"permissionRedactionSourceSha256": "ad6770c69269087951790e2e87e22ac088e3d432769adf17ebc865ed512e6c4f",
|
||||
"permissionClassifierSourceSha256": "1161eabd82e26133e3b3db3ab567f65d52808b03f176e93497e02c8330349fb4",
|
||||
"semanticToolReceiptContract": "paperclip.semantic_tool_receipt.v2",
|
||||
"semanticReceiptSourceSha256": "b2795726b2234a663fec1a6ca11f0551ae69882fe9e82aa39686e952d036e791",
|
||||
"semanticBridgeSourceSha256": "8764b8c9032fdc7d1415b01e75a9fc57c550e7a5e11da4bed7d9100082872ae5",
|
||||
"toolEvidenceSourceSha256": "6eef5039afc75bb851eaf9cd82a6f099e4bd398ca2deb59dd66f5b2a81a7a706",
|
||||
"semanticNormalizedInputContract": "validated-forwarded-input-commit-v1",
|
||||
"semanticSidecarSourceSha256": "7d6e948b7cff4df52a9afc916db46ace0f42b4b2d3134ba0c21ee0a928857e62",
|
||||
"semanticDirectDriverSourceSha256": "d683429427dd8a1a5efe50952018ea486f808bdbf0a92fc5946ee267fe2c72ee",
|
||||
"semanticValidationSourceSha256": "02fbb92681c78c5de5d2f1aae25aabc25a0e5df6b0ff4baccac652192a8da975",
|
||||
"semanticNormalizationSourceSha256": "8b628b82e8eacc91cdcc6fdca2210ba4cf282f01e9c6f74e95ff271655b5047e",
|
||||
"semanticCompletionContractSourceSha256": "f49398b682a5623812f5d3c33d6bb9a749008e47cc0ed969072041615f66df59",
|
||||
"semanticValidatorsSourceSha256": "74887ee00c428a8a7f5060d3402cdb16caca3583b9decf58d5a7a147a95b6c68",
|
||||
"semanticSchemaBundleSourceSha256": "af254e5115d9dbedfc6be1b6b52b41516ec3900001aa16b592712e463364a934",
|
||||
"semanticSidecarProtocolSourceSha256": "26dd0cfbef8b2b401de6b7862a4af7f243fb703e23678a1a5ed8fa68d4784d42",
|
||||
"semanticSidecarReceiptCommitContract": "correlated-tool-resolve-v1",
|
||||
"displayEventSourceSha256": "d72f9a6035c247bc6a42c067c05753076c54322c4b58984e93922f3325dc6877",
|
||||
"displayProjectionSourceSha256": "75952606b26dd93bbc582c1f0a4424487377272ea745fb3a27ceae031fd5dc7e",
|
||||
"configuredEnvironmentSourceSha256": "ecef0ada320a762e0a3d91c38c72d4e19e2c8e8be8c060938a47e7f1a029058a",
|
||||
"configuredEnvironmentRustSourceSha256": "054ce778765690c35a4bbb4e73d923d7dd181226865b7a2e76e7952b4a0f44a3",
|
||||
"profileActivitySourceSha256": "4fdb6b0f9125fd8372ba6f27945fa5c8a3d3b2ec891df544092e3dc7a75d5282",
|
||||
"profileExtensionsSourceSha256": "a80ddc95eb4505095bfdbbf85c758199949ab20be9c84b34c77f762eb7180571",
|
||||
"profileInstallationSourceSha256": "3e61c4cdd4b78e38fcb16eaadae4f1fd65ce3c7127184ea7a80948c8e5d77f88",
|
||||
"attachmentPolicySourceSha256": "4f7638b7cc64e18f6a4ba33fd46de2b3d49225e32aeab41f5c695b268fa4f8e2",
|
||||
"singleReadEvidenceSourceSha256": "4069393405089bde613cecec04f5123c426594811da4c668bd96f0e7e283550f",
|
||||
"nativeSessionRuntimeSourceSha256": "1fe6fa9e6b96d84d70432b85a57c473f833606d4a521563d5022b4d3c41576ce",
|
||||
"nativeRuntimeContextSourceSha256": "71607f80dbb8dc5cc6c123d0b8f3995d6c5407277695a8c82cbedc90fb8f4842",
|
||||
"nativeRuntimePromptsSourceSha256": "fff5755dba9b7dce8a5f10ff6ac6d5ed06b92ed079ce1e0a44ac72f2ce7869c1",
|
||||
"nativeSessionContractSourceSha256": "22a8c96ce41ba4f03e976fc37f0cc7c5d05cee99fa789941da31ee1dab440b90",
|
||||
"harnessSessionContractSourceSha256": "baba1a210b863518f01e0c875606ed37f9467c433222251438578bd999bc43b5",
|
||||
"harnessBackendSourceSha256": "dc827e281ae6731545b166ee4d709a4f67f594a556dcbe63c70fe8f1aca26249",
|
||||
"harnessSessionSourceSha256": "81361733e86b56dd5a66415aefc6f72e69be24acc8d3417370154ebb7fef6e94",
|
||||
"transportContractSourceSha256": "03fca93d36a89b0cc0917335e293ad097fdf04356d21b307827bb0ea4c13f523",
|
||||
"nativeBackendSourceSha256": "7495d9898d22dca1ebf6336361d332bafefc4498f6e49f1135025fad846c8586",
|
||||
"nativeBackendFactorySourceSha256": "7e431c926b76d53c4c08e3a4105353dcd34bd940f6588a1a68f79631f6feeb44",
|
||||
"nativeInstructionsSourceSha256": "82ac6e5f7275b4ef79fb166c7330efc504e80cab3d7e9081e4e40a8b570bc50b",
|
||||
"providerLaunchSourceSha256": "c744235b3067ea75973523f78f1e13399337bc155f1775af694e34782d5c9bef",
|
||||
"launchPreparationStoreSourceSha256": "ff6025568bbc0aa6ce545772d73dfca2d3da226740bd3a7b386b069e76cff296",
|
||||
"runtimeRequestBridgeSourceSha256": "93a631b8439df1590b0cf442cf84a9b05f004f12bfee90291651ccfc0861effe",
|
||||
"runtimeRequestFacadeSourceSha256": "d0ed28e0c5ddad34db8f437e704c8a755eb0b47f27e08e44185f66d1d2205295",
|
||||
"runtimeRequestNotificationSourceSha256": "6196c6175f11c69295dc00fc773201f4fdeca26c500653870253c43b81e65211",
|
||||
"guardedInstallationSourceSha256": "56a177d3e702914818dca4ca50e061f0d25f988bfc4c0582c36ce23c1696d82f",
|
||||
"nativeExecutionSourceSha256": "d60b8ea63bad975c0144f0702b2749d7db9a7da50680a6147f20d4d11f2d5297",
|
||||
"profileCompatibilitySourceSha256": "6e942ecc5998853ceaa1879933568167b3c9d3fbaabf07559017a7cfd028e457",
|
||||
"installationSourceSha256": "a1c7c6f103b898216973e77ffbac0ef7572e250aa574d1a4065270e9dfa0dc2d",
|
||||
"assetOwnershipSourceSha256": "1785e3f31e5dad5a13b53e25d8cf9482a9bd89a27b6c127830aed6b81acc605c",
|
||||
"assetInstallerSourceSha256": "d3bd9514e5920d0cc3567aa50487fb534c57a6f66b8da0d3f22c5f6e499c841f",
|
||||
"credentialBindingSourceSha256": "fbc9fc037dab8134d090ac7c3eb23f80026cd84085d56a9704fcf9ceb0478926",
|
||||
"admissionDiagnosticsSourceSha256": "df8f1aa4f2d1bc63b2635bdd09cb8165c8b7681ddcc2618435c7c08ca90475af",
|
||||
"grokAdmissionSourceSha256": "f1e46cf2e1e36b7704bd797b678e3db8db2003f97bdb9d827cfa3d7662698777",
|
||||
"sidecarErrorSourceSha256": "17948ad74350dc487ab20d24a0fb89daf0b426b98396454fff0e3856e922d82c",
|
||||
"profileSourceSha256": "f5538b3dbefa7634a332b87d5ededcefb56aa7e5790cede1c7a0d948a548a456",
|
||||
"metadataProbeSourceSha256": "be4c8416edd27061109bc1f33d0c26071b4facbb3f651beaae6b3c0275cce727",
|
||||
"permissionToolIdentitySourceSha256": "770b47305e571a81f344883057d0e4a482a1cd59ac77d045836593a8e739deb1",
|
||||
"semanticContinuationSourceSha256": "c9cc0fd516b3df92a6655f56ee9bef37615a889c371e2e137d8ac5c1176de811",
|
||||
"preparedHarnessHomeSourceSha256": "bb286f7ddc6e9597c56d46bf7ff6e3b556c5b680d7e147fd46518724432b083e",
|
||||
"runtimeHostSourceSha256": "13f9ac382a279a67adb8974c36bbed38fe43d9b93b87bd7a05e879ead7f03d63",
|
||||
"runtimeAdapterSourceSha256": "7c47c05306ebe7d1ca6b5d046a96f5726a48adec4d27e7c16788f505f25b5db2",
|
||||
"runtimeSandboxSourceSha256": "04a49a24e3828ce8fca908de15e31ae932b8b1b4f7ecec0308627f6a8da9ba20",
|
||||
"cancellationSourceSha256": "a07d1a9e982dec0ae130c1ad1efa5bc75c6a39e013b730ba3ee45256f09ceeca",
|
||||
"agentFilesSourceSha256": "fb32f6badc13dfa22f231479509b631b2f0eba0c99b1ab9f3cd5c0c601aa03ba",
|
||||
"nativeDistributionSourceSha256": "aed327c389e957483a503cb1bb8b247ee7cd7ff4b528fb4567c39bcb4577690b"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"commandDigest": "sha256:f7e7cff356db4b1b37458bd62fd76e9d81aa1cc46795e54b168755fb68bcee8c",
|
||||
"declaration": {
|
||||
"schema": "paperclip.acpx_profile_declaration.v1",
|
||||
"agent": "copilot",
|
||||
"agentProfileVersion": 78,
|
||||
"acpxVersion": "0.13.1",
|
||||
"agentServerVersion": "1.0.88",
|
||||
"protocolPolicyRevision": "copilot-agent-manual-v1",
|
||||
"acpxPatchSha256": "00d6af17216cb0cad902b48633eb19bf0ec6b05837a984cb24661fca593f09c1",
|
||||
"policySha256": "a4be69be43db84052560420a3ca546a665c9165573c24d543eb33d144ba138a3",
|
||||
"distributionSourceSha256": "c0a65e247fc47b263bd369a3d5ab505c4b323d4e6493be8a9ecbeb0e9dbb9107",
|
||||
"agentFilesBinding": "registered-runtime-context-v1",
|
||||
"systemInstructionDelivery": "COPILOT_HOME/copilot-instructions.md:replace-under-lifetime-lease-before-launch:v1",
|
||||
"sharedRuntimeContract": "paperclip.acpx-runtime-contract.v1",
|
||||
"innerDistributionSourceSha256": "9bb08347eed01f1ab44e065c8b06ead9be3a25973d6e6329dc4c0a099096279a",
|
||||
"upstreamAppSha256": "7b48282a19b5b0814a0c96ad5e3a125173d792cc55f9525b2effea962f6063c0",
|
||||
"patchedAppSha256": "61f8eebe0c30cc03b311c6818b2acb158a6d16ca58c8bfac5ebd42db095c2679",
|
||||
"messageIdentityContract": "copilot-native-message-id-v1",
|
||||
"ownedDistributionDelivery": "COPILOT_CLI_DIST_DIR:lease-owned-guarded-inner-distribution:v1",
|
||||
"permissionContextContract": "copilot-edit-permission-context-v1",
|
||||
"permissionContextSourceSha256": "de2d38d702b3c574161af0c0c04790fb6f6347916eb3916ce7a131a8c229121b",
|
||||
"permissionAdapterSourceSha256": "ee5929ed2ee647ad0369465dee9d51a00b2dd28e1ff735b43e969ddc9c164668",
|
||||
"permissionLocationsSourceSha256": "f39a81da395b6e23aa2a1a45572a28846e5e81bfd3d764d9a456f74a79c752e9",
|
||||
"permissionRedactionSourceSha256": "ad6770c69269087951790e2e87e22ac088e3d432769adf17ebc865ed512e6c4f",
|
||||
"permissionClassifierSourceSha256": "1161eabd82e26133e3b3db3ab567f65d52808b03f176e93497e02c8330349fb4",
|
||||
"semanticToolReceiptContract": "paperclip.semantic_tool_receipt.v2",
|
||||
"semanticReceiptSourceSha256": "b2795726b2234a663fec1a6ca11f0551ae69882fe9e82aa39686e952d036e791",
|
||||
"semanticBridgeSourceSha256": "8764b8c9032fdc7d1415b01e75a9fc57c550e7a5e11da4bed7d9100082872ae5",
|
||||
"toolEvidenceSourceSha256": "6eef5039afc75bb851eaf9cd82a6f099e4bd398ca2deb59dd66f5b2a81a7a706",
|
||||
"semanticNormalizedInputContract": "validated-forwarded-input-commit-v1",
|
||||
"semanticSidecarSourceSha256": "7d6e948b7cff4df52a9afc916db46ace0f42b4b2d3134ba0c21ee0a928857e62",
|
||||
"semanticDirectDriverSourceSha256": "d683429427dd8a1a5efe50952018ea486f808bdbf0a92fc5946ee267fe2c72ee",
|
||||
"semanticValidationSourceSha256": "02fbb92681c78c5de5d2f1aae25aabc25a0e5df6b0ff4baccac652192a8da975",
|
||||
"semanticNormalizationSourceSha256": "8b628b82e8eacc91cdcc6fdca2210ba4cf282f01e9c6f74e95ff271655b5047e",
|
||||
"semanticCompletionContractSourceSha256": "f49398b682a5623812f5d3c33d6bb9a749008e47cc0ed969072041615f66df59",
|
||||
"semanticValidatorsSourceSha256": "b20ec8ee6e7165117233ce4421a975bb9d3f276220ce31655c0b9a717cb2d9cb",
|
||||
"semanticSchemaBundleSourceSha256": "81ef98ca7b34896a0f76390ac7af3dd8ef7609fe6f38d54bd6a69373d50fe40b",
|
||||
"semanticSidecarProtocolSourceSha256": "26dd0cfbef8b2b401de6b7862a4af7f243fb703e23678a1a5ed8fa68d4784d42",
|
||||
"semanticSidecarReceiptCommitContract": "correlated-tool-resolve-v1",
|
||||
"displayEventSourceSha256": "d72f9a6035c247bc6a42c067c05753076c54322c4b58984e93922f3325dc6877",
|
||||
"displayProjectionSourceSha256": "75952606b26dd93bbc582c1f0a4424487377272ea745fb3a27ceae031fd5dc7e",
|
||||
"configuredEnvironmentSourceSha256": "5c9008d121979a3a8987e6b8a5752172eafdc4a2b5d725a73f3bbb8fb83be8ff",
|
||||
"configuredEnvironmentRustSourceSha256": "85c87fae62b8a9377e4f0a4c00302c7519fae4397b1c48253f8f2b7ba7faf994",
|
||||
"profileActivitySourceSha256": "4fdb6b0f9125fd8372ba6f27945fa5c8a3d3b2ec891df544092e3dc7a75d5282",
|
||||
"profileExtensionsSourceSha256": "a80ddc95eb4505095bfdbbf85c758199949ab20be9c84b34c77f762eb7180571",
|
||||
"profileInstallationSourceSha256": "3e61c4cdd4b78e38fcb16eaadae4f1fd65ce3c7127184ea7a80948c8e5d77f88",
|
||||
"attachmentPolicySourceSha256": "4f7638b7cc64e18f6a4ba33fd46de2b3d49225e32aeab41f5c695b268fa4f8e2",
|
||||
"singleReadEvidenceSourceSha256": "4069393405089bde613cecec04f5123c426594811da4c668bd96f0e7e283550f",
|
||||
"nativeSessionRuntimeSourceSha256": "1fe6fa9e6b96d84d70432b85a57c473f833606d4a521563d5022b4d3c41576ce",
|
||||
"nativeRuntimeContextSourceSha256": "71607f80dbb8dc5cc6c123d0b8f3995d6c5407277695a8c82cbedc90fb8f4842",
|
||||
"nativeRuntimePromptsSourceSha256": "fff5755dba9b7dce8a5f10ff6ac6d5ed06b92ed079ce1e0a44ac72f2ce7869c1",
|
||||
"nativeSessionContractSourceSha256": "22a8c96ce41ba4f03e976fc37f0cc7c5d05cee99fa789941da31ee1dab440b90",
|
||||
"harnessSessionContractSourceSha256": "baba1a210b863518f01e0c875606ed37f9467c433222251438578bd999bc43b5",
|
||||
"harnessBackendSourceSha256": "dc827e281ae6731545b166ee4d709a4f67f594a556dcbe63c70fe8f1aca26249",
|
||||
"harnessSessionSourceSha256": "81361733e86b56dd5a66415aefc6f72e69be24acc8d3417370154ebb7fef6e94",
|
||||
"transportContractSourceSha256": "03fca93d36a89b0cc0917335e293ad097fdf04356d21b307827bb0ea4c13f523",
|
||||
"nativeBackendSourceSha256": "7495d9898d22dca1ebf6336361d332bafefc4498f6e49f1135025fad846c8586",
|
||||
"nativeBackendFactorySourceSha256": "7e431c926b76d53c4c08e3a4105353dcd34bd940f6588a1a68f79631f6feeb44",
|
||||
"nativeInstructionsSourceSha256": "82ac6e5f7275b4ef79fb166c7330efc504e80cab3d7e9081e4e40a8b570bc50b",
|
||||
"providerLaunchSourceSha256": "c744235b3067ea75973523f78f1e13399337bc155f1775af694e34782d5c9bef",
|
||||
"launchPreparationStoreSourceSha256": "ff6025568bbc0aa6ce545772d73dfca2d3da226740bd3a7b386b069e76cff296",
|
||||
"runtimeRequestBridgeSourceSha256": "93a631b8439df1590b0cf442cf84a9b05f004f12bfee90291651ccfc0861effe",
|
||||
"runtimeRequestFacadeSourceSha256": "d0ed28e0c5ddad34db8f437e704c8a755eb0b47f27e08e44185f66d1d2205295",
|
||||
"runtimeRequestNotificationSourceSha256": "6196c6175f11c69295dc00fc773201f4fdeca26c500653870253c43b81e65211",
|
||||
"guardedInstallationSourceSha256": "56a177d3e702914818dca4ca50e061f0d25f988bfc4c0582c36ce23c1696d82f",
|
||||
"nativeExecutionSourceSha256": "d60b8ea63bad975c0144f0702b2749d7db9a7da50680a6147f20d4d11f2d5297",
|
||||
"profileCompatibilitySourceSha256": "afc4134817386e1c1dd5fe4725aca46b5bc7d6b7a115932daf70db18f36838a0",
|
||||
"installationSourceSha256": "a1c7c6f103b898216973e77ffbac0ef7572e250aa574d1a4065270e9dfa0dc2d",
|
||||
"assetOwnershipSourceSha256": "1785e3f31e5dad5a13b53e25d8cf9482a9bd89a27b6c127830aed6b81acc605c",
|
||||
"assetInstallerSourceSha256": "d3bd9514e5920d0cc3567aa50487fb534c57a6f66b8da0d3f22c5f6e499c841f",
|
||||
"credentialBindingSourceSha256": "3a93267146bfc3c489f43262386d6dcb05ec4e3a8b1765414cd43d80d0c64d4a",
|
||||
"admissionDiagnosticsSourceSha256": "df8f1aa4f2d1bc63b2635bdd09cb8165c8b7681ddcc2618435c7c08ca90475af",
|
||||
"grokAdmissionSourceSha256": "f1e46cf2e1e36b7704bd797b678e3db8db2003f97bdb9d827cfa3d7662698777",
|
||||
"sidecarErrorSourceSha256": "17948ad74350dc487ab20d24a0fb89daf0b426b98396454fff0e3856e922d82c",
|
||||
"profileSourceSha256": "f5538b3dbefa7634a332b87d5ededcefb56aa7e5790cede1c7a0d948a548a456",
|
||||
"metadataProbeSourceSha256": "be4c8416edd27061109bc1f33d0c26071b4facbb3f651beaae6b3c0275cce727",
|
||||
"permissionToolIdentitySourceSha256": "770b47305e571a81f344883057d0e4a482a1cd59ac77d045836593a8e739deb1",
|
||||
"semanticContinuationSourceSha256": "c9cc0fd516b3df92a6655f56ee9bef37615a889c371e2e137d8ac5c1176de811",
|
||||
"preparedHarnessHomeSourceSha256": "bb286f7ddc6e9597c56d46bf7ff6e3b556c5b680d7e147fd46518724432b083e",
|
||||
"runtimeHostSourceSha256": "13f9ac382a279a67adb8974c36bbed38fe43d9b93b87bd7a05e879ead7f03d63",
|
||||
"runtimeAdapterSourceSha256": "7c47c05306ebe7d1ca6b5d046a96f5726a48adec4d27e7c16788f505f25b5db2",
|
||||
"runtimeSandboxSourceSha256": "04a49a24e3828ce8fca908de15e31ae932b8b1b4f7ecec0308627f6a8da9ba20",
|
||||
"cancellationSourceSha256": "a07d1a9e982dec0ae130c1ad1efa5bc75c6a39e013b730ba3ee45256f09ceeca",
|
||||
"agentFilesSourceSha256": "fb32f6badc13dfa22f231479509b631b2f0eba0c99b1ab9f3cd5c0c601aa03ba",
|
||||
"nativeDistributionSourceSha256": "aed327c389e957483a503cb1bb8b247ee7cd7ff4b528fb4567c39bcb4577690b"
|
||||
}
|
||||
}
|
||||
@@ -49,6 +49,22 @@ test("canonical replay fixtures use supported required versions", async () => {
|
||||
}
|
||||
});
|
||||
|
||||
test("runtime activity is a closed Runner notification in every supported event version", async () => {
|
||||
const validators = compileProtocolValidators(await loadSchemaCatalog(resolve(protocolRoot, "schemas")));
|
||||
const happy = await fixture("replay/happy-path.json");
|
||||
const base = happy.events[0];
|
||||
for (const [version, validate] of [[1, event => validators.fixture({ ...happy, events: [event] })], [2, validators.eventV2], [3, validators.eventV3]]) {
|
||||
const event = { ...base, schema: `paperclip.prp.event.v${version}`, schemaVersion: version,
|
||||
eventType: "runtime.activity.recorded", priority: 1, sourceKind: "runner", payload: { namespace: "example.runtime", activityKey: "desktop.used" } };
|
||||
assert.equal(validate(event), true);
|
||||
assert.equal(validate({ ...event, sourceKind: "control_plane" }), false);
|
||||
for (const payload of [{ ...event.payload, runId: "caller-run" }, { ...event.payload, activityKey: "" },
|
||||
{ ...event.payload, activityKey: "x".repeat(161) }, { ...event.payload, namespace: "invalid\nkey" }]) {
|
||||
assert.equal(validate({ ...event, payload }), false);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
test("unknown additive fields remain compatible with PRP v1", async () => {
|
||||
const value = await fixture("replay/unknown-optional-fields.json");
|
||||
assert.equal(value.futureFixtureHint.producerVersion, "1.1-preview");
|
||||
|
||||
@@ -218,7 +218,7 @@ describe("live-event run read boundaries", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it.each(["authenticated", "local_trusted"] as const)("redacts native live rows like history reads for %s viewers", async deploymentMode => {
|
||||
it.each([["authenticated", "native"], ["local_trusted", "native"], ["authenticated", "panel"], ["local_trusted", "panel"]] as const)("redacts %s live rows like history reads for %s events", async (deploymentMode, kind) => {
|
||||
const companyId = randomUUID(), viewer = randomUUID();
|
||||
await db.insert(companies).values({ id: companyId, name: "Live redaction", issuePrefix: `LR${companyId.slice(0, 6)}` });
|
||||
await db.insert(authUsers).values({ id: viewer, name: "Fixture viewer", email: `${viewer}@example.test`, createdAt: new Date(), updatedAt: new Date() });
|
||||
@@ -229,9 +229,10 @@ describe("live-event run read boundaries", () => {
|
||||
const registry = createRunSecretRedactionRegistry(db);
|
||||
await registry.register(companyId, run.id, registered);
|
||||
await instanceSettingsService(db).updateGeneral({ censorUsernameInLogs: true });
|
||||
const body = { prpEvent: { eventType: "item.delta", payload: { kind: "agentMessage",
|
||||
text: `${homedir()}/synthetic.txt ${registered}`, password: "sensitive-key-sentinel" } } };
|
||||
const sourcePayload = { runId: run.id, agentId: agent.id, seq: 1, eventType: "item.delta", payload: body };
|
||||
const body = kind === "panel" ? { prpEvent: { eventType: "runtime.activity.recorded", sourceKind: "runner", payload: { namespace: `example.${registered}`, activityKey: `${homedir()}/synthetic.txt` } } }
|
||||
: { prpEvent: { eventType: "item.delta", payload: { kind: "agentMessage",
|
||||
text: `${homedir()}/synthetic.txt ${registered}`, password: "sensitive-key-sentinel" } } };
|
||||
const sourcePayload = { runId: run.id, agentId: agent.id, seq: 1, eventType: kind === "panel" ? "runtime.activity.recorded" : "item.delta", payload: body };
|
||||
const expected = await registry.redactForRun(companyId, run.id,
|
||||
redactCurrentUserValue({ ...sourcePayload, payload: redactEventPayload(body) }, { enabled: true }));
|
||||
const queries: string[] = [];
|
||||
|
||||
@@ -41,6 +41,13 @@ function receiptNotice(version: 1 | 2 = 1): Record<string, any> {
|
||||
const receiptSchemaValue = (notice: Record<string, any>) => notice.details.find((detail: any) => detail.name === "schema").value;
|
||||
|
||||
describe("redaction", () => {
|
||||
it.each([1, 2, 3] as const)("preserves structured panel activation and redacts adjacent secrets in PRP v%s", version => {
|
||||
const event = { schema: `paperclip.prp.event.v${version}`, schemaVersion: version,
|
||||
eventType: "runtime.activity.recorded", payload: { namespace: "example.runtime", activityKey: "desktop.used" } };
|
||||
expect(redactEventPayload({ prpEvent: event })).toEqual({ prpEvent: event });
|
||||
expect(redactEventPayload({ prpEvent: { ...event, payload: { ...event.payload, apiKey: "secret-sentinel" } } }))
|
||||
.toEqual({ prpEvent: { ...event, payload: { ...event.payload, apiKey: REDACTED_EVENT_VALUE } } });
|
||||
});
|
||||
it.each([1, 2, 3] as const)("preserves credential update metadata and masks adjacent secrets in PRP v%s", version => {
|
||||
const event = { schema: `paperclip.prp.event.v${version}`, schemaVersion: version,
|
||||
eventType: "auth.credentials.updated", payload: { schema: "paperclip.auth.credentials.updated.v1",
|
||||
|
||||
@@ -219,6 +219,7 @@ export const PRP_V1_EVENT_TYPES = new Set([
|
||||
"workspace.diff.recorded",
|
||||
"workspace.file.referenced",
|
||||
"auth.credentials.updated",
|
||||
"runtime.activity.recorded",
|
||||
"harness.starting",
|
||||
"harness.ready",
|
||||
"harness.exited",
|
||||
|
||||
@@ -404,6 +404,41 @@ describe("PaperclipControlPlanePort conformance", () => {
|
||||
terminal: CONTROL_PLANE_CONFORMANCE_TERMINAL })).resolves.toBeUndefined();
|
||||
});
|
||||
|
||||
it("persists panel activation under the authenticated run and recovers it across source replay", async () => {
|
||||
const identity = { ...CONTROL_PLANE_CONFORMANCE_OPEN.identity, runId: randomUUID(), sessionId: randomUUID() };
|
||||
const runnerId = randomUUID();
|
||||
await db.insert(heartbeatRuns).values({
|
||||
id: identity.runId, companyId: identity.companyId, agentId: identity.agentId,
|
||||
status: "running", runtimeMode: "native", nativeIssueId: identity.issueId,
|
||||
nativeSessionId: identity.sessionId, runnerInstanceId: runnerId,
|
||||
completionContractId: contractId, completionContractSha256: contractSha,
|
||||
contextSnapshot: { issueId: identity.issueId },
|
||||
});
|
||||
const binding = { ...identity, completionContractId: contractId, completionContractSha256: contractSha,
|
||||
sourceInstanceId: runnerId, controlPlaneSourceInstanceId: `panel-${identity.runId}` };
|
||||
const event: PrpEvent = {
|
||||
schema: "paperclip.prp.event.v1", sourceEventId: `${runnerId}:1`, sourceSeq: 1,
|
||||
sourceInstanceId: runnerId, sourceKind: "runner", runId: identity.runId,
|
||||
normalizedSessionId: identity.sessionId, eventType: "runtime.activity.recorded", schemaVersion: 1,
|
||||
priority: 1, emittedAt: new Date().toISOString(),
|
||||
payload: { namespace: "example.runtime", activityKey: "desktop.used" },
|
||||
};
|
||||
const port = new PaperclipControlPlanePort(db, binding);
|
||||
const replayBinding = structuredClone(binding);
|
||||
binding.runId = randomUUID();
|
||||
await port.openRun({ identity, backendKind: "mock", sourceInstanceId: runnerId });
|
||||
const notifications: string[] = [];
|
||||
const unsubscribe = subscribeCompanyLiveEvents(identity.companyId, event => {
|
||||
if (event.type === "heartbeat.run.event" && event.payload.runId === identity.runId) notifications.push(String(event.payload.eventType));
|
||||
});
|
||||
try { await port.appendEvent(event); } finally { unsubscribe(); }
|
||||
expect(notifications).toEqual(["runtime.activity.recorded"]);
|
||||
const restarted = new PaperclipControlPlanePort(db, replayBinding);
|
||||
expect((await restarted.appendEvent(event)).disposition).toBe("duplicate");
|
||||
const activations = await db.select().from(heartbeatRunEvents).where(eq(heartbeatRunEvents.runId, identity.runId));
|
||||
expect(activations.filter(row => row.eventType === "runtime.activity.recorded")).toHaveLength(1);
|
||||
});
|
||||
|
||||
it("omits API credentials from persisted tool events and checkpoints without changing wire results", async () => {
|
||||
const identity = { ...CONTROL_PLANE_CONFORMANCE_OPEN.identity, runId: randomUUID(), sessionId: randomUUID() };
|
||||
const runnerId = randomUUID();
|
||||
|
||||
@@ -25,6 +25,9 @@ function enumStrings(value: unknown): string[] {
|
||||
}
|
||||
|
||||
describe("Paperclip task protocol surface registry", () => {
|
||||
it("folds activation into the task panel instead of adding a chat message", () => {
|
||||
expect(TASK_PROTOCOL_EVENT_SURFACE_REGISTRY["runtime.activity.recorded"]).toMatchObject({ disposition: "folded", surface: "task_panel" });
|
||||
});
|
||||
it("classifies every canonical event exactly once", () => {
|
||||
const eventSchema = schema("event.schema.json");
|
||||
const properties = record(eventSchema.properties);
|
||||
|
||||
@@ -107,6 +107,7 @@ export const TASK_PROTOCOL_EVENT_SURFACE_REGISTRY: Readonly<Record<string, TaskP
|
||||
...Object.fromEntries(runnerLifecycleEvents.map((eventType) => [eventType, folded("turn", "Routine lifecycle transitions are summarized by the run turn and composer state.")])),
|
||||
...Object.fromEntries(diagnosticEvents.map((eventType) => [eventType, folded("system_notice", "Actionable failure text is folded into the run or system notice.")])),
|
||||
...Object.fromEntries(itemEvents.map((eventType) => [eventType, folded("conversation_or_tool", "Item payloads normalize into messages, reasoning, tools, diffs, or usage." )])),
|
||||
"runtime.activity.recorded": folded("task_panel", "The activated plugin view appears in the task side panel."),
|
||||
"auth.credentials.updated": debugOnly("run_debug", "Credential updates notify the host and remain in run details."),
|
||||
"sandbox.metric": debugOnly("run_debug", "Sandbox telemetry is available in run details, not the primary task thread."),
|
||||
...Object.fromEntries(mcpLifecycleEvents.map((eventType) => [eventType, debugOnly("run_debug", "MCP application transport lifecycle remains in run details unless it produces an actionable failure.")])),
|
||||
|
||||
Reference in new issue
Block a user