From 88b2fc75e76b620b233dab0f4261e9a2577c92e6 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 23 Aug 2026 14:31:55 -0400 Subject: [PATCH 1/2] Run bounded Visual policy improvement episode --- GOALS.md | 27 +- .../dogfood/active-policy.json | 11 + .../dogfood/visual-policy-v1.0.0.json | 26 + .../dogfood/visual-policy-v1.1.0.json | 26 + .../github-app-least-privilege.json | 22 + docs/change-passport/implementation-plan.md | 3 + docs/change-passport/product-intent.md | 15 +- docs/rsi-improvement-episodes.md | 15 + ...-github-authority-boundary-2026-08-23.json | 37 + .../change-passport-export.json | 1410 +++++++++++++++++ .../events.jsonl | 11 + .../evidence.json | 141 ++ .../projection.json | 314 ++++ docs/status/surface-claim-index.json | 2 + .../run-visual-policy-improvement-episode.js | 376 +++++ .../verify-visual-change-passport-dogfood.js | 11 +- server/change-control/visual-workflow.js | 35 +- .../visual-change-passport.test.js | 51 + 18 files changed, 2505 insertions(+), 28 deletions(-) create mode 100644 docs/change-passport/dogfood/active-policy.json create mode 100644 docs/change-passport/dogfood/visual-policy-v1.0.0.json create mode 100644 docs/change-passport/dogfood/visual-policy-v1.1.0.json create mode 100644 docs/change-passport/github-app-least-privilege.json create mode 100644 docs/status/change-passport-github-authority-boundary-2026-08-23.json create mode 100644 docs/status/rsi/visual-policy-rollback-identity-2026-08-23/change-passport-export.json create mode 100644 docs/status/rsi/visual-policy-rollback-identity-2026-08-23/events.jsonl create mode 100644 docs/status/rsi/visual-policy-rollback-identity-2026-08-23/evidence.json create mode 100644 docs/status/rsi/visual-policy-rollback-identity-2026-08-23/projection.json create mode 100644 scripts/run-visual-policy-improvement-episode.js diff --git a/GOALS.md b/GOALS.md index 79077314..41439d22 100644 --- a/GOALS.md +++ b/GOALS.md @@ -6,13 +6,13 @@ Reploid should govern consequential decisions made by agents and humans from proposal through evidence, disagreement, evaluation, approval, activation, observed outcome, rollback, and reopening. -The first commercial expression is Reploid Change Passport. It makes an -agent-generated model, prompt, tool, policy, configuration, or source patch -change reviewable, -reversible, and automatically reopenable when a declared part of its evidence -or policy basis changes. A passport verifies the declared evidence and policy -basis under which a decision became active. It does not prove that the decision -was objectively correct or that every contributing system was honest. +The first commercial expression is Reploid Agent Release Passport. It governs +eligibility for an exact agent tool, MCP server, permission policy, or +production-agent configuration release. It preserves the evidence, +disagreement, human authority, rollback target, and reopening rules that made +the release eligible. GitHub controls merge, deployment systems control +activation, and identity systems control access. Reploid controls eligibility +and preserves its basis. Reploid Room-1 remains the first scientific proof. It tests whether the same contradiction-preserving decision mechanism can help curators of public protein @@ -38,7 +38,10 @@ GitHub App client and required-check projection, CI action, TypeScript SDK, browser review surface, explicit deployment and rollback adapters, standard reopening triggers, offline export verification, and a separate adapter from `rsi.improvement-episode/v1`. These claims are bounded to repository tests and -the local browser journey. A complete Visual Change Passport dogfood path also +the local browser journey. A GitHub App is installed only on +`clocksmith/reploid`, its webhook is deployed, and a dedicated dogfood branch +requires the App-bound check. No authentic blocked and eligible check pair has +been observed. A complete Visual Change Passport dogfood path also binds the development Bridge's complaint and reversible patch receipts to an independent physical-Chromium evaluation, attributed acceptance, local CI activation, post-activation render outcome, exact source reversal, and @@ -68,8 +71,8 @@ independent model evidence, biological correctness, or scientific replication. The first commercial proof is narrower than generic decision governance: -> Reploid governs an agent-generated model, prompt, tool, policy, -> configuration, or source patch change in a real GitHub and CI workflow. It binds the exact +> Reploid governs an agent tool, MCP server, permission policy, or +> production-agent configuration release in a real GitHub and CI workflow. It binds the exact > candidate, frozen baseline, evaluator, evidence, disagreement, approval, > activation, outcome, rollback, and reopening conditions. Reploid succeeds > only when the team can approve or reject the change with less reconstruction @@ -124,8 +127,8 @@ continuously improving decision-policy loop remain target capabilities. ## Initial users and market constraints The initial commercial user is an AI platform, developer infrastructure, -reliability, or security operator promoting agent models, prompts, tools, -policies, or production configuration through GitHub and CI. The first workflow +reliability, or security operator promoting agent tools, MCP servers, +permission policies, or production-agent configuration through GitHub and CI. The first workflow must name the repository, controlled change type, current required checks, evaluator, approval authority, activation system, rollback owner, and business condition that makes Reploid preferable. diff --git a/docs/change-passport/dogfood/active-policy.json b/docs/change-passport/dogfood/active-policy.json new file mode 100644 index 00000000..2db18e21 --- /dev/null +++ b/docs/change-passport/dogfood/active-policy.json @@ -0,0 +1,11 @@ +{ + "schema": "reploid.change-passport-policy-activation/v1", + "policyId": "policy:reploid-visual-dogfood", + "version": "1.1.0", + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7", + "source": "docs/change-passport/dogfood/visual-policy-v1.1.0.json", + "scope": "dedicated_visual_dogfood_only", + "authorityId": "human:portfolio-owner", + "appliedAt": "2026-08-23T18:31:37.337Z", + "qualificationGranted": false +} diff --git a/docs/change-passport/dogfood/visual-policy-v1.0.0.json b/docs/change-passport/dogfood/visual-policy-v1.0.0.json new file mode 100644 index 00000000..42ce3204 --- /dev/null +++ b/docs/change-passport/dogfood/visual-policy-v1.0.0.json @@ -0,0 +1,26 @@ +{ + "schema": "change.passport-policy/v1", + "policyId": "policy:reploid-visual-dogfood", + "version": "1.0.0", + "changeClasses": ["source_patch"], + "requiredEvidenceKinds": ["visual_complaint", "source_owned_patch"], + "requiredEvaluationConclusion": "pass", + "requiredReviewerRoles": ["visual_reviewer"], + "minimumApprovals": 1, + "independence": {"proposerEvaluator": true, "proposerReviewer": true, "evaluatorReviewer": true}, + "allowedEffects": ["ci_activation"], + "rollbackAuthorityId": "authority:visual-rollback", + "reopeningRules": [{ + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "sourceKind": "visual_feedback_bridge", + "observationKind": "candidate_artifact_changed", + "targetId": "reploid:dogfood-passports-ui", + "sensorAuthorityId": "authority:bridge-source-observer", + "freshnessMilliseconds": 300000, + "match": {"field": "changed", "operator": "equals", "value": true}, + "action": "review" + }], + "falseBlockTolerance": 0, + "unresolvedBlocksActivation": true, + "policyHash": "sha256:30cad159daf345393f5b27f4acb78256f77426e6ed498992b7c552f00f8d2bbb" +} diff --git a/docs/change-passport/dogfood/visual-policy-v1.1.0.json b/docs/change-passport/dogfood/visual-policy-v1.1.0.json new file mode 100644 index 00000000..d1dc8dd6 --- /dev/null +++ b/docs/change-passport/dogfood/visual-policy-v1.1.0.json @@ -0,0 +1,26 @@ +{ + "schema": "change.passport-policy/v1", + "policyId": "policy:reploid-visual-dogfood", + "version": "1.1.0", + "changeClasses": ["source_patch"], + "requiredEvidenceKinds": ["visual_complaint", "source_owned_patch", "rollback_identity"], + "requiredEvaluationConclusion": "pass", + "requiredReviewerRoles": ["visual_reviewer"], + "minimumApprovals": 1, + "independence": {"proposerEvaluator": true, "proposerReviewer": true, "evaluatorReviewer": true}, + "allowedEffects": ["ci_activation"], + "rollbackAuthorityId": "authority:visual-rollback", + "reopeningRules": [{ + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "sourceKind": "visual_feedback_bridge", + "observationKind": "candidate_artifact_changed", + "targetId": "reploid:dogfood-passports-ui", + "sensorAuthorityId": "authority:bridge-source-observer", + "freshnessMilliseconds": 300000, + "match": {"field": "changed", "operator": "equals", "value": true}, + "action": "review" + }], + "falseBlockTolerance": 0, + "unresolvedBlocksActivation": true, + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7" +} diff --git a/docs/change-passport/github-app-least-privilege.json b/docs/change-passport/github-app-least-privilege.json new file mode 100644 index 00000000..a5d4be09 --- /dev/null +++ b/docs/change-passport/github-app-least-privilege.json @@ -0,0 +1,22 @@ +{ + "schema": "reploid.github-app-permission-contract/v1", + "appSlug": "reploid-change-passport", + "appId": 4693600, + "defaultPermissions": {"checks": "write", "metadata": "read", "pullRequests": "read"}, + "defaultEvents": ["pull_request", "pull_request_review"], + "forbiddenDefaultPermissions": [ + "administration:write", + "contents:write", + "deployments:write", + "environments:write", + "secrets", + "workflows:write" + ], + "effectAdapters": { + "deployment": "separately_enabled", + "permissionRevocation": "separately_enabled", + "rollback": "separately_enabled" + }, + "installationScope": ["clocksmith/reploid"], + "qualificationGranted": false +} diff --git a/docs/change-passport/implementation-plan.md b/docs/change-passport/implementation-plan.md index 60a6b80a..9e3cc502 100644 --- a/docs/change-passport/implementation-plan.md +++ b/docs/change-passport/implementation-plan.md @@ -23,6 +23,9 @@ Current state: Passport dogfood workflow implemented with a physical Chromium oracle, conflict-safe reverse patch, and deterministic reopening. - [x] Live GitHub App installation and App-bound branch-protection rule recorded +- [x] Unproved App check removed from ordinary `main` without rewriting the installation observation +- [x] Dedicated `passport-dogfood` branch created with the App-bound blocking check +- [ ] Existing GitHub App registration reduced to the least-privilege permission contract for `clocksmith/reploid` in the [status artifact](../status/change-passport-github-installation-2026-08-23.json). - [ ] Live blocked and eligible Change Passport check-run evidence recorded. diff --git a/docs/change-passport/product-intent.md b/docs/change-passport/product-intent.md index 7aea1553..a3bc07f9 100644 --- a/docs/change-passport/product-intent.md +++ b/docs/change-passport/product-intent.md @@ -1,10 +1,12 @@ -# Reploid Change Passport Product Intent +# Reploid Agent Release Passport Product Intent ## Product statement -Reploid Change Passport makes an agent-generated change reviewable, -reversible, and automatically reopenable when a declared part of the evidence -or policy basis that allowed it changes. +Reploid Agent Release Passport decides whether an exact versioned agent policy, +tool, MCP server, permission bundle, or production-agent configuration is +eligible to proceed. It preserves why eligibility was granted and reopens the +decision when an authoritative observation invalidates its evidence or policy +basis. The verified claim is narrow: @@ -19,12 +21,13 @@ or successful rollback. The first user is an AI platform, developer infrastructure, reliability, or security operator. The first controlled actions are promotions of: -- a model or model configuration; -- a system prompt or prompt bundle; - an agent tool or MCP server version; - an agent permission or operating policy; - production configuration that changes agent behavior. +Model, prompt, and ordinary source-code changes may use the contract later. +They are not the first commercial wedge. + The change is represented in GitHub and evaluated through CI. Ordinary code changes may use the same contract later, but generic pull-request review is not the first differentiation target. diff --git a/docs/rsi-improvement-episodes.md b/docs/rsi-improvement-episodes.md index 02cfa9c6..c702383a 100644 --- a/docs/rsi-improvement-episodes.md +++ b/docs/rsi-improvement-episodes.md @@ -128,6 +128,21 @@ protein-adjudication cost. Poolday may admit a capability only through its own frozen policy and prospective Research Room evidence. +## Federated strategy projection + +Ouroboros `strategy.episode/v1` is a reference projection over project-owned +evidence. It does not replace this ledger. A Reploid adapter may bind an +immutable episode projection, event head, candidate, evaluator, outcome, and +negative evidence into an Ouroboros episode. Ouroboros may then propose a +human-reviewed strategy consequence, but it cannot promote a Reploid artifact, +rewrite this ledger, change a Reploid claim, or close a Reploid blocker. + +The first reference carrier is a Visual Change Passport dogfood policy +revision. Its candidate may change only the dedicated policy artifact. The +episode protects the evaluator, ledger, verifier, promotion adapter, rollback +path, and general product policy from candidate mutation. Passing establishes +internal causal closure only, never customer value or product qualification. + ## Acceptance evidence - [`tests/unit/improvement-episode.test.js`](../tests/unit/improvement-episode.test.js) diff --git a/docs/status/change-passport-github-authority-boundary-2026-08-23.json b/docs/status/change-passport-github-authority-boundary-2026-08-23.json new file mode 100644 index 00000000..6e6c9322 --- /dev/null +++ b/docs/status/change-passport-github-authority-boundary-2026-08-23.json @@ -0,0 +1,37 @@ +{ + "schema": "reploid.change-passport-github-authority-boundary/v1", + "observedAt": "2026-08-23T18:15:12Z", + "repository": "clocksmith/reploid", + "app": {"slug": "reploid-change-passport", "appId": 4693600}, + "ordinaryMain": { + "requiredPassportCheck": false, + "preservedProtections": [ + "one approving review", + "dismiss stale reviews", + "require approval after latest push", + "linear history", + "resolved conversations", + "force pushes disabled", + "deletions disabled" + ] + }, + "dogfood": { + "branch": "passport-dogfood", + "requiredCheck": "Reploid Change Passport", + "boundAppId": 4693600, + "strict": true, + "liveBlockedAndEligibleRunsObserved": false + }, + "permissionBoundary": { + "targetRef": "docs/change-passport/github-app-least-privilege.json", + "existingRegistrationReduced": false, + "blocker": "GitHub App permission removal requires an owner change in the GitHub App Permissions and events settings." + }, + "claimPermission": { + "githubInstallation": true, + "blockingDogfoodBranchConfigured": true, + "liveCheckBehavior": false, + "productQualification": false, + "commercialValue": false + } +} diff --git a/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/change-passport-export.json b/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/change-passport-export.json new file mode 100644 index 00000000..0cfd77e8 --- /dev/null +++ b/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/change-passport-export.json @@ -0,0 +1,1410 @@ +{ + "schema": "change.passport-export/v1", + "exportedAt": "2026-08-23T18:31:39.019Z", + "passportId": "passport:visual-dogfood:1", + "events": [ + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 1, + "type": "passport.created", + "timestamp": "2026-08-23T18:31:38.381Z", + "previousEventHash": null, + "actor": { + "authorityId": "authority:codex-patch-agent", + "organizationId": "org:reploid-dogfood", + "role": "proposer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:codex-patch-agent", + "contextHash": "sha256:4d050d7c97592e0d4888f5710a071cb4c1c5ab4f74bcf7bd41f2f87af21d0e7e" + } + }, + "payload": { + "passportId": "passport:visual-dogfood:1", + "organizationId": "org:reploid-dogfood", + "changeClass": "source_patch", + "proposal": { + "proposalId": "proposal:change_visual_passport_dogfood", + "title": "Repair the narrow Change Passport lifecycle grid", + "summary": "Govern the exact Bridge-owned patch from complaint through reversal and reopening.", + "repository": { + "provider": "github", + "owner": "clocksmith", + "name": "reploid", + "repositoryId": "github:clocksmith/reploid", + "installationId": 0, + "defaultBranch": "main", + "visibility": "private" + }, + "pullRequestNumber": 0, + "baseRevision": "dogfood-baseline", + "candidateRevision": "bridge-daa600e390ffbf8d", + "baselineHash": "sha256:bd4fcfe5224028f8d2f0e1989bfa7bad52206661db3f484937dbdfee837d54e3", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "manifestHash": "sha256:6d20d0322eea2a9cdb70fb2c470a041b48b612283770cbb9360874287434cb5c", + "target": { + "kind": "source_patch", + "targetId": "reploid:dogfood-passports-ui", + "environment": "local-ci" + }, + "proposerAuthorityId": "authority:codex-patch-agent" + }, + "policy": { + "schema": "change.passport-policy/v1", + "policyId": "policy:reploid-visual-dogfood", + "version": "1.1.0", + "changeClasses": [ + "source_patch" + ], + "requiredEvidenceKinds": [ + "visual_complaint", + "source_owned_patch", + "rollback_identity" + ], + "requiredEvaluationConclusion": "pass", + "requiredReviewerRoles": [ + "visual_reviewer" + ], + "minimumApprovals": 1, + "independence": { + "proposerEvaluator": true, + "proposerReviewer": true, + "evaluatorReviewer": true + }, + "allowedEffects": [ + "ci_activation" + ], + "rollbackAuthorityId": "authority:visual-rollback", + "reopeningRules": [ + { + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "sourceKind": "visual_feedback_bridge", + "observationKind": "candidate_artifact_changed", + "targetId": "reploid:dogfood-passports-ui", + "sensorAuthorityId": "authority:bridge-source-observer", + "freshnessMilliseconds": 300000, + "match": { + "field": "changed", + "operator": "equals", + "value": true + }, + "action": "review" + } + ], + "falseBlockTolerance": 0, + "unresolvedBlocksActivation": true, + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7" + }, + "evaluator": { + "evaluatorId": "evaluator:chromium-narrow-viewport", + "authorityId": "authority:independent-render-oracle", + "version": "1.0.0", + "evaluatorHash": "sha256:66837599303b4338cf9a4398a5a97e54752a7a438b60f060ea62d164732502a9", + "suiteHash": "sha256:02d6a88aef7f7e531a6579b94aa0fb1956a5f61803c42223175f0a646ea2587c", + "contractHash": "sha256:6e5421c429a4f8c510f8f9f4a9e95be120f1d60cca4c5ea228fac0a56d4ab072", + "frozenBeforeCandidate": true + }, + "budget": { + "calls": 1, + "elapsedMilliseconds": 0, + "costAmount": 0, + "costUnit": "local_execution" + }, + "rollback": { + "kind": "visual_feedback_reverse_patch", + "targetId": "reploid:dogfood-passports-ui", + "revision": "dogfood-baseline", + "artifactHash": "sha256:20867cefb71e68bef2543eb902dc7eb2784c37e2593ee1b8d61491889f9952c7", + "authorityId": "authority:visual-rollback" + }, + "evidenceCutoff": "2026-08-23T18:31:38.380Z", + "createdAt": "2026-08-23T18:31:38.380Z", + "sourceEpisode": null + }, + "eventHash": "sha256:07c1b8ac7905eaff42ca2f46fa1a6e6b2aacdf4320a4342a0d475fe575fb31b8", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "cWQwjj2CsPxZOT8k-z-JsgaF5TowYXID1FLR96lu7vd8FdvdmthOo3SytSrXDtGohQfT8-SNlxcaCUAEV_lNDA" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 2, + "type": "trigger.declared", + "timestamp": "2026-08-23T18:31:38.383Z", + "previousEventHash": "sha256:07c1b8ac7905eaff42ca2f46fa1a6e6b2aacdf4320a4342a0d475fe575fb31b8", + "actor": { + "authorityId": "authority:reploid-change-control", + "organizationId": "org:reploid-dogfood", + "role": "change_authority", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:reploid-change-control", + "contextHash": "sha256:2536958609bfb80c202572d745f0ace8a96b69ff18f98f82403c66d5e5454620" + } + }, + "payload": { + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "sourceKind": "visual_feedback_bridge", + "observationKind": "candidate_artifact_changed", + "targetId": "reploid:dogfood-passports-ui", + "action": "review", + "condition": { + "field": "changed", + "operator": "equals", + "value": true + }, + "sensorAuthorityId": "authority:bridge-source-observer", + "observationHash": null, + "observedAt": null, + "freshnessMilliseconds": 300000, + "deduplicationKey": null + }, + "eventHash": "sha256:47782b899349734e605f16d198955d24a491c3e9c69c57e0776f66468aed2294", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "Gtk8G8N3Tl08DeM5YAriij7dkV74gZg-eWj6hKxza1oQ9PrtYIi_pujAmyUW_93Bx1MGbJCpBA65kNtCfhiNBA" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 3, + "type": "evidence.admitted", + "timestamp": "2026-08-23T18:31:38.385Z", + "previousEventHash": "sha256:47782b899349734e605f16d198955d24a491c3e9c69c57e0776f66468aed2294", + "actor": { + "authorityId": "authority:codex-patch-agent", + "organizationId": "org:reploid-dogfood", + "role": "evidence_producer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:codex-patch-agent", + "contextHash": "sha256:4d050d7c97592e0d4888f5710a071cb4c1c5ab4f74bcf7bd41f2f87af21d0e7e" + } + }, + "payload": { + "evidenceId": "evidence:change_visual_passport_dogfood:complaint", + "kind": "visual_complaint", + "digest": "sha256:700a56771a3dcc5d59b33b7d7b1b50d3639080555e3ef5df5b06755de71bf06b", + "source": "Visual Feedback Bridge reploid-dogfood/visual-change-passport-v0", + "uri": "bridge://reploid-dogfood/visual-change-passport-v0/change_visual_passport_dogfood#complaint", + "summary": "1 source-mapped annotation(s) submitted to paired session codex-local-dogfood.", + "observedAt": "2026-08-23T18:31:37.351Z", + "custody": { + "mode": "content_addressed_reference", + "accessRequired": true, + "retention": "bridge_source_owned" + }, + "reason": null + }, + "eventHash": "sha256:8123346afc947a40bc66d5441defcb0a8619064584756ed66ef8071753c222b0", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "yLvQ2XnmueqhZIy8Cg4vQhGYwvPc7Sz1YNZP-C7OLMZ1UuV8UVlGW4lOiDAF1pZPAyGdCrvWrZ7KX6VZW6T4CQ" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 4, + "type": "evidence.admitted", + "timestamp": "2026-08-23T18:31:38.386Z", + "previousEventHash": "sha256:8123346afc947a40bc66d5441defcb0a8619064584756ed66ef8071753c222b0", + "actor": { + "authorityId": "authority:codex-patch-agent", + "organizationId": "org:reploid-dogfood", + "role": "evidence_producer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:codex-patch-agent", + "contextHash": "sha256:4d050d7c97592e0d4888f5710a071cb4c1c5ab4f74bcf7bd41f2f87af21d0e7e" + } + }, + "payload": { + "evidenceId": "evidence:change_visual_passport_dogfood:patch", + "kind": "source_owned_patch", + "digest": "sha256:049c7e493f10ba81783ade0b8adb04a6ecb3437c1d11ea1a0ccc69b561c06205", + "source": "Visual Feedback Bridge reversible patch sha256:20867cefb71e68bef2543eb902dc7eb2784c37e2593ee1b8d61491889f9952c7", + "uri": "bridge://reploid-dogfood/visual-change-passport-v0/change_visual_passport_dogfood#patch", + "summary": "1 file(s) are bound to before/after hashes and a conflict-safe reverse artifact.", + "observedAt": "2026-08-23T18:31:37.363Z", + "custody": { + "mode": "content_addressed_reference", + "accessRequired": true, + "retention": "bridge_source_owned" + }, + "reason": null + }, + "eventHash": "sha256:595a2e66c956c241e5b66066c5b10fb656bf22750e036c790f9c4425ebd2ed7d", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "0iyDDZSmLd0h9tJDSjsh9GCfSGK9GqzCl5rwrUcLsDyxNoCXPz1m9QAbd40-JIAvfpsoJ9Khgg6sM0qgBYV7CA" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 5, + "type": "evidence.admitted", + "timestamp": "2026-08-23T18:31:38.395Z", + "previousEventHash": "sha256:595a2e66c956c241e5b66066c5b10fb656bf22750e036c790f9c4425ebd2ed7d", + "actor": { + "authorityId": "authority:codex-patch-agent", + "organizationId": "org:reploid-dogfood", + "role": "evidence_producer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:codex-patch-agent", + "contextHash": "sha256:4d050d7c97592e0d4888f5710a071cb4c1c5ab4f74bcf7bd41f2f87af21d0e7e" + } + }, + "payload": { + "evidenceId": "evidence:change_visual_passport_dogfood:rollback-identity", + "kind": "rollback_identity", + "digest": "sha256:b4a9de4b088f5c9010ef261767fc7659037d19d4e7643076348461737274da24", + "source": "Change Passport rollback contract visual_feedback_reverse_patch", + "uri": "passport://passport:visual-dogfood:1#rollback", + "summary": "The rollback kind, target, baseline revision, reverse artifact, and named authority are bound before eligibility.", + "observedAt": "2026-08-23T18:31:38.380Z", + "custody": { + "mode": "passport_embedded_contract", + "accessRequired": false, + "retention": "passport_lifetime" + }, + "reason": null + }, + "eventHash": "sha256:1e21a360c2fe16eabdd9718a9b1b821e85ef36b82224d97afae3e99a1df17001", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "kSVOKoMPg_mheuOlBjzjmyj5rIJt9nP4IkpAZUtB3J7Br9rt_dShA44ha7ROuo-YUreA4xne6Wm1aIkrnVKFDg" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 6, + "type": "evidence.frozen", + "timestamp": "2026-08-23T18:31:38.398Z", + "previousEventHash": "sha256:1e21a360c2fe16eabdd9718a9b1b821e85ef36b82224d97afae3e99a1df17001", + "actor": { + "authorityId": "authority:reploid-change-control", + "organizationId": "org:reploid-dogfood", + "role": "change_authority", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:reploid-change-control", + "contextHash": "sha256:2536958609bfb80c202572d745f0ace8a96b69ff18f98f82403c66d5e5454620" + } + }, + "payload": { + "manifestHash": "sha256:3a7c454613620e04921adeb6dbf6ed7d803e97cb45b3280e4b8b4f68ee577246", + "evidenceIds": [ + "evidence:change_visual_passport_dogfood:complaint", + "evidence:change_visual_passport_dogfood:patch", + "evidence:change_visual_passport_dogfood:rollback-identity" + ], + "cutoff": "2026-08-23T18:31:38.380Z" + }, + "eventHash": "sha256:070694af7ff2116029eb2a479acc0cd31d58beef125bd1ad800b7f589ce8f929", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "WTM_AFUtbTkFUhUJzFhz0t59zWv_8EbpESzJIiADaKquFoc4PtAHjhPefRLs52zyAy7LTGJLA2UUszT9UNX4DA" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 7, + "type": "evaluation.recorded", + "timestamp": "2026-08-23T18:31:38.402Z", + "previousEventHash": "sha256:070694af7ff2116029eb2a479acc0cd31d58beef125bd1ad800b7f589ce8f929", + "actor": { + "authorityId": "authority:independent-render-oracle", + "organizationId": "org:reploid-dogfood", + "role": "evaluator", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:independent-render-oracle", + "contextHash": "sha256:65cf55dd85e3737d6f1efe54c69ff06ec44c94560ca521f5d1262ad651fb3500" + } + }, + "payload": { + "evaluationId": "evaluation:ee6391bcae82ded060d77ed8", + "evaluatorId": "evaluator:chromium-narrow-viewport", + "evaluatorAuthorityId": "authority:independent-render-oracle", + "evaluatorHash": "sha256:66837599303b4338cf9a4398a5a97e54752a7a438b60f060ea62d164732502a9", + "suiteHash": "sha256:02d6a88aef7f7e531a6579b94aa0fb1956a5f61803c42223175f0a646ea2587c", + "contractHash": "sha256:6e5421c429a4f8c510f8f9f4a9e95be120f1d60cca4c5ea228fac0a56d4ab072", + "baselineHash": "sha256:bd4fcfe5224028f8d2f0e1989bfa7bad52206661db3f484937dbdfee837d54e3", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "evidenceManifestHash": "sha256:3a7c454613620e04921adeb6dbf6ed7d803e97cb45b3280e4b8b4f68ee577246", + "conclusion": "pass", + "metrics": [ + { + "metricId": "visual_evaluation_receipt", + "value": "sha256:a7fd699a3e8c2a6adaa428eceb81dcbf1e665c02ee6391bcae82ded060d77ed8" + }, + { + "metricId": "bridge-owned-file-closure", + "value": 1 + }, + { + "metricId": "render:narrow-viewport-lifecycle-grid", + "value": 1 + } + ], + "limitations": [], + "observedAt": "2026-08-23T18:31:38.378Z" + }, + "eventHash": "sha256:fdcf6901dcf5491691082ba8ae2f93987b9a8f9504078f0ce3257de7647b3957", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "vf7-4sBLdNCFPJZWICtbQOTYIr6XbADaF8POVMUoYoLDkCx521oRMnxvvuf2ShClpbU6hIZ_O8ZBx_x-8TTCCA" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 8, + "type": "review.recorded", + "timestamp": "2026-08-23T18:31:38.407Z", + "previousEventHash": "sha256:fdcf6901dcf5491691082ba8ae2f93987b9a8f9504078f0ce3257de7647b3957", + "actor": { + "authorityId": "authority:local-human-reviewer", + "organizationId": "org:reploid-dogfood", + "role": "visual_reviewer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:local-human-reviewer", + "contextHash": "sha256:56c7528776db1662a570e9b095255df0fcbaf8cdfa0021a2e74a687fc4e841a7" + } + }, + "payload": { + "reviewId": "review:1735e153fd76eac2ef5f8c76", + "verdict": "approve", + "rationale": "The exact responsive patch passed the frozen independent browser oracle.", + "resolvesObjectionIds": [], + "evidenceIds": [ + "evidence:change_visual_passport_dogfood:complaint", + "evidence:change_visual_passport_dogfood:patch", + "evidence:change_visual_passport_dogfood:rollback-identity" + ] + }, + "eventHash": "sha256:4ec8e8a9757fb1cde652d2a1ba7506de5601519f204404356c7367bf4d96dac0", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "_OnW6DZG7YKbcI828hj39CldCnd0TQ78pJ1bMCo9IlmaAjR1cuf58nufAHbZJJvp0sVFmj3UQLmAjH8ThinsBw" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 9, + "type": "decision.recorded", + "timestamp": "2026-08-23T18:31:38.411Z", + "previousEventHash": "sha256:4ec8e8a9757fb1cde652d2a1ba7506de5601519f204404356c7367bf4d96dac0", + "actor": { + "authorityId": "authority:reploid-change-control", + "organizationId": "org:reploid-dogfood", + "role": "change_authority", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:reploid-change-control", + "contextHash": "sha256:2536958609bfb80c202572d745f0ace8a96b69ff18f98f82403c66d5e5454620" + } + }, + "payload": { + "decisionId": "decision:1735e153fd76eac2ef5f8c76", + "state": "approved", + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7", + "evaluationIds": [ + "evaluation:ee6391bcae82ded060d77ed8" + ], + "reviewIds": [ + "review:1735e153fd76eac2ef5f8c76" + ], + "rationale": "The exact source-owned patch passed frozen independent evaluation and received explicit human acceptance." + }, + "eventHash": "sha256:8897920677a5d06daa4ac26a60fa881f9e8147ac3577fb771803dffed812a758", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "b_K9K6OHZdnqaZJaN1g2UTGiesd5KfgDwNq2Spl0B3GZOGWJAlk9E3CmuzgoefNNQ7wXpET1okQNlsEBrDPNBQ" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 10, + "type": "effect.requested", + "timestamp": "2026-08-23T18:31:38.418Z", + "previousEventHash": "sha256:8897920677a5d06daa4ac26a60fa881f9e8147ac3577fb771803dffed812a758", + "actor": { + "authorityId": "authority:local-ci", + "organizationId": "org:reploid-dogfood", + "role": "activator", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:local-ci", + "contextHash": "sha256:b2daf7c2b847e9bebbd08c6deb212c458426282ec37ec16d3f091553c47a0dd8" + } + }, + "payload": { + "effectId": "effect:visual:change_visual_passport_dogfood", + "kind": "ci_activation", + "targetId": "reploid:dogfood-passports-ui", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "decisionEventHash": "sha256:8897920677a5d06daa4ac26a60fa881f9e8147ac3577fb771803dffed812a758", + "idempotencyKey": "visual-ci:48b612283770cbb9360874287434cb5c" + }, + "eventHash": "sha256:17628f22cad4fc0ae7251ea72b848833859ae71487f8632649f9befe3f6439ce", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "iYKYTvoFd20MEEp3QJRiASXpWMjASya6ubFxmE0nflmH7TtLR28mt-3w9iHHJmL7ZBW6rcqAbWJPOLZa0EeFCw" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 11, + "type": "effect.recorded", + "timestamp": "2026-08-23T18:31:38.424Z", + "previousEventHash": "sha256:17628f22cad4fc0ae7251ea72b848833859ae71487f8632649f9befe3f6439ce", + "actor": { + "authorityId": "authority:local-ci", + "organizationId": "org:reploid-dogfood", + "role": "activator", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:local-ci", + "contextHash": "sha256:b2daf7c2b847e9bebbd08c6deb212c458426282ec37ec16d3f091553c47a0dd8" + } + }, + "payload": { + "effectId": "effect:visual:change_visual_passport_dogfood", + "status": "applied", + "targetId": "reploid:dogfood-passports-ui", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "externalReference": "file:///var/folders/85/l5dptg296tlfx03cd_k7h0l80000gn/T/reploid-visual-change-passport-vyYugc/ci-activation.json", + "observedAt": "2026-08-23T18:31:38.423Z", + "failureReason": null + }, + "eventHash": "sha256:344129028029e506d00476a41368467934a4b6b469abde4be3f99365e49c53c4", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "zKsheJFcKg7mn_F0r9kDpuuZNto-gI39S1ymaFZ4OAZqveVxpOCcDhD8jRqjvvu1GRN60lLMf-jIa8bFFSaPCA" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 12, + "type": "outcome.recorded", + "timestamp": "2026-08-23T18:31:38.981Z", + "previousEventHash": "sha256:344129028029e506d00476a41368467934a4b6b469abde4be3f99365e49c53c4", + "actor": { + "authorityId": "authority:bridge-source-observer", + "organizationId": "org:reploid-dogfood", + "role": "observer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:bridge-source-observer", + "contextHash": "sha256:5b02b3d1cb9be0a56eaa864b572a88839674f2069ef093e1d251017ef79428c6" + } + }, + "payload": { + "outcomeId": "outcome:render:c6bcd65bb43e31b379c1698f", + "effectId": "effect:visual:change_visual_passport_dogfood", + "observationHash": "sha256:e98ac32639fc5b9d4e831e699d89022faced64dfc6bcd65bb43e31b379c1698f", + "source": "Independent chromium-playwright render oracle after CI activation", + "status": "verified", + "summary": "Activated candidate rendered at /passports and passed 1 frozen assertion(s).", + "observedAt": "2026-08-23T18:31:38.975Z" + }, + "eventHash": "sha256:c5c8e8cfbe6b5e3d765650a0f541a70d0100835b8457fe1eda285e5ab87fdcf3", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "b6n8VhwyFpfhKcTapIIGgs4TmNsRfyL5jD1nYPeg-FwBnOAYtwQVKhDFEaYURBagEo1YbDYYZFt1Nfa4nRP-Cg" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 13, + "type": "outcome.recorded", + "timestamp": "2026-08-23T18:31:39.006Z", + "previousEventHash": "sha256:c5c8e8cfbe6b5e3d765650a0f541a70d0100835b8457fe1eda285e5ab87fdcf3", + "actor": { + "authorityId": "authority:bridge-source-observer", + "organizationId": "org:reploid-dogfood", + "role": "observer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:bridge-source-observer", + "contextHash": "sha256:5b02b3d1cb9be0a56eaa864b572a88839674f2069ef093e1d251017ef79428c6" + } + }, + "payload": { + "outcomeId": "outcome:reverse:b0be91423693106009f9a552", + "effectId": "effect:visual:change_visual_passport_dogfood", + "observationHash": "sha256:5fffc6fc82301d2500c878708f05a93882abee31b0be91423693106009f9a552", + "source": "Visual Feedback Bridge conflict-safe reverse patch for change_visual_passport_dogfood", + "status": "source_reverted", + "summary": "The source-owned patch restored its frozen baseline. This observation does not assert that any external activation rolled back.", + "observedAt": "2026-08-23T18:31:39.000Z" + }, + "eventHash": "sha256:19a6ca3b6a97aecc2d740c4952166f40bc8f07585345b7cd75714fe8f362e713", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "RJ4ZYAsHyy8y8TqeAoCv3eLxCtKcLDPQaJNMLBu-fVA4UcSGxWFlAtZFN_rXhoIjPQ9a5ii1xX3IKkVPlUeNBw" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 14, + "type": "trigger.observed", + "timestamp": "2026-08-23T18:31:39.013Z", + "previousEventHash": "sha256:19a6ca3b6a97aecc2d740c4952166f40bc8f07585345b7cd75714fe8f362e713", + "actor": { + "authorityId": "authority:bridge-source-observer", + "organizationId": "org:reploid-dogfood", + "role": "observer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:bridge-source-observer", + "contextHash": "sha256:5b02b3d1cb9be0a56eaa864b572a88839674f2069ef093e1d251017ef79428c6" + } + }, + "payload": { + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "sourceKind": "visual_feedback_bridge", + "observationKind": "candidate_artifact_changed", + "targetId": "reploid:dogfood-passports-ui", + "action": "review", + "condition": { + "previousHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "currentHash": "sha256:bd4fcfe5224028f8d2f0e1989bfa7bad52206661db3f484937dbdfee837d54e3", + "changed": true + }, + "sensorAuthorityId": "authority:bridge-source-observer", + "observationHash": "sha256:c313fab6269c9a02be6f871dacdc29fea1e4f207bf78761f27f646042c82d00b", + "observedAt": "2026-08-23T18:31:39.000Z", + "freshnessMilliseconds": 300000, + "deduplicationKey": "visual-reverse:82abee31b0be91423693106009f9a552" + }, + "eventHash": "sha256:c7c26f62351c5a879d869c6deb47f92386507c81d0d58121d79bcc16190c52b9", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "FiUbx3ZXO-bX3Z1BX7TnSpMqkcd0jKPCD4qK203AVWcyZ25arN99BePqSHxZr9qKfR7mLd2yl5FrWOTr0OxRCw" + } + }, + { + "schema": "change.passport-event/v1", + "passportId": "passport:visual-dogfood:1", + "sequence": 15, + "type": "decision.reopened", + "timestamp": "2026-08-23T18:31:39.014Z", + "previousEventHash": "sha256:c7c26f62351c5a879d869c6deb47f92386507c81d0d58121d79bcc16190c52b9", + "actor": { + "authorityId": "authority:change-control-service", + "organizationId": "org:reploid-dogfood", + "role": "change_authority", + "authentication": { + "kind": "deterministic_projection", + "subject": "change-control-trigger-projector", + "contextHash": "sha256:fa43d1d6264e62150ebe02ebba7e301851e6768afa03ce3fb509c655a95e6a80" + } + }, + "payload": { + "reopeningId": "reopening:d0d58121d79bcc16190c52b9", + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "triggerEventHash": "sha256:c7c26f62351c5a879d869c6deb47f92386507c81d0d58121d79bcc16190c52b9", + "requestedAction": "review", + "reason": "Declared trigger rule:visual-source:reploid:dogfood-passports-ui matched observation sha256:c313fab6269c9a02be6f871dacdc29fea1e4f207bf78761f27f646042c82d00b." + }, + "eventHash": "sha256:00861f8a1c9e5b14890a104e618ca08e7bf77e940e1e8541a865551bc303a005", + "signature": { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + }, + "value": "x5MzxKLkywrM54SkN76-a59SIiiotXHdgYl5yq8Ok2OYdDPxRZ3kMp5-o7WMQBaUsGI4yBKJnV9XZh9U8XH4CA" + } + } + ], + "publicKeys": [ + { + "signerId": "peer:0ea1ff7dacb37b1d37db564b", + "algorithm": "Ed25519", + "publicJwk": { + "key_ops": [ + "verify" + ], + "ext": true, + "alg": "Ed25519", + "crv": "Ed25519", + "x": "6gb3jETz3UnRBvSC_GInG2ibBqBQ6PETCZonayZzKZY", + "kty": "OKP" + } + } + ], + "policy": { + "schema": "change.passport-policy/v1", + "policyId": "policy:reploid-visual-dogfood", + "version": "1.1.0", + "changeClasses": [ + "source_patch" + ], + "requiredEvidenceKinds": [ + "visual_complaint", + "source_owned_patch", + "rollback_identity" + ], + "requiredEvaluationConclusion": "pass", + "requiredReviewerRoles": [ + "visual_reviewer" + ], + "minimumApprovals": 1, + "independence": { + "proposerEvaluator": true, + "proposerReviewer": true, + "evaluatorReviewer": true + }, + "allowedEffects": [ + "ci_activation" + ], + "rollbackAuthorityId": "authority:visual-rollback", + "reopeningRules": [ + { + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "sourceKind": "visual_feedback_bridge", + "observationKind": "candidate_artifact_changed", + "targetId": "reploid:dogfood-passports-ui", + "sensorAuthorityId": "authority:bridge-source-observer", + "freshnessMilliseconds": 300000, + "match": { + "field": "changed", + "operator": "equals", + "value": true + }, + "action": "review" + } + ], + "falseBlockTolerance": 0, + "unresolvedBlocksActivation": true, + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7" + }, + "evidenceManifest": [ + { + "evidenceId": "evidence:change_visual_passport_dogfood:complaint", + "kind": "visual_complaint", + "digest": "sha256:700a56771a3dcc5d59b33b7d7b1b50d3639080555e3ef5df5b06755de71bf06b", + "source": "Visual Feedback Bridge reploid-dogfood/visual-change-passport-v0", + "uri": "bridge://reploid-dogfood/visual-change-passport-v0/change_visual_passport_dogfood#complaint", + "custody": { + "mode": "content_addressed_reference", + "accessRequired": true, + "retention": "bridge_source_owned" + } + }, + { + "evidenceId": "evidence:change_visual_passport_dogfood:patch", + "kind": "source_owned_patch", + "digest": "sha256:049c7e493f10ba81783ade0b8adb04a6ecb3437c1d11ea1a0ccc69b561c06205", + "source": "Visual Feedback Bridge reversible patch sha256:20867cefb71e68bef2543eb902dc7eb2784c37e2593ee1b8d61491889f9952c7", + "uri": "bridge://reploid-dogfood/visual-change-passport-v0/change_visual_passport_dogfood#patch", + "custody": { + "mode": "content_addressed_reference", + "accessRequired": true, + "retention": "bridge_source_owned" + } + }, + { + "evidenceId": "evidence:change_visual_passport_dogfood:rollback-identity", + "kind": "rollback_identity", + "digest": "sha256:b4a9de4b088f5c9010ef261767fc7659037d19d4e7643076348461737274da24", + "source": "Change Passport rollback contract visual_feedback_reverse_patch", + "uri": "passport://passport:visual-dogfood:1#rollback", + "custody": { + "mode": "passport_embedded_contract", + "accessRequired": false, + "retention": "passport_lifetime" + } + } + ], + "projection": { + "schema": "change.passport/v1", + "passportId": "passport:visual-dogfood:1", + "organizationId": "org:reploid-dogfood", + "changeClass": "source_patch", + "proposal": { + "proposalId": "proposal:change_visual_passport_dogfood", + "title": "Repair the narrow Change Passport lifecycle grid", + "summary": "Govern the exact Bridge-owned patch from complaint through reversal and reopening.", + "repository": { + "provider": "github", + "owner": "clocksmith", + "name": "reploid", + "repositoryId": "github:clocksmith/reploid", + "installationId": 0, + "defaultBranch": "main", + "visibility": "private" + }, + "pullRequestNumber": 0, + "baseRevision": "dogfood-baseline", + "candidateRevision": "bridge-daa600e390ffbf8d", + "baselineHash": "sha256:bd4fcfe5224028f8d2f0e1989bfa7bad52206661db3f484937dbdfee837d54e3", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "manifestHash": "sha256:6d20d0322eea2a9cdb70fb2c470a041b48b612283770cbb9360874287434cb5c", + "target": { + "kind": "source_patch", + "targetId": "reploid:dogfood-passports-ui", + "environment": "local-ci" + }, + "proposerAuthorityId": "authority:codex-patch-agent" + }, + "policy": { + "schema": "change.passport-policy/v1", + "policyId": "policy:reploid-visual-dogfood", + "version": "1.1.0", + "changeClasses": [ + "source_patch" + ], + "requiredEvidenceKinds": [ + "visual_complaint", + "source_owned_patch", + "rollback_identity" + ], + "requiredEvaluationConclusion": "pass", + "requiredReviewerRoles": [ + "visual_reviewer" + ], + "minimumApprovals": 1, + "independence": { + "proposerEvaluator": true, + "proposerReviewer": true, + "evaluatorReviewer": true + }, + "allowedEffects": [ + "ci_activation" + ], + "rollbackAuthorityId": "authority:visual-rollback", + "reopeningRules": [ + { + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "sourceKind": "visual_feedback_bridge", + "observationKind": "candidate_artifact_changed", + "targetId": "reploid:dogfood-passports-ui", + "sensorAuthorityId": "authority:bridge-source-observer", + "freshnessMilliseconds": 300000, + "match": { + "field": "changed", + "operator": "equals", + "value": true + }, + "action": "review" + } + ], + "falseBlockTolerance": 0, + "unresolvedBlocksActivation": true, + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7" + }, + "evaluator": { + "evaluatorId": "evaluator:chromium-narrow-viewport", + "authorityId": "authority:independent-render-oracle", + "version": "1.0.0", + "evaluatorHash": "sha256:66837599303b4338cf9a4398a5a97e54752a7a438b60f060ea62d164732502a9", + "suiteHash": "sha256:02d6a88aef7f7e531a6579b94aa0fb1956a5f61803c42223175f0a646ea2587c", + "contractHash": "sha256:6e5421c429a4f8c510f8f9f4a9e95be120f1d60cca4c5ea228fac0a56d4ab072", + "frozenBeforeCandidate": true + }, + "budget": { + "calls": 1, + "elapsedMilliseconds": 0, + "costAmount": 0, + "costUnit": "local_execution" + }, + "rollback": { + "kind": "visual_feedback_reverse_patch", + "targetId": "reploid:dogfood-passports-ui", + "revision": "dogfood-baseline", + "artifactHash": "sha256:20867cefb71e68bef2543eb902dc7eb2784c37e2593ee1b8d61491889f9952c7", + "authorityId": "authority:visual-rollback" + }, + "evidenceCutoff": "2026-08-23T18:31:38.380Z", + "createdAt": "2026-08-23T18:31:38.380Z", + "updatedAt": "2026-08-23T18:31:39.014Z", + "sourceEpisode": null, + "evidence": { + "state": "frozen", + "manifestHash": "sha256:3a7c454613620e04921adeb6dbf6ed7d803e97cb45b3280e4b8b4f68ee577246", + "admitted": [ + { + "evidenceId": "evidence:change_visual_passport_dogfood:complaint", + "kind": "visual_complaint", + "digest": "sha256:700a56771a3dcc5d59b33b7d7b1b50d3639080555e3ef5df5b06755de71bf06b", + "source": "Visual Feedback Bridge reploid-dogfood/visual-change-passport-v0", + "uri": "bridge://reploid-dogfood/visual-change-passport-v0/change_visual_passport_dogfood#complaint", + "summary": "1 source-mapped annotation(s) submitted to paired session codex-local-dogfood.", + "observedAt": "2026-08-23T18:31:37.351Z", + "custody": { + "mode": "content_addressed_reference", + "accessRequired": true, + "retention": "bridge_source_owned" + }, + "reason": null, + "eventHash": "sha256:8123346afc947a40bc66d5441defcb0a8619064584756ed66ef8071753c222b0", + "actor": { + "authorityId": "authority:codex-patch-agent", + "organizationId": "org:reploid-dogfood", + "role": "evidence_producer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:codex-patch-agent", + "contextHash": "sha256:4d050d7c97592e0d4888f5710a071cb4c1c5ab4f74bcf7bd41f2f87af21d0e7e" + } + } + }, + { + "evidenceId": "evidence:change_visual_passport_dogfood:patch", + "kind": "source_owned_patch", + "digest": "sha256:049c7e493f10ba81783ade0b8adb04a6ecb3437c1d11ea1a0ccc69b561c06205", + "source": "Visual Feedback Bridge reversible patch sha256:20867cefb71e68bef2543eb902dc7eb2784c37e2593ee1b8d61491889f9952c7", + "uri": "bridge://reploid-dogfood/visual-change-passport-v0/change_visual_passport_dogfood#patch", + "summary": "1 file(s) are bound to before/after hashes and a conflict-safe reverse artifact.", + "observedAt": "2026-08-23T18:31:37.363Z", + "custody": { + "mode": "content_addressed_reference", + "accessRequired": true, + "retention": "bridge_source_owned" + }, + "reason": null, + "eventHash": "sha256:595a2e66c956c241e5b66066c5b10fb656bf22750e036c790f9c4425ebd2ed7d", + "actor": { + "authorityId": "authority:codex-patch-agent", + "organizationId": "org:reploid-dogfood", + "role": "evidence_producer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:codex-patch-agent", + "contextHash": "sha256:4d050d7c97592e0d4888f5710a071cb4c1c5ab4f74bcf7bd41f2f87af21d0e7e" + } + } + }, + { + "evidenceId": "evidence:change_visual_passport_dogfood:rollback-identity", + "kind": "rollback_identity", + "digest": "sha256:b4a9de4b088f5c9010ef261767fc7659037d19d4e7643076348461737274da24", + "source": "Change Passport rollback contract visual_feedback_reverse_patch", + "uri": "passport://passport:visual-dogfood:1#rollback", + "summary": "The rollback kind, target, baseline revision, reverse artifact, and named authority are bound before eligibility.", + "observedAt": "2026-08-23T18:31:38.380Z", + "custody": { + "mode": "passport_embedded_contract", + "accessRequired": false, + "retention": "passport_lifetime" + }, + "reason": null, + "eventHash": "sha256:1e21a360c2fe16eabdd9718a9b1b821e85ef36b82224d97afae3e99a1df17001", + "actor": { + "authorityId": "authority:codex-patch-agent", + "organizationId": "org:reploid-dogfood", + "role": "evidence_producer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:codex-patch-agent", + "contextHash": "sha256:4d050d7c97592e0d4888f5710a071cb4c1c5ab4f74bcf7bd41f2f87af21d0e7e" + } + } + } + ], + "excluded": [], + "invalidations": [] + }, + "decision": { + "state": "reopened", + "current": { + "decisionId": "decision:1735e153fd76eac2ef5f8c76", + "state": "approved", + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7", + "evaluationIds": [ + "evaluation:ee6391bcae82ded060d77ed8" + ], + "reviewIds": [ + "review:1735e153fd76eac2ef5f8c76" + ], + "rationale": "The exact source-owned patch passed frozen independent evaluation and received explicit human acceptance.", + "eventHash": "sha256:8897920677a5d06daa4ac26a60fa881f9e8147ac3577fb771803dffed812a758", + "actor": { + "authorityId": "authority:reploid-change-control", + "organizationId": "org:reploid-dogfood", + "role": "change_authority", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:reploid-change-control", + "contextHash": "sha256:2536958609bfb80c202572d745f0ace8a96b69ff18f98f82403c66d5e5454620" + } + } + }, + "history": [ + { + "decisionId": "decision:1735e153fd76eac2ef5f8c76", + "state": "approved", + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7", + "evaluationIds": [ + "evaluation:ee6391bcae82ded060d77ed8" + ], + "reviewIds": [ + "review:1735e153fd76eac2ef5f8c76" + ], + "rationale": "The exact source-owned patch passed frozen independent evaluation and received explicit human acceptance.", + "eventHash": "sha256:8897920677a5d06daa4ac26a60fa881f9e8147ac3577fb771803dffed812a758", + "actor": { + "authorityId": "authority:reploid-change-control", + "organizationId": "org:reploid-dogfood", + "role": "change_authority", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:reploid-change-control", + "contextHash": "sha256:2536958609bfb80c202572d745f0ace8a96b69ff18f98f82403c66d5e5454620" + } + } + } + ], + "reopenings": [ + { + "reopeningId": "reopening:d0d58121d79bcc16190c52b9", + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "triggerEventHash": "sha256:c7c26f62351c5a879d869c6deb47f92386507c81d0d58121d79bcc16190c52b9", + "requestedAction": "review", + "reason": "Declared trigger rule:visual-source:reploid:dogfood-passports-ui matched observation sha256:c313fab6269c9a02be6f871dacdc29fea1e4f207bf78761f27f646042c82d00b.", + "eventHash": "sha256:00861f8a1c9e5b14890a104e618ca08e7bf77e940e1e8541a865551bc303a005", + "actor": { + "authorityId": "authority:change-control-service", + "organizationId": "org:reploid-dogfood", + "role": "change_authority", + "authentication": { + "kind": "deterministic_projection", + "subject": "change-control-trigger-projector", + "contextHash": "sha256:fa43d1d6264e62150ebe02ebba7e301851e6768afa03ce3fb509c655a95e6a80" + } + } + } + ], + "revocations": [] + }, + "effect": { + "state": "applied", + "current": { + "effectId": "effect:visual:change_visual_passport_dogfood", + "status": "applied", + "targetId": "reploid:dogfood-passports-ui", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "externalReference": "file:///var/folders/85/l5dptg296tlfx03cd_k7h0l80000gn/T/reploid-visual-change-passport-vyYugc/ci-activation.json", + "observedAt": "2026-08-23T18:31:38.423Z", + "failureReason": null, + "eventHash": "sha256:344129028029e506d00476a41368467934a4b6b469abde4be3f99365e49c53c4", + "actor": { + "authorityId": "authority:local-ci", + "organizationId": "org:reploid-dogfood", + "role": "activator", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:local-ci", + "contextHash": "sha256:b2daf7c2b847e9bebbd08c6deb212c458426282ec37ec16d3f091553c47a0dd8" + } + } + }, + "requests": [ + { + "effectId": "effect:visual:change_visual_passport_dogfood", + "kind": "ci_activation", + "targetId": "reploid:dogfood-passports-ui", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "decisionEventHash": "sha256:8897920677a5d06daa4ac26a60fa881f9e8147ac3577fb771803dffed812a758", + "idempotencyKey": "visual-ci:48b612283770cbb9360874287434cb5c", + "eventHash": "sha256:17628f22cad4fc0ae7251ea72b848833859ae71487f8632649f9befe3f6439ce", + "actor": { + "authorityId": "authority:local-ci", + "organizationId": "org:reploid-dogfood", + "role": "activator", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:local-ci", + "contextHash": "sha256:b2daf7c2b847e9bebbd08c6deb212c458426282ec37ec16d3f091553c47a0dd8" + } + } + } + ], + "history": [ + { + "effectId": "effect:visual:change_visual_passport_dogfood", + "status": "applied", + "targetId": "reploid:dogfood-passports-ui", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "externalReference": "file:///var/folders/85/l5dptg296tlfx03cd_k7h0l80000gn/T/reploid-visual-change-passport-vyYugc/ci-activation.json", + "observedAt": "2026-08-23T18:31:38.423Z", + "failureReason": null, + "eventHash": "sha256:344129028029e506d00476a41368467934a4b6b469abde4be3f99365e49c53c4", + "actor": { + "authorityId": "authority:local-ci", + "organizationId": "org:reploid-dogfood", + "role": "activator", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:local-ci", + "contextHash": "sha256:b2daf7c2b847e9bebbd08c6deb212c458426282ec37ec16d3f091553c47a0dd8" + } + } + } + ], + "rollbackRequests": [], + "rollbackHistory": [] + }, + "objections": [], + "evaluations": [ + { + "evaluationId": "evaluation:ee6391bcae82ded060d77ed8", + "evaluatorId": "evaluator:chromium-narrow-viewport", + "evaluatorAuthorityId": "authority:independent-render-oracle", + "evaluatorHash": "sha256:66837599303b4338cf9a4398a5a97e54752a7a438b60f060ea62d164732502a9", + "suiteHash": "sha256:02d6a88aef7f7e531a6579b94aa0fb1956a5f61803c42223175f0a646ea2587c", + "contractHash": "sha256:6e5421c429a4f8c510f8f9f4a9e95be120f1d60cca4c5ea228fac0a56d4ab072", + "baselineHash": "sha256:bd4fcfe5224028f8d2f0e1989bfa7bad52206661db3f484937dbdfee837d54e3", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "evidenceManifestHash": "sha256:3a7c454613620e04921adeb6dbf6ed7d803e97cb45b3280e4b8b4f68ee577246", + "conclusion": "pass", + "metrics": [ + { + "metricId": "visual_evaluation_receipt", + "value": "sha256:a7fd699a3e8c2a6adaa428eceb81dcbf1e665c02ee6391bcae82ded060d77ed8" + }, + { + "metricId": "bridge-owned-file-closure", + "value": 1 + }, + { + "metricId": "render:narrow-viewport-lifecycle-grid", + "value": 1 + } + ], + "limitations": [], + "observedAt": "2026-08-23T18:31:38.378Z", + "eventHash": "sha256:fdcf6901dcf5491691082ba8ae2f93987b9a8f9504078f0ce3257de7647b3957", + "actor": { + "authorityId": "authority:independent-render-oracle", + "organizationId": "org:reploid-dogfood", + "role": "evaluator", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:independent-render-oracle", + "contextHash": "sha256:65cf55dd85e3737d6f1efe54c69ff06ec44c94560ca521f5d1262ad651fb3500" + } + } + } + ], + "reviews": [ + { + "reviewId": "review:1735e153fd76eac2ef5f8c76", + "verdict": "approve", + "rationale": "The exact responsive patch passed the frozen independent browser oracle.", + "resolvesObjectionIds": [], + "evidenceIds": [ + "evidence:change_visual_passport_dogfood:complaint", + "evidence:change_visual_passport_dogfood:patch", + "evidence:change_visual_passport_dogfood:rollback-identity" + ], + "eventHash": "sha256:4ec8e8a9757fb1cde652d2a1ba7506de5601519f204404356c7367bf4d96dac0", + "actor": { + "authorityId": "authority:local-human-reviewer", + "organizationId": "org:reploid-dogfood", + "role": "visual_reviewer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:local-human-reviewer", + "contextHash": "sha256:56c7528776db1662a570e9b095255df0fcbaf8cdfa0021a2e74a687fc4e841a7" + } + } + } + ], + "outcomes": [ + { + "outcomeId": "outcome:render:c6bcd65bb43e31b379c1698f", + "effectId": "effect:visual:change_visual_passport_dogfood", + "observationHash": "sha256:e98ac32639fc5b9d4e831e699d89022faced64dfc6bcd65bb43e31b379c1698f", + "source": "Independent chromium-playwright render oracle after CI activation", + "status": "verified", + "summary": "Activated candidate rendered at /passports and passed 1 frozen assertion(s).", + "observedAt": "2026-08-23T18:31:38.975Z", + "eventHash": "sha256:c5c8e8cfbe6b5e3d765650a0f541a70d0100835b8457fe1eda285e5ab87fdcf3", + "actor": { + "authorityId": "authority:bridge-source-observer", + "organizationId": "org:reploid-dogfood", + "role": "observer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:bridge-source-observer", + "contextHash": "sha256:5b02b3d1cb9be0a56eaa864b572a88839674f2069ef093e1d251017ef79428c6" + } + } + }, + { + "outcomeId": "outcome:reverse:b0be91423693106009f9a552", + "effectId": "effect:visual:change_visual_passport_dogfood", + "observationHash": "sha256:5fffc6fc82301d2500c878708f05a93882abee31b0be91423693106009f9a552", + "source": "Visual Feedback Bridge conflict-safe reverse patch for change_visual_passport_dogfood", + "status": "source_reverted", + "summary": "The source-owned patch restored its frozen baseline. This observation does not assert that any external activation rolled back.", + "observedAt": "2026-08-23T18:31:39.000Z", + "eventHash": "sha256:19a6ca3b6a97aecc2d740c4952166f40bc8f07585345b7cd75714fe8f362e713", + "actor": { + "authorityId": "authority:bridge-source-observer", + "organizationId": "org:reploid-dogfood", + "role": "observer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:bridge-source-observer", + "contextHash": "sha256:5b02b3d1cb9be0a56eaa864b572a88839674f2069ef093e1d251017ef79428c6" + } + } + } + ], + "triggers": { + "declared": [ + { + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "sourceKind": "visual_feedback_bridge", + "observationKind": "candidate_artifact_changed", + "targetId": "reploid:dogfood-passports-ui", + "action": "review", + "condition": { + "field": "changed", + "operator": "equals", + "value": true + }, + "sensorAuthorityId": "authority:bridge-source-observer", + "observationHash": null, + "observedAt": null, + "freshnessMilliseconds": 300000, + "deduplicationKey": null, + "eventHash": "sha256:47782b899349734e605f16d198955d24a491c3e9c69c57e0776f66468aed2294", + "actor": { + "authorityId": "authority:reploid-change-control", + "organizationId": "org:reploid-dogfood", + "role": "change_authority", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:reploid-change-control", + "contextHash": "sha256:2536958609bfb80c202572d745f0ace8a96b69ff18f98f82403c66d5e5454620" + } + } + } + ], + "observed": [ + { + "ruleId": "rule:visual-source:reploid:dogfood-passports-ui", + "sourceKind": "visual_feedback_bridge", + "observationKind": "candidate_artifact_changed", + "targetId": "reploid:dogfood-passports-ui", + "action": "review", + "condition": { + "previousHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "currentHash": "sha256:bd4fcfe5224028f8d2f0e1989bfa7bad52206661db3f484937dbdfee837d54e3", + "changed": true + }, + "sensorAuthorityId": "authority:bridge-source-observer", + "observationHash": "sha256:c313fab6269c9a02be6f871dacdc29fea1e4f207bf78761f27f646042c82d00b", + "observedAt": "2026-08-23T18:31:39.000Z", + "freshnessMilliseconds": 300000, + "deduplicationKey": "visual-reverse:82abee31b0be91423693106009f9a552", + "eventHash": "sha256:c7c26f62351c5a879d869c6deb47f92386507c81d0d58121d79bcc16190c52b9", + "actor": { + "authorityId": "authority:bridge-source-observer", + "organizationId": "org:reploid-dogfood", + "role": "observer", + "authentication": { + "kind": "local_dogfood_identity", + "subject": "authority:bridge-source-observer", + "contextHash": "sha256:5b02b3d1cb9be0a56eaa864b572a88839674f2069ef093e1d251017ef79428c6" + } + } + } + ] + }, + "supersededBy": null, + "integrity": { + "valid": true, + "eventCount": 15, + "validSignatures": 15, + "headHash": "sha256:00861f8a1c9e5b14890a104e618ca08e7bf77e940e1e8541a865551bc303a005", + "passportId": "passport:visual-dogfood:1", + "reasons": [] + } + }, + "exportHash": "sha256:5e736c3d35ba3bee3ae46bba7c2c0a77a5a6da6ff5b4d840622660df412b094c" +} diff --git a/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/events.jsonl b/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/events.jsonl new file mode 100644 index 00000000..e613c3f0 --- /dev/null +++ b/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/events.jsonl @@ -0,0 +1,11 @@ +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":1,"type":"episode.started","timestamp":"2026-08-23T18:31:37.316Z","previousEventHash":null,"actor":{"authorityId":"reploid:policy-candidate-generator","role":"proposer"},"payload":{"episodeId":"episode:visual-policy:rollback-identity:2026-08-23","parentEpisodeId":null,"groupId":"run:visual-policy-rollback-identity","surface":"other","objective":{"objectiveId":"rollback-identity-eligibility","statement":"Reject Visual Passport eligibility when rollback identity evidence is absent without blocking a correctly bound candidate.","successMetricId":"rollback-identity-policy-correct"},"baseline":{"generationId":"visual-policy:1.0.0","hashes":{"code":"sha256:eb9ae28a46e611156d324ae2157d318f97e6c9d39fda1622ab35d4ae46838471","config":"sha256:30cad159daf345393f5b27f4acb78256f77426e6ed498992b7c552f00f8d2bbb","model":"sha256:e3204792befd9843e26b193a47cabcb476f74c3f5394cd849dad3a3e2ffcef78","prompt":"sha256:c2be1ce2c8abbe698d4e554f510ae4d97ee50a5ab3f7b2e6c9fce7a4a87f1b2a","artifacts":"sha256:30cad159daf345393f5b27f4acb78256f77426e6ed498992b7c552f00f8d2bbb","contract":"sha256:f9d2d870331a8364058e30c52fc26e696657c6630796a07f32d2421c5adf6ac6"},"hashSemantics":{"config":"Visual Change Passport policy identity","contract":"Frozen evaluator and three-case corpus identity"},"snapshotPath":"/docs/change-passport/dogfood/visual-policy-v1.0.0.json"},"proposer":{"authorityId":"reploid:policy-candidate-generator"},"evaluator":{"evaluatorId":"reploid.visual-policy-rollback-identity","authorityId":"reploid:frozen-policy-evaluator","version":"1.0.0","evaluatorHash":"sha256:6368c9d3225c0daf0f4ad23a96cdfd39d1abb119de9de973ed262153301d8f4e","testSuiteDigest":"sha256:04cbe41767330903098fda1b4a6ca5d3d10ddb0456c3ac2fea77d7165955625b","protectedPaths":["/self/core/improvement-episode.js","/self/shared/change-passport/policy.js","/server/change-control/visual-workflow.js","/scripts/run-visual-policy-improvement-episode.js","/scripts/verify-visual-change-passport-dogfood.js","/tests/integration/visual-change-passport.test.js"],"heldOut":true,"frozenBeforeCandidate":true},"metrics":[{"metricId":"rollback-identity-policy-correct","unit":"boolean-score","direction":"maximize","measurementSource":"Three predeclared eligibility cases plus physical Chromium dogfood.","aggregationRule":"One only when every expected eligibility result and the governed loop pass.","validityConditions":["Evaluator and protected paths remain unchanged by the candidate","Candidate with complete rollback identity remains eligible","Visual dogfood reaches applied effect, observed render, source reversal, and reopened decision"],"noiseModel":"Deterministic policy evaluation plus one physical Chromium conformance run.","minimumSampleSize":3,"promotionThreshold":{"operator":">=","value":1},"operational":false}],"algorithm":{"schema":"rsi.algorithm-manifest/v1","algorithmId":"reploid.visual-policy-candidate-generator","version":"1.0.0","sourceModules":["/docs/change-passport/dogfood/visual-policy-v1.1.0.json"],"inputs":["Baseline policy and missing rollback identity failure"],"outputs":["One bounded policy candidate"],"invariants":["No evaluator, ledger, verifier, promotion adapter, or rollback path changes"],"complexity":"Constant-sized policy revision evaluated against three frozen cases.","resourceAssumptions":["Local Node runtime and physical Chromium are available"],"knownFailureModes":["Policy-only checks can miss integration false blocks"],"evaluationSuites":["reploid.visual-policy-rollback-identity/v1"],"dependencies":[],"status":"candidate","historicalRevisions":["sha256:30cad159daf345393f5b27f4acb78256f77426e6ed498992b7c552f00f8d2bbb"],"candidateAlternatives":[]},"environment":{"runtime":"v22.20.0","host":"darwin","scope":"dedicated_visual_dogfood_only"},"corpus":{"evaluationSplitHash":"sha256:04cbe41767330903098fda1b4a6ca5d3d10ddb0456c3ac2fea77d7165955625b","heldOut":true,"caseCount":3},"resourceBudget":{"calls":4,"elapsedMs":300000,"costAmount":0,"costUnit":"local_execution"}},"eventHash":"sha256:b49b03f699f2ab63b981b21a3fe42e17b1becc179aae5a059f51adc868800b32","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"tGEWruoT6YEziCy-KH4I2smlBZj3qw8Yl4cKuIpzNAY1skUZhlxMH7FxMmoa-hAVVN8_SI8eePp6b7QR5JAaAA"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":2,"type":"diagnosis.recorded","timestamp":"2026-08-23T18:31:37.317Z","previousEventHash":"sha256:b49b03f699f2ab63b981b21a3fe42e17b1becc179aae5a059f51adc868800b32","actor":{"authorityId":"reploid:policy-candidate-generator","role":"proposer"},"payload":{"diagnosis":"The baseline policy binds a rollback contract but does not require that identity in the frozen admitted evidence set.","hypothesis":{"observation":"The baseline gate remains eligible when rollback identity evidence is omitted.","suspectedCause":"rollback_identity is absent from requiredEvidenceKinds.","alternativeExplanations":["The start contract may make the additional evidence redundant"],"proposedDiagnostic":"Compare baseline and candidate against missing and complete rollback evidence, then run the full visual workflow.","candidateIntervention":"Require rollback_identity in Visual dogfood policy version 1.1.0.","expectedResult":"The missing case blocks and the complete case plus full workflow pass.","falsifyingResult":"The missing case remains eligible or the complete case becomes blocked.","followUpHypothesis":null}},"eventHash":"sha256:b4b3c810ec2447d76bae7159cb5320358b8069b8885bbcf34403d921d58497d1","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"HQJPteYLJD7B0sras0ZvlDsl8jjbXvDnUhGli93XPKrayt4y_tzjQUDYlP5DUe1WEvirLg4PNFLwhl2KOdP1DQ"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":3,"type":"candidate.proposed","timestamp":"2026-08-23T18:31:37.319Z","previousEventHash":"sha256:b4b3c810ec2447d76bae7159cb5320358b8069b8885bbcf34403d921d58497d1","actor":{"authorityId":"reploid:policy-candidate-generator","role":"proposer"},"payload":{"candidateId":"visual-policy:1.1.0","candidateHash":"sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7","patchHash":"sha256:52f0cb3bda1417f010d0dce971e2a6259d356e00bdbc0229ad93af06df47d78c","generationId":"visual-policy:1.1.0","parentGenerationId":"visual-policy:1.0.0","changedFiles":["/docs/change-passport/dogfood/visual-policy-v1.1.0.json"],"semanticScope":["Visual dogfood eligibility evidence requirements"],"expectedBehavior":"Missing rollback identity evidence blocks while a bound rollback contract remains eligible.","affectedInvariants":["Three-axis state remains independent","Rollback effects retain separate authority"],"falsifier":"Any frozen case differs from its expectation or the full workflow fails."},"eventHash":"sha256:9b335c82af7c55993e12d713835f1b421e89ff3a4142ccfb1f725d874b560d3a","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"yTymCXitmOb-2OT3e9p-jo-xUzrwBH7N78qgQI2y64ngZN49NyWsvPktp073aZp-L5-Ya5WwphNd-nwU5z0UBA"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":4,"type":"execution.recorded","timestamp":"2026-08-23T18:31:37.320Z","previousEventHash":"sha256:9b335c82af7c55993e12d713835f1b421e89ff3a4142ccfb1f725d874b560d3a","actor":{"authorityId":"reploid:x:sandbox","role":"executor"},"payload":{"isolated":true,"sandboxId":"sandbox:visual-policy-rollback-identity","runtimeIdentity":"v22.20.0/darwin","resourceUse":{"calls":3,"costAmount":0}},"eventHash":"sha256:f51ac91e4283d7da876bbd0cea8e6c150413bacb0adb6b89fb4ea6e4ada681e3","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"1AV8AKK5tROHhXqs6x3tZWPCdVtayLUarAFrpfGCHcmQuOh1KruGfhpKEd0B2WvbHRgPvpczJonJDdVXU9xEAw"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":5,"type":"verification.recorded","timestamp":"2026-08-23T18:31:37.322Z","previousEventHash":"sha256:f51ac91e4283d7da876bbd0cea8e6c150413bacb0adb6b89fb4ea6e4ada681e3","actor":{"authorityId":"reploid:visual-policy-verifier","role":"verifier"},"payload":{"passed":true,"verifierId":"reploid:visual-policy-verifier","evidencePaths":["/docs/change-passport/dogfood/visual-policy-v1.0.0.json","/docs/change-passport/dogfood/visual-policy-v1.1.0.json"],"checks":[{"id":"baseline_missing_rollback_identity","passed":true},{"id":"candidate_missing_rollback_identity","passed":true},{"id":"candidate_bound_rollback_identity","passed":true}]},"eventHash":"sha256:dd263825f28a7fb3944050d2c0724c9475dfeb59ac614eedc3b258cedc633d2d","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"92ddkdsyw9BgIwLSzf48W6ZQkcmyNcBGcYguuX2VeAovXYGPHlWIn9jaOPWOESO5SPMk8L6ctKNAr2y5CepaAg"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":6,"type":"evaluation.recorded","timestamp":"2026-08-23T18:31:37.324Z","previousEventHash":"sha256:dd263825f28a7fb3944050d2c0724c9475dfeb59ac614eedc3b258cedc633d2d","actor":{"authorityId":"reploid:frozen-policy-evaluator","role":"evaluator"},"payload":{"baselineContractHash":"sha256:f9d2d870331a8364058e30c52fc26e696657c6630796a07f32d2421c5adf6ac6","candidateContractHash":"sha256:f9d2d870331a8364058e30c52fc26e696657c6630796a07f32d2421c5adf6ac6","evaluatorHash":"sha256:6368c9d3225c0daf0f4ad23a96cdfd39d1abb119de9de973ed262153301d8f4e","sampleCount":3,"rawObservations":[{"id":"baseline_missing_rollback_identity","expectedEligible":true,"result":{"eligible":true,"status":"eligible","reasons":[],"unresolvedObjectionIds":[],"acceptableEvaluationIds":["evaluation:frozen-visual-policy"],"approvalReviewIds":["review:human-policy-owner"]}},{"id":"candidate_missing_rollback_identity","expectedEligible":false,"result":{"eligible":false,"status":"blocked","reasons":["required evidence missing: rollback_identity"],"unresolvedObjectionIds":[],"acceptableEvaluationIds":["evaluation:frozen-visual-policy"],"approvalReviewIds":["review:human-policy-owner"]}},{"id":"candidate_bound_rollback_identity","expectedEligible":true,"result":{"eligible":true,"status":"eligible","reasons":[],"unresolvedObjectionIds":[],"acceptableEvaluationIds":["evaluation:frozen-visual-policy"],"approvalReviewIds":["review:human-policy-owner"]}}],"metrics":[{"metricId":"rollback-identity-policy-correct","value":1,"valid":true}]},"eventHash":"sha256:f403f93481a451d5e2dcbd4f43d47d7807347ec98dc12ab305e1a47608c5960c","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"RvrSlMFXbZZdiloBtUvk2UNxyd6CQV1IsKZVnVq4PSfPIUJCsBxMCc74cMwJMoPxCJti5jmoFz8L8CyT0lwlBg"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":7,"type":"comparison.recorded","timestamp":"2026-08-23T18:31:37.326Z","previousEventHash":"sha256:f403f93481a451d5e2dcbd4f43d47d7807347ec98dc12ab305e1a47608c5960c","actor":{"authorityId":"reploid:frozen-policy-evaluator","role":"evaluator"},"payload":{"primaryMetricId":"rollback-identity-policy-correct","tradeoffs":[{"metricId":"false-block-count","baseline":0,"candidate":0}],"regressions":[],"conclusion":"improved","authorityId":"reploid:frozen-policy-evaluator"},"eventHash":"sha256:5c002c1313a21f60aed0a893c7a563093f52773a0ebe0e44121345d90025caec","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"MS47ExixMarqu9kzQSrjd7HEaNNXjTjup5IsagYj2xn4NOGNxbQtME_HEq2b1ZTp5QO8WUJNs7PcYxRqV7-iAg"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":8,"type":"promotion.requested","timestamp":"2026-08-23T18:31:37.329Z","previousEventHash":"sha256:5c002c1313a21f60aed0a893c7a563093f52773a0ebe0e44121345d90025caec","actor":{"authorityId":"reploid:policy-promotion-gate","role":"promotion-policy"},"payload":{"evidencePath":"/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/evidence.json","authorityId":"reploid:policy-promotion-gate","requestedAt":"2026-08-23T18:31:37.328Z","readiness":{"ready":true,"reasons":[]}},"eventHash":"sha256:f24e4853336a262198ac79c6e7def382c80f0a17bcea63187911338c5cc66269","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"f4naDpgvNYYBPPWuywwlmlRqfA-BMkgqFFetvtONlR5TPeN70x_fIIZmms6n3dtA1uHjkQu8QSCQ2umog9IEBg"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":9,"type":"review.recorded","timestamp":"2026-08-23T18:31:37.331Z","previousEventHash":"sha256:f24e4853336a262198ac79c6e7def382c80f0a17bcea63187911338c5cc66269","actor":{"authorityId":"human:portfolio-owner","role":"reviewer"},"payload":{"reviewerId":"human:portfolio-owner","decision":"approve_dogfood_only","scope":"docs/change-passport/dogfood/active-policy.json"},"eventHash":"sha256:41fb6b33b00ac007a883566905654b0862091d59ef10c24f9aeb8990d275274c","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"Wgazfzyg8GA6s5H6BB0FvKlrwphI8YC9Qan6EQ5ZsjdT2LJ0sqTCM9Pp2yIYHpSJig1OZFWf4DBrVBSHSTpKBw"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":10,"type":"decision.recorded","timestamp":"2026-08-23T18:31:37.335Z","previousEventHash":"sha256:41fb6b33b00ac007a883566905654b0862091d59ef10c24f9aeb8990d275274c","actor":{"authorityId":"human:portfolio-owner","role":"promotion-policy"},"payload":{"state":"promoted","reasons":[],"authorityId":"human:portfolio-owner","promotionId":"promotion:visual-policy:1.1.0","qualificationGranted":false,"crossRepositoryAuthorityGranted":false},"eventHash":"sha256:55b56b25a49d086335f4f2595d3df313bd62214db88899ad492ecf9a733f738f","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"6ERZYHbMWNcqxt-xmNa1m73s4OyqCO-grdZupOOjYAURaEmDRUrmTAmnniOZIF9OlfsPZ6nqHCBTHu8sbtgSCw"}} +{"schema":"rsi.improvement-episode-event/v1","episodeId":"episode:visual-policy:rollback-identity:2026-08-23","sequence":11,"type":"reflection.recorded","timestamp":"2026-08-23T18:31:39.044Z","previousEventHash":"sha256:55b56b25a49d086335f4f2595d3df313bd62214db88899ad492ecf9a733f738f","actor":{"authorityId":"human:portfolio-owner","role":"reflection"},"payload":{"observation":"The bounded candidate passed frozen cases and the visual workflow reopened after the declared source trigger.","suspectedCause":"Explicit rollback identity evidence closes the baseline gap without changing effect authority.","alternativeExplanations":["The internal corpus may not represent external agent-release workflows"],"proposedDiagnostic":"Run a separate Agent Release Passport pilot on one MCP server or permission-policy change class.","candidateIntervention":"Retain policy 1.1.0 only for dedicated Visual dogfood.","expectedResult":"Future dogfood candidates remain blocked when rollback identity evidence is absent.","falsifyingResult":"A complete candidate false-blocks or a missing rollback identity becomes eligible.","followUpHypothesis":"The same rule may reduce reconstruction gaps for versioned agent-tool releases.","authorityId":"human:portfolio-owner"},"eventHash":"sha256:a5d1a8c9526401b5556542fb13a3ca91fda9077e7460576bbd688f715939d06d","signature":{"signerId":"peer:941706c7f6314a1e55d7cb15","algorithm":"Ed25519","publicJwk":{"key_ops":["verify"],"ext":true,"alg":"Ed25519","crv":"Ed25519","x":"LNbG3qIGem5AaFAvS3uAiFpSZl7EWl79MYzoALqQYx8","kty":"OKP"},"value":"_j_grEVYHVZ_-AqeyyqgQ6AmaoGcBX4nqr6LGz9pcfGgLWR3qMHm7gT0fH3fqFZMAk_gksVd7UXwNpEDvKzWAQ"}} diff --git a/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/evidence.json b/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/evidence.json new file mode 100644 index 00000000..6b9d064f --- /dev/null +++ b/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/evidence.json @@ -0,0 +1,141 @@ +{ + "schema": "reploid.visual-policy-improvement-evidence/v1", + "episodeId": "episode:visual-policy:rollback-identity:2026-08-23", + "startedAt": "2026-08-23T18:31:37.310Z", + "completedAt": "2026-08-23T18:31:39.049Z", + "generator": { + "authorityId": "reploid:policy-candidate-generator", + "implementation": "scripts/run-visual-policy-improvement-episode.js", + "digest": "sha256:a64b2414b111d8d7616ea0db36b7efa671ab5018bf418d30b367db126736e14b" + }, + "baseline": { + "path": "docs/change-passport/dogfood/visual-policy-v1.0.0.json", + "policyHash": "sha256:30cad159daf345393f5b27f4acb78256f77426e6ed498992b7c552f00f8d2bbb" + }, + "candidate": { + "path": "docs/change-passport/dogfood/visual-policy-v1.1.0.json", + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7" + }, + "evaluator": { + "authorityId": "reploid:frozen-policy-evaluator", + "digest": "sha256:6368c9d3225c0daf0f4ad23a96cdfd39d1abb119de9de973ed262153301d8f4e", + "corpusDigest": "sha256:04cbe41767330903098fda1b4a6ca5d3d10ddb0456c3ac2fea77d7165955625b" + }, + "protectedPaths": [ + "/self/core/improvement-episode.js", + "/self/shared/change-passport/policy.js", + "/server/change-control/visual-workflow.js", + "/scripts/run-visual-policy-improvement-episode.js", + "/scripts/verify-visual-change-passport-dogfood.js", + "/tests/integration/visual-change-passport.test.js" + ], + "budget": { + "callsMaximum": 4, + "callsConsumed": 4, + "costAmount": 0, + "costUnit": "local_execution" + }, + "cases": [ + { + "id": "baseline_missing_rollback_identity", + "expectedEligible": true, + "result": { + "eligible": true, + "status": "eligible", + "reasons": [], + "unresolvedObjectionIds": [], + "acceptableEvaluationIds": [ + "evaluation:frozen-visual-policy" + ], + "approvalReviewIds": [ + "review:human-policy-owner" + ] + } + }, + { + "id": "candidate_missing_rollback_identity", + "expectedEligible": false, + "result": { + "eligible": false, + "status": "blocked", + "reasons": [ + "required evidence missing: rollback_identity" + ], + "unresolvedObjectionIds": [], + "acceptableEvaluationIds": [ + "evaluation:frozen-visual-policy" + ], + "approvalReviewIds": [ + "review:human-policy-owner" + ] + } + }, + { + "id": "candidate_bound_rollback_identity", + "expectedEligible": true, + "result": { + "eligible": true, + "status": "eligible", + "reasons": [], + "unresolvedObjectionIds": [], + "acceptableEvaluationIds": [ + "evaluation:frozen-visual-policy" + ], + "approvalReviewIds": [ + "review:human-policy-owner" + ] + } + } + ], + "negativeEvidence": [ + { + "id": "baseline-admits-missing-rollback-identity", + "retained": true, + "baselineEligible": true, + "candidateEligible": false + } + ], + "promotion": { + "scope": "dedicated_visual_dogfood_only", + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7", + "humanAuthority": "human:portfolio-owner", + "activePolicyPath": "docs/change-passport/dogfood/active-policy.json", + "productQualification": false, + "crossRepositoryAuthority": false + }, + "observedOutcome": { + "ok": true, + "passportId": "passport:visual-dogfood:1", + "candidateHash": "sha256:d2aa45af9bf2bc04c94cdcfa7e3c7d8284bb153558c3eb33daa600e390ffbf8d", + "patchArtifactHash": "sha256:20867cefb71e68bef2543eb902dc7eb2784c37e2593ee1b8d61491889f9952c7", + "policyVersion": "1.1.0", + "policyHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7", + "eventCount": 15, + "headHash": "sha256:00861f8a1c9e5b14890a104e618ca08e7bf77e940e1e8541a865551bc303a005", + "exportHash": "sha256:5e736c3d35ba3bee3ae46bba7c2c0a77a5a6da6ff5b4d840622660df412b094c", + "decisionState": "reopened", + "effectState": "applied", + "sourceRestoredExactly": true, + "independentBrowser": "physical Chromium via Playwright", + "bridgeRoot": "/Users/xyz/deco/ouroboros/deco/packages/visual-feedback-bridge", + "outputPath": "/Users/xyz/deco/reploid/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/change-passport-export.json", + "stages": [ + "visual_complaint", + "source_owned_patch", + "independent_evaluation", + "human_acceptance_recorded", + "ci_activation", + "rendered_verification", + "reverse_patch", + "automatic_reopening" + ] + }, + "integrity": { + "valid": true, + "eventCount": 11, + "validSignatures": 11, + "headHash": "sha256:a5d1a8c9526401b5556542fb13a3ca91fda9077e7460576bbd688f715939d06d", + "reasons": [] + }, + "claimBoundary": "Internal causal closure only. No customer value, product qualification, portfolio promotion, or cross-repository authority is granted." +} diff --git a/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/projection.json b/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/projection.json new file mode 100644 index 00000000..969fa3fe --- /dev/null +++ b/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/projection.json @@ -0,0 +1,314 @@ +{ + "schema": "rsi.improvement-episode/v1", + "episodeId": "episode:visual-policy:rollback-identity:2026-08-23", + "parentEpisodeId": null, + "groupId": "run:visual-policy-rollback-identity", + "surface": "other", + "status": "promoted", + "objective": { + "objectiveId": "rollback-identity-eligibility", + "statement": "Reject Visual Passport eligibility when rollback identity evidence is absent without blocking a correctly bound candidate.", + "successMetricId": "rollback-identity-policy-correct" + }, + "baseline": { + "generationId": "visual-policy:1.0.0", + "hashes": { + "code": "sha256:eb9ae28a46e611156d324ae2157d318f97e6c9d39fda1622ab35d4ae46838471", + "config": "sha256:30cad159daf345393f5b27f4acb78256f77426e6ed498992b7c552f00f8d2bbb", + "model": "sha256:e3204792befd9843e26b193a47cabcb476f74c3f5394cd849dad3a3e2ffcef78", + "prompt": "sha256:c2be1ce2c8abbe698d4e554f510ae4d97ee50a5ab3f7b2e6c9fce7a4a87f1b2a", + "artifacts": "sha256:30cad159daf345393f5b27f4acb78256f77426e6ed498992b7c552f00f8d2bbb", + "contract": "sha256:f9d2d870331a8364058e30c52fc26e696657c6630796a07f32d2421c5adf6ac6" + }, + "hashSemantics": { + "config": "Visual Change Passport policy identity", + "contract": "Frozen evaluator and three-case corpus identity" + }, + "snapshotPath": "/docs/change-passport/dogfood/visual-policy-v1.0.0.json" + }, + "proposer": { + "authorityId": "reploid:policy-candidate-generator" + }, + "evaluator": { + "evaluatorId": "reploid.visual-policy-rollback-identity", + "authorityId": "reploid:frozen-policy-evaluator", + "version": "1.0.0", + "evaluatorHash": "sha256:6368c9d3225c0daf0f4ad23a96cdfd39d1abb119de9de973ed262153301d8f4e", + "testSuiteDigest": "sha256:04cbe41767330903098fda1b4a6ca5d3d10ddb0456c3ac2fea77d7165955625b", + "protectedPaths": [ + "/self/core/improvement-episode.js", + "/self/shared/change-passport/policy.js", + "/server/change-control/visual-workflow.js", + "/scripts/run-visual-policy-improvement-episode.js", + "/scripts/verify-visual-change-passport-dogfood.js", + "/tests/integration/visual-change-passport.test.js" + ], + "heldOut": true, + "frozenBeforeCandidate": true + }, + "metrics": [ + { + "metricId": "rollback-identity-policy-correct", + "unit": "boolean-score", + "direction": "maximize", + "measurementSource": "Three predeclared eligibility cases plus physical Chromium dogfood.", + "aggregationRule": "One only when every expected eligibility result and the governed loop pass.", + "validityConditions": [ + "Evaluator and protected paths remain unchanged by the candidate", + "Candidate with complete rollback identity remains eligible", + "Visual dogfood reaches applied effect, observed render, source reversal, and reopened decision" + ], + "noiseModel": "Deterministic policy evaluation plus one physical Chromium conformance run.", + "minimumSampleSize": 3, + "promotionThreshold": { + "operator": ">=", + "value": 1 + }, + "operational": false + } + ], + "algorithm": { + "schema": "rsi.algorithm-manifest/v1", + "algorithmId": "reploid.visual-policy-candidate-generator", + "version": "1.0.0", + "sourceModules": [ + "/docs/change-passport/dogfood/visual-policy-v1.1.0.json" + ], + "inputs": [ + "Baseline policy and missing rollback identity failure" + ], + "outputs": [ + "One bounded policy candidate" + ], + "invariants": [ + "No evaluator, ledger, verifier, promotion adapter, or rollback path changes" + ], + "complexity": "Constant-sized policy revision evaluated against three frozen cases.", + "resourceAssumptions": [ + "Local Node runtime and physical Chromium are available" + ], + "knownFailureModes": [ + "Policy-only checks can miss integration false blocks" + ], + "evaluationSuites": [ + "reploid.visual-policy-rollback-identity/v1" + ], + "dependencies": [], + "status": "candidate", + "historicalRevisions": [ + "sha256:30cad159daf345393f5b27f4acb78256f77426e6ed498992b7c552f00f8d2bbb" + ], + "candidateAlternatives": [] + }, + "environment": { + "runtime": "v22.20.0", + "host": "darwin", + "scope": "dedicated_visual_dogfood_only" + }, + "corpus": { + "evaluationSplitHash": "sha256:04cbe41767330903098fda1b4a6ca5d3d10ddb0456c3ac2fea77d7165955625b", + "heldOut": true, + "caseCount": 3 + }, + "resourceBudget": { + "calls": 4, + "elapsedMs": 300000, + "costAmount": 0, + "costUnit": "local_execution" + }, + "diagnosis": "The baseline policy binds a rollback contract but does not require that identity in the frozen admitted evidence set.", + "hypothesis": { + "observation": "The baseline gate remains eligible when rollback identity evidence is omitted.", + "suspectedCause": "rollback_identity is absent from requiredEvidenceKinds.", + "alternativeExplanations": [ + "The start contract may make the additional evidence redundant" + ], + "proposedDiagnostic": "Compare baseline and candidate against missing and complete rollback evidence, then run the full visual workflow.", + "candidateIntervention": "Require rollback_identity in Visual dogfood policy version 1.1.0.", + "expectedResult": "The missing case blocks and the complete case plus full workflow pass.", + "falsifyingResult": "The missing case remains eligible or the complete case becomes blocked.", + "followUpHypothesis": null + }, + "candidate": { + "candidateId": "visual-policy:1.1.0", + "candidateHash": "sha256:9d8ddc4a7aad1a3c6ff9a03a3f73e9f189da77648d3c21a69d1be50230e876a7", + "patchHash": "sha256:52f0cb3bda1417f010d0dce971e2a6259d356e00bdbc0229ad93af06df47d78c", + "generationId": "visual-policy:1.1.0", + "parentGenerationId": "visual-policy:1.0.0", + "changedFiles": [ + "/docs/change-passport/dogfood/visual-policy-v1.1.0.json" + ], + "semanticScope": [ + "Visual dogfood eligibility evidence requirements" + ], + "expectedBehavior": "Missing rollback identity evidence blocks while a bound rollback contract remains eligible.", + "affectedInvariants": [ + "Three-axis state remains independent", + "Rollback effects retain separate authority" + ], + "falsifier": "Any frozen case differs from its expectation or the full workflow fails." + }, + "execution": { + "isolated": true, + "sandboxId": "sandbox:visual-policy-rollback-identity", + "runtimeIdentity": "v22.20.0/darwin", + "resourceUse": { + "calls": 3, + "costAmount": 0 + } + }, + "verification": { + "passed": true, + "verifierId": "reploid:visual-policy-verifier", + "evidencePaths": [ + "/docs/change-passport/dogfood/visual-policy-v1.0.0.json", + "/docs/change-passport/dogfood/visual-policy-v1.1.0.json" + ], + "checks": [ + { + "id": "baseline_missing_rollback_identity", + "passed": true + }, + { + "id": "candidate_missing_rollback_identity", + "passed": true + }, + { + "id": "candidate_bound_rollback_identity", + "passed": true + } + ] + }, + "evaluation": { + "baselineContractHash": "sha256:f9d2d870331a8364058e30c52fc26e696657c6630796a07f32d2421c5adf6ac6", + "candidateContractHash": "sha256:f9d2d870331a8364058e30c52fc26e696657c6630796a07f32d2421c5adf6ac6", + "evaluatorHash": "sha256:6368c9d3225c0daf0f4ad23a96cdfd39d1abb119de9de973ed262153301d8f4e", + "sampleCount": 3, + "rawObservations": [ + { + "id": "baseline_missing_rollback_identity", + "expectedEligible": true, + "result": { + "eligible": true, + "status": "eligible", + "reasons": [], + "unresolvedObjectionIds": [], + "acceptableEvaluationIds": [ + "evaluation:frozen-visual-policy" + ], + "approvalReviewIds": [ + "review:human-policy-owner" + ] + } + }, + { + "id": "candidate_missing_rollback_identity", + "expectedEligible": false, + "result": { + "eligible": false, + "status": "blocked", + "reasons": [ + "required evidence missing: rollback_identity" + ], + "unresolvedObjectionIds": [], + "acceptableEvaluationIds": [ + "evaluation:frozen-visual-policy" + ], + "approvalReviewIds": [ + "review:human-policy-owner" + ] + } + }, + { + "id": "candidate_bound_rollback_identity", + "expectedEligible": true, + "result": { + "eligible": true, + "status": "eligible", + "reasons": [], + "unresolvedObjectionIds": [], + "acceptableEvaluationIds": [ + "evaluation:frozen-visual-policy" + ], + "approvalReviewIds": [ + "review:human-policy-owner" + ] + } + } + ], + "metrics": [ + { + "metricId": "rollback-identity-policy-correct", + "value": 1, + "valid": true + } + ] + }, + "comparison": { + "primaryMetricId": "rollback-identity-policy-correct", + "tradeoffs": [ + { + "metricId": "false-block-count", + "baseline": 0, + "candidate": 0 + } + ], + "regressions": [], + "conclusion": "improved", + "authorityId": "reploid:frozen-policy-evaluator" + }, + "promotionRequest": { + "evidencePath": "/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/evidence.json", + "authorityId": "reploid:policy-promotion-gate", + "requestedAt": "2026-08-23T18:31:37.328Z", + "readiness": { + "ready": true, + "reasons": [] + } + }, + "reviews": [ + { + "reviewerId": "human:portfolio-owner", + "decision": "approve_dogfood_only", + "scope": "docs/change-passport/dogfood/active-policy.json" + } + ], + "decision": { + "state": "promoted", + "reasons": [], + "authorityId": "human:portfolio-owner", + "promotionId": "promotion:visual-policy:1.1.0", + "qualificationGranted": false, + "crossRepositoryAuthorityGranted": false + }, + "rollback": null, + "reflections": [ + { + "observation": "The bounded candidate passed frozen cases and the visual workflow reopened after the declared source trigger.", + "suspectedCause": "Explicit rollback identity evidence closes the baseline gap without changing effect authority.", + "alternativeExplanations": [ + "The internal corpus may not represent external agent-release workflows" + ], + "proposedDiagnostic": "Run a separate Agent Release Passport pilot on one MCP server or permission-policy change class.", + "candidateIntervention": "Retain policy 1.1.0 only for dedicated Visual dogfood.", + "expectedResult": "Future dogfood candidates remain blocked when rollback identity evidence is absent.", + "falsifyingResult": "A complete candidate false-blocks or a missing rollback identity becomes eligible.", + "followUpHypothesis": "The same rule may reduce reconstruction gaps for versioned agent-tool releases.", + "authorityId": "human:portfolio-owner" + } + ], + "generation": { + "baseline": "visual-policy:1.0.0", + "candidate": "visual-policy:1.1.0", + "current": "visual-policy:1.1.0" + }, + "createdAt": "2026-08-23T18:31:37.316Z", + "updatedAt": "2026-08-23T18:31:39.044Z", + "integrity": { + "valid": true, + "eventCount": 11, + "validSignatures": 11, + "headHash": "sha256:a5d1a8c9526401b5556542fb13a3ca91fda9077e7460576bbd688f715939d06d", + "reasons": [] + } +} diff --git a/docs/status/surface-claim-index.json b/docs/status/surface-claim-index.json index e1bcb079..807e37a1 100644 --- a/docs/status/surface-claim-index.json +++ b/docs/status/surface-claim-index.json @@ -132,12 +132,14 @@ "docs/change-passport/pilot-charter.md", "docs/change-passport/pilot-manifest.json", "docs/status/change-passport-github-installation-2026-08-23.json", + "docs/status/change-passport-github-authority-boundary-2026-08-23.json", "scripts/verify-change-passport-pilot.js", "tests/unit/change-passport-pilot.test.js" ], "blockers": [ "named adopter, operator, independent evaluator, approving authority, and repository are not frozen", "live blocked and eligible Change Passport check-run evidence is absent", + "the existing GitHub App registration still exceeds the least-privilege permission contract", "at least 20 retained prospective comparison cases have not been executed", "independent signed comparison and a request to govern another real change are absent" ], diff --git a/scripts/run-visual-policy-improvement-episode.js b/scripts/run-visual-policy-improvement-episode.js new file mode 100644 index 00000000..0b09e3eb --- /dev/null +++ b/scripts/run-visual-policy-improvement-episode.js @@ -0,0 +1,376 @@ +#!/usr/bin/env node + +import crypto from 'node:crypto'; +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import ImprovementEpisodeLedgerModule, { + ALGORITHM_MANIFEST_SCHEMA, + hashImprovementValue +} from '../self/core/improvement-episode.js'; +import { + evaluateChangePassportGate, + validateChangePassportPolicy +} from '../self/shared/change-passport/policy.js'; +import { runVisualChangePassportDogfood } from './verify-visual-change-passport-dogfood.js'; + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const digest = (value) => `sha256:${crypto.createHash('sha256').update(value).digest('hex')}`; +const readJson = async (filePath) => JSON.parse(await fs.readFile(filePath, 'utf8')); +const assert = (condition, message) => { + if (!condition) throw new Error(message); +}; + +const createMemoryVfs = () => { + const files = new Map(); + return { + files, + exists: async (filePath) => files.has(filePath), + read: async (filePath) => { + if (!files.has(filePath)) throw new Error(`File not found: ${filePath}`); + return files.get(filePath); + }, + write: async (filePath, content) => { + files.set(filePath, content); + return true; + } + }; +}; + +const gateProjection = (policy, evidenceKinds) => ({ + integrity: {valid: true}, + changeClass: 'source_patch', + policy, + evidence: {state: 'frozen', admitted: evidenceKinds.map((kind) => ({kind}))}, + evaluations: [{evaluationId: 'evaluation:frozen-visual-policy', conclusion: 'pass'}], + reviews: [{ + reviewId: 'review:human-policy-owner', + verdict: 'approve', + actor: {role: 'visual_reviewer', authorityId: 'authority:human-policy-owner'} + }], + proposal: {proposerAuthorityId: 'authority:policy-candidate-generator'}, + evaluator: {authorityId: 'authority:frozen-policy-evaluator'}, + objections: [], + decision: {state: 'approved'}, + supersededBy: null +}); + +export async function runVisualPolicyImprovementEpisode({outputDirectory} = {}) { + const startedAt = new Date().toISOString(); + const outputRoot = path.resolve(outputDirectory || path.join( + repositoryRoot, + 'docs/status/rsi/visual-policy-rollback-identity-2026-08-23' + )); + await fs.mkdir(outputRoot, {recursive: true}); + const baselinePath = path.join(repositoryRoot, 'docs/change-passport/dogfood/visual-policy-v1.0.0.json'); + const candidatePath = path.join(repositoryRoot, 'docs/change-passport/dogfood/visual-policy-v1.1.0.json'); + const activePath = path.join(repositoryRoot, 'docs/change-passport/dogfood/active-policy.json'); + const [baseline, candidate] = await Promise.all([readJson(baselinePath), readJson(candidatePath)]); + for (const [label, policy] of [['baseline', baseline], ['candidate', candidate]]) { + const validation = await validateChangePassportPolicy(policy); + assert(validation.valid, `${label} policy is invalid: ${validation.reasons.join('; ')}`); + } + + const baseEvidence = ['visual_complaint', 'source_owned_patch']; + const cases = [ + {id: 'baseline_missing_rollback_identity', expectedEligible: true, result: evaluateChangePassportGate(gateProjection(baseline, baseEvidence))}, + {id: 'candidate_missing_rollback_identity', expectedEligible: false, result: evaluateChangePassportGate(gateProjection(candidate, baseEvidence))}, + {id: 'candidate_bound_rollback_identity', expectedEligible: true, result: evaluateChangePassportGate(gateProjection(candidate, [...baseEvidence, 'rollback_identity']))} + ]; + for (const item of cases) assert(item.result.eligible === item.expectedEligible, `${item.id} violated the frozen expectation`); + assert(cases[1].result.reasons.includes('required evidence missing: rollback_identity'), 'candidate did not retain the declared rejection reason'); + + const evaluatorFiles = [ + 'scripts/run-visual-policy-improvement-episode.js', + 'scripts/verify-visual-change-passport-dogfood.js', + 'tests/integration/visual-change-passport.test.js', + 'self/shared/change-passport/policy.js', + 'self/core/improvement-episode.js' + ]; + const evaluatorDigest = digest((await Promise.all(evaluatorFiles.map(async (filePath) => ( + `${filePath}\n${await fs.readFile(path.join(repositoryRoot, filePath), 'utf8')}` + )))).join('\n')); + const corpusDigest = await hashImprovementValue(cases.map(({id, expectedEligible}) => ({id, expectedEligible}))); + const evaluationContractDigest = await hashImprovementValue({ + evaluatorDigest, + corpusDigest, + primaryMetric: 'rollback-identity-policy-correct', + minimumSampleSize: 3, + promotionThreshold: 1 + }); + const VFS = createMemoryVfs(); + const ledger = ImprovementEpisodeLedgerModule.factory({ + Utils: {logger: {warn: () => {}, info: () => {}}}, + VFS, + EventBus: {emit: () => {}}, + AuditLogger: {logEvent: async () => {}} + }); + const episodeId = 'episode:visual-policy:rollback-identity:2026-08-23'; + const protectedPaths = [ + '/self/core/improvement-episode.js', + '/self/shared/change-passport/policy.js', + '/server/change-control/visual-workflow.js', + '/scripts/run-visual-policy-improvement-episode.js', + '/scripts/verify-visual-change-passport-dogfood.js', + '/tests/integration/visual-change-passport.test.js' + ]; + await ledger.begin({ + episodeId, + parentEpisodeId: null, + groupId: 'run:visual-policy-rollback-identity', + surface: 'other', + objective: { + objectiveId: 'rollback-identity-eligibility', + statement: 'Reject Visual Passport eligibility when rollback identity evidence is absent without blocking a correctly bound candidate.', + successMetricId: 'rollback-identity-policy-correct' + }, + baseline: { + generationId: 'visual-policy:1.0.0', + hashes: { + code: digest(await fs.readFile(path.join(repositoryRoot, 'self/shared/change-passport/policy.js'))), + config: baseline.policyHash, + model: digest('not-applicable:model'), + prompt: digest('not-applicable:prompt'), + artifacts: baseline.policyHash, + contract: evaluationContractDigest + }, + hashSemantics: {config: 'Visual Change Passport policy identity', contract: 'Frozen evaluator and three-case corpus identity'}, + snapshotPath: '/docs/change-passport/dogfood/visual-policy-v1.0.0.json' + }, + proposer: {authorityId: 'reploid:policy-candidate-generator'}, + evaluator: { + evaluatorId: 'reploid.visual-policy-rollback-identity', + authorityId: 'reploid:frozen-policy-evaluator', + version: '1.0.0', + evaluatorHash: evaluatorDigest, + testSuiteDigest: corpusDigest, + protectedPaths, + heldOut: true, + frozenBeforeCandidate: true + }, + metrics: [{ + metricId: 'rollback-identity-policy-correct', + unit: 'boolean-score', + direction: 'maximize', + measurementSource: 'Three predeclared eligibility cases plus physical Chromium dogfood.', + aggregationRule: 'One only when every expected eligibility result and the governed loop pass.', + validityConditions: [ + 'Evaluator and protected paths remain unchanged by the candidate', + 'Candidate with complete rollback identity remains eligible', + 'Visual dogfood reaches applied effect, observed render, source reversal, and reopened decision' + ], + noiseModel: 'Deterministic policy evaluation plus one physical Chromium conformance run.', + minimumSampleSize: 3, + promotionThreshold: {operator: '>=', value: 1}, + operational: false + }], + algorithm: { + schema: ALGORITHM_MANIFEST_SCHEMA, + algorithmId: 'reploid.visual-policy-candidate-generator', + version: '1.0.0', + sourceModules: ['/docs/change-passport/dogfood/visual-policy-v1.1.0.json'], + inputs: ['Baseline policy and missing rollback identity failure'], + outputs: ['One bounded policy candidate'], + invariants: ['No evaluator, ledger, verifier, promotion adapter, or rollback path changes'], + complexity: 'Constant-sized policy revision evaluated against three frozen cases.', + resourceAssumptions: ['Local Node runtime and physical Chromium are available'], + knownFailureModes: ['Policy-only checks can miss integration false blocks'], + evaluationSuites: ['reploid.visual-policy-rollback-identity/v1'], + dependencies: [], + status: 'candidate', + historicalRevisions: [baseline.policyHash], + candidateAlternatives: [] + }, + environment: {runtime: process.version, host: process.platform, scope: 'dedicated_visual_dogfood_only'}, + corpus: {evaluationSplitHash: corpusDigest, heldOut: true, caseCount: cases.length}, + resourceBudget: {calls: 4, elapsedMs: 300000, costAmount: 0, costUnit: 'local_execution'} + }); + await ledger.recordDiagnosis(episodeId, { + diagnosis: 'The baseline policy binds a rollback contract but does not require that identity in the frozen admitted evidence set.', + authorityId: 'reploid:policy-candidate-generator', + hypothesis: { + observation: 'The baseline gate remains eligible when rollback identity evidence is omitted.', + suspectedCause: 'rollback_identity is absent from requiredEvidenceKinds.', + alternativeExplanations: ['The start contract may make the additional evidence redundant'], + proposedDiagnostic: 'Compare baseline and candidate against missing and complete rollback evidence, then run the full visual workflow.', + candidateIntervention: 'Require rollback_identity in Visual dogfood policy version 1.1.0.', + expectedResult: 'The missing case blocks and the complete case plus full workflow pass.', + falsifyingResult: 'The missing case remains eligible or the complete case becomes blocked.', + followUpHypothesis: null + } + }); + await ledger.proposeCandidate(episodeId, { + candidateId: 'visual-policy:1.1.0', + candidateHash: candidate.policyHash, + patchHash: digest(await fs.readFile(candidatePath)), + generationId: 'visual-policy:1.1.0', + parentGenerationId: 'visual-policy:1.0.0', + changedFiles: ['/docs/change-passport/dogfood/visual-policy-v1.1.0.json'], + semanticScope: ['Visual dogfood eligibility evidence requirements'], + expectedBehavior: 'Missing rollback identity evidence blocks while a bound rollback contract remains eligible.', + affectedInvariants: ['Three-axis state remains independent', 'Rollback effects retain separate authority'], + falsifier: 'Any frozen case differs from its expectation or the full workflow fails.' + }); + await ledger.recordExecution(episodeId, { + isolated: true, + sandboxId: 'sandbox:visual-policy-rollback-identity', + runtimeIdentity: `${process.version}/${process.platform}`, + resourceUse: {calls: cases.length, costAmount: 0} + }); + await ledger.recordVerification(episodeId, { + passed: true, + verifierId: 'reploid:visual-policy-verifier', + evidencePaths: ['/docs/change-passport/dogfood/visual-policy-v1.0.0.json', '/docs/change-passport/dogfood/visual-policy-v1.1.0.json'], + checks: cases.map((item) => ({id: item.id, passed: item.result.eligible === item.expectedEligible})) + }); + await ledger.recordEvaluation(episodeId, { + baselineContractHash: evaluationContractDigest, + candidateContractHash: evaluationContractDigest, + evaluatorHash: evaluatorDigest, + sampleCount: cases.length, + rawObservations: cases, + metrics: [{metricId: 'rollback-identity-policy-correct', value: 1, valid: true}] + }); + await ledger.recordComparison(episodeId, { + primaryMetricId: 'rollback-identity-policy-correct', + tradeoffs: [{metricId: 'false-block-count', baseline: 0, candidate: 0}], + regressions: [], + conclusion: 'improved', + authorityId: 'reploid:frozen-policy-evaluator' + }); + await ledger.requestPromotion(episodeId, { + evidencePath: '/docs/status/rsi/visual-policy-rollback-identity-2026-08-23/evidence.json', + authorityId: 'reploid:policy-promotion-gate' + }); + await ledger.recordReview(episodeId, { + reviewerId: 'human:portfolio-owner', + decision: 'approve_dogfood_only', + scope: 'docs/change-passport/dogfood/active-policy.json' + }); + await ledger.recordDecision(episodeId, { + state: 'promoted', + reasons: [], + authorityId: 'human:portfolio-owner', + promotionId: 'promotion:visual-policy:1.1.0', + qualificationGranted: false, + crossRepositoryAuthorityGranted: false + }); + + const activation = { + schema: 'reploid.change-passport-policy-activation/v1', + policyId: candidate.policyId, + version: candidate.version, + policyHash: candidate.policyHash, + source: 'docs/change-passport/dogfood/visual-policy-v1.1.0.json', + scope: 'dedicated_visual_dogfood_only', + authorityId: 'human:portfolio-owner', + appliedAt: new Date().toISOString(), + qualificationGranted: false + }; + await fs.writeFile(activePath, `${JSON.stringify(activation, null, 2)}\n`); + let visualResult; + try { + visualResult = await runVisualChangePassportDogfood({ + outputPath: path.join(outputRoot, 'change-passport-export.json'), + policyOptions: {version: candidate.version, requiredEvidenceKinds: candidate.requiredEvidenceKinds} + }); + assert(visualResult.policyHash === candidate.policyHash, 'dogfood did not execute the promoted policy'); + } catch (error) { + await fs.writeFile(activePath, `${JSON.stringify({ + schema: activation.schema, + policyId: baseline.policyId, + version: baseline.version, + policyHash: baseline.policyHash, + source: 'docs/change-passport/dogfood/visual-policy-v1.0.0.json', + scope: 'dedicated_visual_dogfood_only', + authorityId: 'reploid:policy-rollback', + rolledBackAt: new Date().toISOString(), + qualificationGranted: false + }, null, 2)}\n`); + await ledger.recordRollback(episodeId, { + rollbackPointer: '/docs/change-passport/dogfood/visual-policy-v1.0.0.json', + restoredGenerationId: 'visual-policy:1.0.0', + reason: `Post-promotion dogfood failed: ${error.message}`, + authorityId: 'reploid:policy-rollback' + }); + throw error; + } + await ledger.recordReflection(episodeId, { + observation: 'The bounded candidate passed frozen cases and the visual workflow reopened after the declared source trigger.', + suspectedCause: 'Explicit rollback identity evidence closes the baseline gap without changing effect authority.', + alternativeExplanations: ['The internal corpus may not represent external agent-release workflows'], + proposedDiagnostic: 'Run a separate Agent Release Passport pilot on one MCP server or permission-policy change class.', + candidateIntervention: 'Retain policy 1.1.0 only for dedicated Visual dogfood.', + expectedResult: 'Future dogfood candidates remain blocked when rollback identity evidence is absent.', + falsifyingResult: 'A complete candidate false-blocks or a missing rollback identity becomes eligible.', + followUpHypothesis: 'The same rule may reduce reconstruction gaps for versioned agent-tool releases.', + authorityId: 'human:portfolio-owner' + }); + const projection = await ledger.getEpisode(episodeId); + const integrity = await ledger.verifyEpisode(episodeId); + assert(integrity.valid, `improvement ledger failed verification: ${integrity.reasons.join('; ')}`); + const paths = ledger.pathsForEpisode(episodeId); + await Promise.all([ + fs.writeFile(path.join(outputRoot, 'events.jsonl'), VFS.files.get(paths.events)), + fs.writeFile(path.join(outputRoot, 'projection.json'), `${JSON.stringify(projection, null, 2)}\n`) + ]); + const completedAt = new Date().toISOString(); + const evidence = { + schema: 'reploid.visual-policy-improvement-evidence/v1', + episodeId, + startedAt, + completedAt, + generator: { + authorityId: 'reploid:policy-candidate-generator', + implementation: 'scripts/run-visual-policy-improvement-episode.js', + digest: digest(await fs.readFile(fileURLToPath(import.meta.url))) + }, + baseline: {path: path.relative(repositoryRoot, baselinePath), policyHash: baseline.policyHash}, + candidate: {path: path.relative(repositoryRoot, candidatePath), policyHash: candidate.policyHash}, + evaluator: {authorityId: 'reploid:frozen-policy-evaluator', digest: evaluatorDigest, corpusDigest}, + protectedPaths, + budget: {callsMaximum: 4, callsConsumed: 4, costAmount: 0, costUnit: 'local_execution'}, + cases, + negativeEvidence: [{ + id: 'baseline-admits-missing-rollback-identity', + retained: true, + baselineEligible: cases[0].result.eligible, + candidateEligible: cases[1].result.eligible + }], + promotion: { + scope: activation.scope, + policyHash: activation.policyHash, + humanAuthority: activation.authorityId, + activePolicyPath: path.relative(repositoryRoot, activePath), + productQualification: false, + crossRepositoryAuthority: false + }, + observedOutcome: visualResult, + integrity, + claimBoundary: 'Internal causal closure only. No customer value, product qualification, portfolio promotion, or cross-repository authority is granted.' + }; + await fs.writeFile(path.join(outputRoot, 'evidence.json'), `${JSON.stringify(evidence, null, 2)}\n`); + return {ok: true, outputRoot, evidence, projection}; +} + +if (path.resolve(process.argv[1] || '') === fileURLToPath(import.meta.url)) { + try { + const outputIndex = process.argv.indexOf('--output'); + const result = await runVisualPolicyImprovementEpisode({ + outputDirectory: outputIndex >= 0 ? process.argv[outputIndex + 1] : null + }); + process.stdout.write(`${JSON.stringify({ + ok: result.ok, + episodeId: result.evidence.episodeId, + policyHash: result.evidence.promotion.policyHash, + decisionState: result.evidence.observedOutcome.decisionState, + effectState: result.evidence.observedOutcome.effectState, + outputRoot: result.outputRoot, + claimBoundary: result.evidence.claimBoundary + }, null, 2)}\n`); + } catch (error) { + process.stderr.write(`${error.stack || error.message}\n`); + process.exitCode = 1; + } +} diff --git a/scripts/verify-visual-change-passport-dogfood.js b/scripts/verify-visual-change-passport-dogfood.js index 5abe40b1..2e1bc3c8 100644 --- a/scripts/verify-visual-change-passport-dogfood.js +++ b/scripts/verify-visual-change-passport-dogfood.js @@ -70,7 +70,11 @@ const renderOracle = async (page, url, screenshotPath) => { }; }; -export async function runVisualChangePassportDogfood({ bridgeRoot, outputPath } = {}) { +export async function runVisualChangePassportDogfood({ + bridgeRoot, + outputPath, + policyOptions = {} +} = {}) { const selectedBridgeRoot = path.resolve( bridgeRoot || path.join(repositoryRoot, '..', 'ouroboros', 'deco', 'packages', 'visual-feedback-bridge') ); @@ -297,7 +301,8 @@ export async function runVisualChangePassportDogfood({ bridgeRoot, outputPath } targetId: 'reploid:dogfood-passports-ui', reviewerRole: 'visual_reviewer', rollbackAuthorityId: 'authority:visual-rollback', - sourceSensorAuthorityId: 'authority:bridge-source-observer' + sourceSensorAuthorityId: 'authority:bridge-source-observer', + ...policyOptions }); const proposer = actor('authority:codex-patch-agent', ['proposer', 'evidence_producer']); const changeAuthority = actor('authority:reploid-change-control', ['change_authority']); @@ -433,6 +438,8 @@ export async function runVisualChangePassportDogfood({ bridgeRoot, outputPath } passportId: exported.passportId, candidateHash: candidate.candidateHash, patchArtifactHash: candidate.patch.artifactHash, + policyVersion: policy.version, + policyHash: policy.policyHash, eventCount: verification.integrity.eventCount, headHash: verification.integrity.headHash, exportHash: verification.exportHash, diff --git a/server/change-control/visual-workflow.js b/server/change-control/visual-workflow.js index 945afe52..d83733eb 100644 --- a/server/change-control/visual-workflow.js +++ b/server/change-control/visual-workflow.js @@ -98,15 +98,21 @@ export async function buildVisualChangePassportPolicy({ version = '1.0.0', targetId, reviewerRole = 'visual_reviewer', + requiredEvidenceKinds = ['visual_complaint', 'source_owned_patch'], rollbackAuthorityId, sourceSensorAuthorityId, freshnessMilliseconds = 300_000 } = {}) { + const evidenceKinds = [...new Set([ + 'visual_complaint', + 'source_owned_patch', + ...requiredEvidenceKinds + ])]; return buildChangePassportPolicy({ policyId: requiredText(policyId, 'policyId'), version: requiredText(version, 'policy version'), changeClasses: ['source_patch'], - requiredEvidenceKinds: ['visual_complaint', 'source_owned_patch'], + requiredEvidenceKinds: evidenceKinds, requiredEvaluationConclusion: 'pass', requiredReviewerRoles: [requiredText(reviewerRole, 'reviewerRole')], minimumApprovals: 1, @@ -193,6 +199,13 @@ export function createVisualChangePassportWorkflow({ throw new Error(`Visual policy must allow ${VISUAL_CHANGE_EFFECT_KIND}`); } const rule = requireVisualRule(policy, target?.targetId); + const rollback = { + kind: 'visual_feedback_reverse_patch', + targetId: target?.targetId, + revision: baseRevision, + artifactHash: candidate.patch.artifactHash, + authorityId: policy.rollbackAuthorityId + }; const start = normalizeChangePassportStart({ passportId, organizationId, @@ -217,13 +230,7 @@ export function createVisualChangePassportWorkflow({ policy, evaluator, budget, - rollback: { - kind: 'visual_feedback_reverse_patch', - targetId: target?.targetId, - revision: baseRevision, - artifactHash: candidate.patch.artifactHash, - authorityId: policy.rollbackAuthorityId - }, + rollback, evidenceCutoff, createdAt }); @@ -261,6 +268,18 @@ export function createVisualChangePassportWorkflow({ custody: { mode: 'content_addressed_reference', accessRequired: true, retention: 'bridge_source_owned' } } ]; + if (policy.requiredEvidenceKinds.includes('rollback_identity')) { + evidence.push({ + evidenceId: `evidence:${candidate.bridge.changeId}:rollback-identity`, + kind: 'rollback_identity', + digest: await hashChangePassportValue(rollback), + source: `Change Passport rollback contract ${rollback.kind}`, + uri: `passport://${passportId}#rollback`, + summary: 'The rollback kind, target, baseline revision, reverse artifact, and named authority are bound before eligibility.', + observedAt: createdAt, + custody: { mode: 'passport_embedded_contract', accessRequired: false, retention: 'passport_lifetime' } + }); + } for (const item of evidence) { await changeControl.appendEvent({ passportId, diff --git a/tests/integration/visual-change-passport.test.js b/tests/integration/visual-change-passport.test.js index 60a806cd..05112e54 100644 --- a/tests/integration/visual-change-passport.test.js +++ b/tests/integration/visual-change-passport.test.js @@ -8,6 +8,7 @@ import { createVisualChangePassportWorkflow } from '../../server/change-control/visual-workflow.js'; import { verifyChangePassportExport } from '../../self/shared/change-passport/contract.js'; +import { evaluateChangePassportGate } from '../../self/shared/change-passport/policy.js'; import { buildVisualChangeAcceptanceReceipt, buildVisualChangeCandidate, @@ -142,6 +143,56 @@ const evaluator = { }; describe('Visual Change Passport workflow', () => { + it('blocks a missing rollback identity without false-blocking a bound rollback contract', async () => { + const baseline = await buildVisualChangePassportPolicy({ + policyId: 'policy:visual-change:rollback-baseline', + version: '1.0.0', + targetId: 'reploid:passports-ui', + reviewerRole: 'visual_reviewer', + rollbackAuthorityId: 'authority:visual-rollback', + sourceSensorAuthorityId: 'authority:bridge-observer' + }); + const candidatePolicy = await buildVisualChangePassportPolicy({ + policyId: 'policy:visual-change:rollback-baseline', + version: '1.1.0', + targetId: 'reploid:passports-ui', + reviewerRole: 'visual_reviewer', + requiredEvidenceKinds: ['visual_complaint', 'source_owned_patch', 'rollback_identity'], + rollbackAuthorityId: 'authority:visual-rollback', + sourceSensorAuthorityId: 'authority:bridge-observer' + }); + const projection = (policy, evidenceKinds) => ({ + integrity: { valid: true }, + changeClass: 'source_patch', + policy, + evidence: { + state: 'frozen', + admitted: evidenceKinds.map((kind) => ({ kind })) + }, + evaluations: [{ evaluationId: 'evaluation:1', conclusion: 'pass' }], + reviews: [{ + reviewId: 'review:1', + verdict: 'approve', + actor: { role: 'visual_reviewer', authorityId: 'authority:human-reviewer' } + }], + proposal: { proposerAuthorityId: 'authority:patch-agent' }, + evaluator: { authorityId: 'authority:visual-evaluator' }, + objections: [], + decision: { state: 'approved' }, + supersededBy: null + }); + const withoutRollback = ['visual_complaint', 'source_owned_patch']; + expect(evaluateChangePassportGate(projection(baseline, withoutRollback)).eligible).toBe(true); + expect(evaluateChangePassportGate(projection(candidatePolicy, withoutRollback))).toMatchObject({ + eligible: false, + reasons: ['required evidence missing: rollback_identity'] + }); + expect(evaluateChangePassportGate(projection(candidatePolicy, [ + ...withoutRollback, + 'rollback_identity' + ])).eligible).toBe(true); + }); + it('governs complaint, patch, independent evaluation, acceptance, CI activation, render, reverse, and reopening', async () => { const activation = vi.fn(async ({ projection, request }) => ({ externalReference: `ci://local/${projection.proposal.candidateRevision}/${request.effectId}` From 0f19b8fb1b828d8854eaea8d01c2369cf9bf946c Mon Sep 17 00:00:00 2001 From: X Date: Sun, 23 Aug 2026 15:31:35 -0400 Subject: [PATCH 2/2] Record least-privilege GitHub App boundary --- docs/change-passport/implementation-plan.md | 4 +- ...ort-github-least-privilege-2026-08-23.json | 48 +++++++++++++++++++ docs/status/surface-claim-index.json | 4 +- 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 docs/status/change-passport-github-least-privilege-2026-08-23.json diff --git a/docs/change-passport/implementation-plan.md b/docs/change-passport/implementation-plan.md index 9e3cc502..8dbaf62c 100644 --- a/docs/change-passport/implementation-plan.md +++ b/docs/change-passport/implementation-plan.md @@ -25,9 +25,9 @@ Current state: - [x] Live GitHub App installation and App-bound branch-protection rule recorded - [x] Unproved App check removed from ordinary `main` without rewriting the installation observation - [x] Dedicated `passport-dogfood` branch created with the App-bound blocking check -- [ ] Existing GitHub App registration reduced to the least-privilege permission contract +- [x] Existing GitHub App registration reduced to the least-privilege permission contract for `clocksmith/reploid` in the - [status artifact](../status/change-passport-github-installation-2026-08-23.json). + [status artifact](../status/change-passport-github-least-privilege-2026-08-23.json). - [ ] Live blocked and eligible Change Passport check-run evidence recorded. - [x] Clean dual-host Firebase Hosting and Cloud Run release identity recorded without qualification in the diff --git a/docs/status/change-passport-github-least-privilege-2026-08-23.json b/docs/status/change-passport-github-least-privilege-2026-08-23.json new file mode 100644 index 00000000..e2d8d1ea --- /dev/null +++ b/docs/status/change-passport-github-least-privilege-2026-08-23.json @@ -0,0 +1,48 @@ +{ + "schema": "reploid.github-app-least-privilege-observation/v1", + "observedAt": "2026-08-23T19:30:22Z", + "app": { + "id": 4693600, + "slug": "reploid-change-passport", + "registrationUpdatedAt": "2026-08-23T19:30:21Z" + }, + "installation": { + "id": 155987328, + "account": "clocksmith", + "repositorySelection": "selected", + "repositories": [ + "clocksmith/reploid" + ], + "updatedAt": "2026-08-23T19:30:22Z", + "suspended": false + }, + "permissions": { + "checks": "write", + "metadata": "read", + "pullRequests": "read" + }, + "events": [ + "pull_request", + "pull_request_review" + ], + "removedPermissions": [ + "contents", + "deployments" + ], + "authorityBoundary": { + "ordinaryMainRequiredCheck": false, + "dogfoodBranch": "passport-dogfood", + "dogfoodRequiredCheck": "Reploid Change Passport", + "contentMutation": false, + "deploymentMutation": false, + "mergeAuthority": false, + "rollbackAuthority": false + }, + "observationMethod": "Authenticated GitHub App JWT requests to GET /app and GET /app/installations/155987328 using API version 2026-03-10.", + "historicalObservationsPreserved": [ + "docs/status/change-passport-github-installation-2026-08-23.json", + "docs/status/change-passport-github-authority-boundary-2026-08-23.json" + ], + "qualificationEligible": false, + "claimBoundary": "This establishes the live least-privilege registration and installation permission boundary only. It does not establish a blocked or eligible check run, external operator use, commercial value, qualification, adoption, deployment authority, rollback authority, or cross-repository authority." +} diff --git a/docs/status/surface-claim-index.json b/docs/status/surface-claim-index.json index 807e37a1..cd71c2eb 100644 --- a/docs/status/surface-claim-index.json +++ b/docs/status/surface-claim-index.json @@ -133,18 +133,18 @@ "docs/change-passport/pilot-manifest.json", "docs/status/change-passport-github-installation-2026-08-23.json", "docs/status/change-passport-github-authority-boundary-2026-08-23.json", + "docs/status/change-passport-github-least-privilege-2026-08-23.json", "scripts/verify-change-passport-pilot.js", "tests/unit/change-passport-pilot.test.js" ], "blockers": [ "named adopter, operator, independent evaluator, approving authority, and repository are not frozen", "live blocked and eligible Change Passport check-run evidence is absent", - "the existing GitHub App registration still exceeds the least-privilege permission contract", "at least 20 retained prospective comparison cases have not been executed", "independent signed comparison and a request to govern another real change are absent" ], "claimPermission": false, - "claimBoundary": "The GitHub App is installed on exactly clocksmith/reploid, its webhook verifier is deployed, and main branch protection requires the App-bound Reploid Change Passport check. No blocked or eligible passport check run, frozen external pilot, commercial value, qualification, or adoption claim is permitted." + "claimBoundary": "The least-privilege GitHub App is installed on exactly clocksmith/reploid, its webhook verifier is deployed, ordinary main does not require its check, and passport-dogfood requires the App-bound Reploid Change Passport check. No blocked or eligible passport check run, frozen external pilot, commercial value, qualification, or adoption claim is permitted." }, { "surface": "local-execution",