@echopath-labs/forgerail 0.1.0-alpha.1 → 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/.codex-plugin/plugin.json +7 -3
  2. package/CHANGELOG.md +8 -0
  3. package/PLUGIN.md +2 -1
  4. package/PRIVACY.md +15 -0
  5. package/README.md +14 -2
  6. package/README.zh-CN.md +13 -2
  7. package/TERMS.md +19 -0
  8. package/adapters/codex.json +1 -1
  9. package/assets/forgerail-icon.svg +6 -0
  10. package/assets/forgerail-logo.svg +7 -0
  11. package/contracts/authority-evidence-v1.schema.json +48 -0
  12. package/contracts/cross-workspace-pack-composition-v1.schema.json +241 -0
  13. package/contracts/effective-profile-v2.schema.json +113 -0
  14. package/contracts/entry-mode-v1.schema.json +20 -0
  15. package/contracts/evidence-identity-v1.schema.json +48 -0
  16. package/contracts/execution-context-identity-v1.schema.json +76 -0
  17. package/contracts/gate-result-v1.schema.json +32 -0
  18. package/contracts/governance-source-v1.schema.json +30 -0
  19. package/contracts/host-adapter-observation-v1.schema.json +61 -0
  20. package/contracts/limited-reason-v1.schema.json +46 -0
  21. package/contracts/operation-authority-requirement-v1.schema.json +43 -0
  22. package/contracts/operation-grant-v1.schema.json +83 -0
  23. package/contracts/phase-slice-correlation-v1.schema.json +20 -0
  24. package/contracts/profile-explanation-v1.schema.json +91 -0
  25. package/contracts/provider-adapter-observation-v1.schema.json +87 -0
  26. package/contracts/return-receipt-v2.schema.json +55 -0
  27. package/contracts/review-authority-requirement-v1.schema.json +117 -0
  28. package/contracts/rollback-envelope-lineage-v1.schema.json +46 -0
  29. package/contracts/rule-claim-v1.schema.json +34 -0
  30. package/contracts/source-dependency-edge-v1.schema.json +37 -0
  31. package/contracts/task-control-revision-v1.schema.json +39 -0
  32. package/contracts/task-envelope-v2.schema.json +67 -0
  33. package/contracts/validation-result-v1.schema.json +57 -0
  34. package/contracts/validation-topology-v1.schema.json +55 -0
  35. package/contracts/workspace-identity-v1.schema.json +28 -0
  36. package/contracts/workspace-relationship-v1.schema.json +31 -0
  37. package/directory/README.md +23 -0
  38. package/directory/evaluations.json +78 -0
  39. package/directory/release-notes-alpha2.md +7 -0
  40. package/directory/submission-candidate.json +80 -0
  41. package/docs/composable-autonomy.zh-CN.md +183 -0
  42. package/docs/control-authority-validation-contracts.md +36 -0
  43. package/docs/control-authority-validation-contracts.zh-CN.md +36 -0
  44. package/docs/control-profile-contracts.md +35 -0
  45. package/docs/control-profile-contracts.zh-CN.md +35 -0
  46. package/docs/control-system-fixture-matrix.md +30 -0
  47. package/docs/control-system-fixture-matrix.zh-CN.md +30 -0
  48. package/docs/control-task-contracts.md +39 -0
  49. package/docs/control-task-contracts.zh-CN.md +39 -0
  50. package/docs/cross-workspace-pack-composition-contract.md +31 -0
  51. package/docs/cross-workspace-pack-composition-contract.zh-CN.md +31 -0
  52. package/docs/installation.md +9 -3
  53. package/docs/installation.zh-CN.md +9 -3
  54. package/docs/release-alpha2.md +21 -0
  55. package/docs/release-alpha2.zh-CN.md +21 -0
  56. package/package.json +9 -3
  57. package/packs/architecture-convergence-audit.json +30 -0
  58. package/scripts/build-universal-directory-candidate.mjs +72 -0
  59. package/scripts/disposable-consumer.mjs +1 -1
  60. package/scripts/fixtures/contracts/authority-evidence.revoked-without-invalidation.invalid.json +22 -0
  61. package/scripts/fixtures/contracts/authority-evidence.revoked.valid.json +32 -0
  62. package/scripts/fixtures/contracts/authority-evidence.valid.json +22 -0
  63. package/scripts/fixtures/contracts/capability-pack.missing-entry.invalid.json +14 -0
  64. package/scripts/fixtures/contracts/capability-pack.valid.json +15 -0
  65. package/scripts/fixtures/contracts/cross-workspace-pack-composition.authority-collapse.invalid.json +156 -0
  66. package/scripts/fixtures/contracts/cross-workspace-pack-composition.false-closure.invalid.json +138 -0
  67. package/scripts/fixtures/contracts/cross-workspace-pack-composition.valid.json +156 -0
  68. package/scripts/fixtures/contracts/effective-profile-v2.optional-unavailable-degraded.valid.json +36 -0
  69. package/scripts/fixtures/contracts/effective-profile-v2.required-unavailable-degraded.invalid.json +36 -0
  70. package/scripts/fixtures/contracts/effective-profile-v2.unresolved-claim-false-complete.invalid.json +34 -0
  71. package/scripts/fixtures/contracts/effective-profile-v2.valid.json +53 -0
  72. package/scripts/fixtures/contracts/effective-profile.duplicate-rule.invalid.json +23 -0
  73. package/scripts/fixtures/contracts/entry-mode.missing-evidence.invalid.json +6 -0
  74. package/scripts/fixtures/contracts/entry-mode.valid.json +6 -0
  75. package/scripts/fixtures/contracts/evidence-identity.unavailable-without-reason.invalid.json +21 -0
  76. package/scripts/fixtures/contracts/evidence-identity.valid.json +21 -0
  77. package/scripts/fixtures/contracts/execution-context-identity.unavailable-without-reason.invalid.json +31 -0
  78. package/scripts/fixtures/contracts/execution-context-identity.valid.json +31 -0
  79. package/scripts/fixtures/contracts/gate-result.satisfied-without-evidence.invalid.json +14 -0
  80. package/scripts/fixtures/contracts/gate-result.valid.json +14 -0
  81. package/scripts/fixtures/contracts/governance-source.unavailable-without-reason.invalid.json +16 -0
  82. package/scripts/fixtures/contracts/governance-source.valid.json +16 -0
  83. package/scripts/fixtures/contracts/host-adapter-observation.claims-authorization.invalid.json +23 -0
  84. package/scripts/fixtures/contracts/host-adapter-observation.valid.json +39 -0
  85. package/scripts/fixtures/contracts/host-adapter.codex.valid.json +1 -1
  86. package/scripts/fixtures/contracts/host-adapter.false-supported.invalid.json +14 -0
  87. package/scripts/fixtures/contracts/host-binding-receipt.valid.json +1 -1
  88. package/scripts/fixtures/contracts/launch-contract.execution-owner.invalid.json +19 -0
  89. package/scripts/fixtures/contracts/limited-reason.unbounded.invalid.json +11 -0
  90. package/scripts/fixtures/contracts/limited-reason.valid.json +11 -0
  91. package/scripts/fixtures/contracts/operation-authority-requirement.no-issuer.invalid.json +22 -0
  92. package/scripts/fixtures/contracts/operation-authority-requirement.valid.json +22 -0
  93. package/scripts/fixtures/contracts/operation-grant.missing-issuer-evidence.invalid.json +34 -0
  94. package/scripts/fixtures/contracts/operation-grant.valid.json +34 -0
  95. package/scripts/fixtures/contracts/phase-slice-correlation.aggregate-closure.invalid.json +12 -0
  96. package/scripts/fixtures/contracts/phase-slice-correlation.valid.json +12 -0
  97. package/scripts/fixtures/contracts/profile-change-candidate.unconfirmed.invalid.json +13 -0
  98. package/scripts/fixtures/contracts/profile-explanation.false-complete.invalid.json +36 -0
  99. package/scripts/fixtures/contracts/profile-explanation.valid.json +29 -0
  100. package/scripts/fixtures/contracts/provider-adapter-observation.unauthenticated-supported.invalid.json +43 -0
  101. package/scripts/fixtures/contracts/provider-adapter-observation.valid.json +62 -0
  102. package/scripts/fixtures/contracts/return-receipt-v2.changed-subject.valid.json +36 -0
  103. package/scripts/fixtures/contracts/return-receipt-v2.unverified-closeout.invalid.json +36 -0
  104. package/scripts/fixtures/contracts/return-receipt-v2.valid.json +36 -0
  105. package/scripts/fixtures/contracts/review-authority-requirement.transitive.invalid.json +33 -0
  106. package/scripts/fixtures/contracts/review-authority-requirement.valid.json +21 -0
  107. package/scripts/fixtures/contracts/rollback-envelope-lineage.reused-grant.invalid.json +24 -0
  108. package/scripts/fixtures/contracts/rollback-envelope-lineage.valid.json +24 -0
  109. package/scripts/fixtures/contracts/rule-claim.inferred-enforceable.invalid.json +16 -0
  110. package/scripts/fixtures/contracts/rule-claim.valid.json +16 -0
  111. package/scripts/fixtures/contracts/source-dependency-edge.unavailable-without-reason.invalid.json +18 -0
  112. package/scripts/fixtures/contracts/source-dependency-edge.valid.json +18 -0
  113. package/scripts/fixtures/contracts/task-control-revision.closed-without-receipt.invalid.json +37 -0
  114. package/scripts/fixtures/contracts/task-control-revision.valid.json +37 -0
  115. package/scripts/fixtures/contracts/task-envelope-v2.missing-workspace-identity.invalid.json +39 -0
  116. package/scripts/fixtures/contracts/task-envelope-v2.valid.json +54 -0
  117. package/scripts/fixtures/contracts/task-envelope-v2.workspace-mismatch.invalid.json +40 -0
  118. package/scripts/fixtures/contracts/validation-result.passed-without-evidence.invalid.json +29 -0
  119. package/scripts/fixtures/contracts/validation-result.valid.json +19 -0
  120. package/scripts/fixtures/contracts/validation-topology.dangling-requirement.invalid.json +32 -0
  121. package/scripts/fixtures/contracts/validation-topology.protected-environment.valid.json +32 -0
  122. package/scripts/fixtures/contracts/validation-topology.valid.json +32 -0
  123. package/scripts/fixtures/contracts/workspace-identity.missing-root.invalid.json +6 -0
  124. package/scripts/fixtures/contracts/workspace-identity.valid.json +14 -0
  125. package/scripts/fixtures/contracts/workspace-relationship.inferred-authority.invalid.json +13 -0
  126. package/scripts/fixtures/contracts/workspace-relationship.valid.json +13 -0
  127. package/scripts/fixtures/control-system/architecture-convergence-cases.json +25 -0
  128. package/scripts/fixtures/control-system/task-2.9-invalid-boundary-matrix.json +203 -0
  129. package/scripts/fixtures/control-system/task-4-diagnosis-health-separation.json +19 -0
  130. package/scripts/fixtures/workspaces/no-node-project/AGENTS.md +3 -0
  131. package/scripts/fixtures/workspaces/no-node-project/README.md +3 -0
  132. package/scripts/fixtures/workspaces/no-node-project/docs/adr/0001-durable-records.md +3 -0
  133. package/scripts/forgerail.mjs +467 -14
  134. package/scripts/lib/contracts.mjs +1132 -2
  135. package/scripts/shadow-comparison.mjs +1 -1
  136. package/scripts/validate-release.mjs +15 -15
  137. package/scripts/validate-universal-directory.mjs +151 -0
  138. package/skills/architecture-convergence-audit/SKILL.md +31 -0
  139. package/skills/architecture-convergence-audit/agents/openai.yaml +7 -0
  140. package/skills/architecture-convergence-audit/assets/github-issue-template.md +26 -0
  141. package/skills/architecture-convergence-audit/references/audit-contract.md +62 -0
  142. package/skills/workspace-health-review/references/health-review.md +15 -0
@@ -0,0 +1,19 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "resultId": "validation-result:contract-fixtures",
4
+ "topologyId": "topology:forgerail-contracts",
5
+ "topologyRevisionId": "topology-revision:1",
6
+ "requirementId": "validation:contract-fixtures",
7
+ "workspaceIdentityId": "workspace:forgerail",
8
+ "envelopeRevisionId": "envelope-revision:1",
9
+ "controlRevisionId": "control-revision:1",
10
+ "subjectId": "subject:commit-a",
11
+ "executionContextIdentityId": "execution-context:npm-test",
12
+ "status": "passed",
13
+ "expectedResult": "passed",
14
+ "trustClass": "local-observed",
15
+ "evidenceIdentityIds": ["evidence:npm-test"],
16
+ "waiver": null,
17
+ "observedAt": "2026-08-18T15:30:00Z",
18
+ "limitedReason": null
19
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "topologyId": "topology:forgerail-contracts",
4
+ "topologyRevisionId": "topology-revision:1",
5
+ "workspaceIdentityId": "workspace:forgerail",
6
+ "profileId": "profile:forgerail",
7
+ "profileRevisionId": "profile-revision:1",
8
+ "subjectId": "subject:commit-a",
9
+ "coverageMode": "required",
10
+ "changedSurfaces": [
11
+ {
12
+ "surfaceId": "surface:contracts",
13
+ "locator": "plugins/forgerail/contracts",
14
+ "ownerIds": ["owner:forgerail"],
15
+ "consumerIds": ["consumer:cli"],
16
+ "validationRequirementIds": ["validation:missing"],
17
+ "sourceIdentityIds": ["source:openspec-topology"]
18
+ }
19
+ ],
20
+ "validationRequirements": [
21
+ {
22
+ "requirementId": "validation:contract-fixtures",
23
+ "entrypointId": "entrypoint:npm-test",
24
+ "prerequisiteDependencyEdgeIds": [],
25
+ "acceptedTrustClasses": ["local-observed"],
26
+ "expectedResults": ["passed"],
27
+ "evidenceLocators": ["npm test"],
28
+ "selected": true
29
+ }
30
+ ],
31
+ "declaredAt": "2026-08-18T15:30:00Z"
32
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "topologyId": "topology:protected-release",
4
+ "topologyRevisionId": "topology-revision:protected-release-1",
5
+ "workspaceIdentityId": "workspace:forgerail",
6
+ "profileId": "profile:forgerail",
7
+ "profileRevisionId": "profile-revision:1",
8
+ "subjectId": "subject:commit-a",
9
+ "coverageMode": "required",
10
+ "changedSurfaces": [
11
+ {
12
+ "surfaceId": "surface:release",
13
+ "locator": "release:forgerail",
14
+ "ownerIds": ["owner:forgerail"],
15
+ "consumerIds": ["consumer:registry"],
16
+ "validationRequirementIds": ["validation:protected-release"],
17
+ "sourceIdentityIds": ["source:release-policy"]
18
+ }
19
+ ],
20
+ "validationRequirements": [
21
+ {
22
+ "requirementId": "validation:protected-release",
23
+ "entrypointId": "entrypoint:protected-release",
24
+ "prerequisiteDependencyEdgeIds": [],
25
+ "acceptedTrustClasses": ["protected-environment"],
26
+ "expectedResults": ["passed"],
27
+ "evidenceLocators": ["provider:protected-release"],
28
+ "selected": true
29
+ }
30
+ ],
31
+ "declaredAt": "2026-08-19T16:45:00Z"
32
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "topologyId": "topology:forgerail-contracts",
4
+ "topologyRevisionId": "topology-revision:1",
5
+ "workspaceIdentityId": "workspace:forgerail",
6
+ "profileId": "profile:forgerail",
7
+ "profileRevisionId": "profile-revision:1",
8
+ "subjectId": "subject:commit-a",
9
+ "coverageMode": "required",
10
+ "changedSurfaces": [
11
+ {
12
+ "surfaceId": "surface:contracts",
13
+ "locator": "plugins/forgerail/contracts",
14
+ "ownerIds": ["owner:forgerail"],
15
+ "consumerIds": ["consumer:cli", "consumer:host-adapter"],
16
+ "validationRequirementIds": ["validation:contract-fixtures"],
17
+ "sourceIdentityIds": ["source:openspec-topology"]
18
+ }
19
+ ],
20
+ "validationRequirements": [
21
+ {
22
+ "requirementId": "validation:contract-fixtures",
23
+ "entrypointId": "entrypoint:npm-test",
24
+ "prerequisiteDependencyEdgeIds": ["dependency:validate-fixtures"],
25
+ "acceptedTrustClasses": ["local-observed", "trusted-runner"],
26
+ "expectedResults": ["passed"],
27
+ "evidenceLocators": ["npm test"],
28
+ "selected": true
29
+ }
30
+ ],
31
+ "declaredAt": "2026-08-18T15:30:00Z"
32
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "workspaceIdentityId": "workspace:demo",
4
+ "boundaryClaims": [],
5
+ "observedAt": "2026-08-18T00:00:00Z"
6
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "workspaceIdentityId": "workspace:demo",
4
+ "canonicalRootLocator": ".",
5
+ "boundaryClaims": [
6
+ {
7
+ "providerId": "git",
8
+ "kind": "repository",
9
+ "identity": "repository:demo",
10
+ "observedAt": "2026-08-18T00:00:00Z"
11
+ }
12
+ ],
13
+ "observedAt": "2026-08-18T00:00:00Z"
14
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "relationshipId": "relationship:physical-parent",
4
+ "sourceWorkspaceIdentityId": "workspace:outer",
5
+ "targetWorkspaceIdentityId": "workspace:inner",
6
+ "relationshipType": "governance-scope",
7
+ "governanceApplicability": "scoped",
8
+ "applicabilityScope": ["all"],
9
+ "declaredBySourceId": "source:filesystem-observation",
10
+ "provenanceStatus": "inferred",
11
+ "authorityTransfer": true,
12
+ "observedAt": "2026-08-18T00:00:00Z"
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "relationshipId": "relationship:coordination-to-demo",
4
+ "sourceWorkspaceIdentityId": "workspace:coordination",
5
+ "targetWorkspaceIdentityId": "workspace:demo",
6
+ "relationshipType": "governance-scope",
7
+ "governanceApplicability": "scoped",
8
+ "applicabilityScope": ["release-coordination"],
9
+ "declaredBySourceId": "source:coordination-plan",
10
+ "provenanceStatus": "provider-declared",
11
+ "authorityTransfer": false,
12
+ "observedAt": "2026-08-18T00:00:00Z"
13
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "matrixId": "architecture-convergence-audit",
4
+ "risk": "medium",
5
+ "analyzeFirst": true,
6
+ "defaultMutation": "read-only",
7
+ "createsState": false,
8
+ "requiresAuthentication": false,
9
+ "cases": [
10
+ { "caseId": "diagnosis-routes-source-discovery", "signal": "nearest instructions and commands are unknown", "evidenceCompleteness": "complete", "expectedOwner": "diagnosis", "expectedFinding": "route", "expectedAction": "discover-sources" },
11
+ { "caseId": "health-routes-stale-worktrees", "signal": "worktrees are stale and unclaimed", "evidenceCompleteness": "complete", "expectedOwner": "health", "expectedFinding": "route", "expectedAction": "assess-recurring-health" },
12
+ { "caseId": "core-routes-authority", "signal": "exact operation authority is unresolved", "evidenceCompleteness": "complete", "expectedOwner": "core", "expectedFinding": "route", "expectedAction": "evaluate-deterministic-control" },
13
+ { "caseId": "thin-seam-retained", "signal": "thin interface owns authorization substitution", "evidenceCompleteness": "complete", "expectedOwner": "existing-component", "expectedFinding": "independent-invariant", "expectedAction": "retain" },
14
+ { "caseId": "large-cohesive-slice-retained", "signal": "large slice owns one independently useful invariant", "evidenceCompleteness": "complete", "expectedOwner": "existing-component", "expectedFinding": "cohesive-slice", "expectedAction": "retain" },
15
+ { "caseId": "second-identity-fence", "signal": "two components normalize and persist the same canonical identity", "evidenceCompleteness": "complete", "expectedOwner": "canonical-identity-owner", "expectedFinding": "confirmed-redundancy", "expectedAction": "consolidate" },
16
+ { "caseId": "parallel-state-machine", "signal": "two state machines own the same durable transition", "evidenceCompleteness": "complete", "expectedOwner": "durable-state-owner", "expectedFinding": "confirmed-redundancy", "expectedAction": "delete-duplicate" },
17
+ { "caseId": "duplicate-parser", "signal": "two parsers interpret the same authoritative format", "evidenceCompleteness": "complete", "expectedOwner": "format-owner", "expectedFinding": "confirmed-redundancy", "expectedAction": "reuse-parser" },
18
+ { "caseId": "speculative-compatibility", "signal": "compatibility layer has no current or committed consumer", "evidenceCompleteness": "complete", "expectedOwner": "none", "expectedFinding": "retention-burden-failed", "expectedAction": "defer-or-delete" },
19
+ { "caseId": "recovery-multiplication", "signal": "two resume paths reconstruct the same state", "evidenceCompleteness": "complete", "expectedOwner": "recovery-owner", "expectedFinding": "confirmed-redundancy", "expectedAction": "consolidate" },
20
+ { "caseId": "implementation-shaped-tests", "signal": "tests only preserve an obsolete duplicate abstraction", "evidenceCompleteness": "complete", "expectedOwner": "behavior-owner", "expectedFinding": "obsolete-coverage", "expectedAction": "delete-tests-preserve-invariants" },
21
+ { "caseId": "incomplete-evidence", "signal": "callers and durable fact owner are not verified", "evidenceCompleteness": "incomplete", "expectedOwner": "unverified", "expectedFinding": "inferred-redundancy", "expectedAction": "verify-before-deletion" },
22
+ { "caseId": "existing-profile-objects", "signal": "project facts are required for the audit", "evidenceCompleteness": "complete", "expectedOwner": "governance-source-profile-envelope", "expectedFinding": "reuse-existing-state", "expectedAction": "read-existing-objects" },
23
+ { "caseId": "issue-without-authorization", "signal": "local audit recommends a tracking issue", "evidenceCompleteness": "complete", "expectedOwner": "host-provider-boundary", "expectedFinding": "external-write-not-authorized", "expectedAction": "return-template-only" }
24
+ ]
25
+ }
@@ -0,0 +1,203 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "matrixId": "task-2.9-invalid-boundaries",
4
+ "evaluatorImplemented": false,
5
+ "cases": [
6
+ {
7
+ "caseId": "missing-identity",
8
+ "validationLayer": "schema",
9
+ "contractFixtures": [
10
+ {
11
+ "type": "task-envelope-v2",
12
+ "path": "contracts/task-envelope-v2.missing-workspace-identity.invalid.json",
13
+ "expectedSchemaValid": false
14
+ }
15
+ ],
16
+ "expectedDisposition": "rejected",
17
+ "expectedReason": "missing-identity",
18
+ "observations": {
19
+ "requiredIdentity": "workspaceIdentityId",
20
+ "observedIdentity": null
21
+ }
22
+ },
23
+ {
24
+ "caseId": "stale-base-digest",
25
+ "validationLayer": "cross-contract",
26
+ "contractFixtures": [
27
+ {
28
+ "type": "profile-candidate",
29
+ "path": "contracts/profile-change-candidate.valid.json",
30
+ "expectedSchemaValid": true
31
+ }
32
+ ],
33
+ "expectedDisposition": "rejected",
34
+ "expectedReason": "stale-base-digest",
35
+ "observations": {
36
+ "candidateBaseDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
37
+ "observedTargetDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
38
+ }
39
+ },
40
+ {
41
+ "caseId": "forged-grant",
42
+ "validationLayer": "cross-contract",
43
+ "contractFixtures": [
44
+ {
45
+ "type": "operation-grant",
46
+ "path": "contracts/operation-grant.valid.json",
47
+ "expectedSchemaValid": true
48
+ }
49
+ ],
50
+ "expectedDisposition": "rejected",
51
+ "expectedReason": "forged-grant",
52
+ "observations": {
53
+ "declaredGrantDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
54
+ "expectedGrantDigest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
55
+ }
56
+ },
57
+ {
58
+ "caseId": "ineligible-issuer",
59
+ "validationLayer": "cross-contract",
60
+ "contractFixtures": [
61
+ {
62
+ "type": "operation-authority-requirement",
63
+ "path": "contracts/operation-authority-requirement.valid.json",
64
+ "expectedSchemaValid": true
65
+ },
66
+ {
67
+ "type": "operation-grant",
68
+ "path": "contracts/operation-grant.valid.json",
69
+ "expectedSchemaValid": true
70
+ }
71
+ ],
72
+ "expectedDisposition": "rejected",
73
+ "expectedReason": "ineligible-issuer",
74
+ "observations": {
75
+ "eligibleIssuerSourceIds": ["source:user-approval"],
76
+ "observedIssuerSourceId": "source:self-described-caller"
77
+ }
78
+ },
79
+ {
80
+ "caseId": "duplicate-actor",
81
+ "validationLayer": "cross-contract",
82
+ "contractFixtures": [
83
+ {
84
+ "type": "review-authority-requirement",
85
+ "path": "contracts/review-authority-requirement.valid.json",
86
+ "expectedSchemaValid": true
87
+ },
88
+ {
89
+ "type": "authority-evidence",
90
+ "path": "contracts/authority-evidence.valid.json",
91
+ "expectedSchemaValid": true
92
+ }
93
+ ],
94
+ "expectedDisposition": "rejected",
95
+ "expectedReason": "duplicate-actor",
96
+ "observations": {
97
+ "minimumDistinctActors": 2,
98
+ "observedActorIds": ["actor:owner-a", "actor:owner-a"]
99
+ }
100
+ },
101
+ {
102
+ "caseId": "revoked-approval",
103
+ "validationLayer": "cross-contract",
104
+ "contractFixtures": [
105
+ {
106
+ "type": "review-authority-requirement",
107
+ "path": "contracts/review-authority-requirement.valid.json",
108
+ "expectedSchemaValid": true
109
+ },
110
+ {
111
+ "type": "authority-evidence",
112
+ "path": "contracts/authority-evidence.revoked.valid.json",
113
+ "expectedSchemaValid": true
114
+ }
115
+ ],
116
+ "expectedDisposition": "rejected",
117
+ "expectedReason": "revoked-approval",
118
+ "observations": {
119
+ "requiredLifecycle": "current",
120
+ "observedLifecycle": "revoked"
121
+ }
122
+ },
123
+ {
124
+ "caseId": "wrong-trust",
125
+ "validationLayer": "cross-contract",
126
+ "contractFixtures": [
127
+ {
128
+ "type": "validation-topology",
129
+ "path": "contracts/validation-topology.protected-environment.valid.json",
130
+ "expectedSchemaValid": true
131
+ },
132
+ {
133
+ "type": "validation-result",
134
+ "path": "contracts/validation-result.valid.json",
135
+ "expectedSchemaValid": true
136
+ }
137
+ ],
138
+ "expectedDisposition": "rejected",
139
+ "expectedReason": "wrong-trust",
140
+ "observations": {
141
+ "acceptedTrustClasses": ["protected-environment"],
142
+ "observedTrustClass": "local-observed"
143
+ }
144
+ },
145
+ {
146
+ "caseId": "dangling-dependency",
147
+ "validationLayer": "cross-contract",
148
+ "contractFixtures": [
149
+ {
150
+ "type": "validation-topology",
151
+ "path": "contracts/validation-topology.valid.json",
152
+ "expectedSchemaValid": true
153
+ }
154
+ ],
155
+ "expectedDisposition": "rejected",
156
+ "expectedReason": "dangling-dependency",
157
+ "observations": {
158
+ "declaredDependencyEdgeIds": ["dependency:validate-fixtures"],
159
+ "availableDependencyEdgeIds": []
160
+ }
161
+ },
162
+ {
163
+ "caseId": "changed-subject",
164
+ "validationLayer": "cross-contract",
165
+ "contractFixtures": [
166
+ {
167
+ "type": "task-envelope-v2",
168
+ "path": "contracts/task-envelope-v2.valid.json",
169
+ "expectedSchemaValid": true
170
+ },
171
+ {
172
+ "type": "return-receipt-v2",
173
+ "path": "contracts/return-receipt-v2.changed-subject.valid.json",
174
+ "expectedSchemaValid": true
175
+ }
176
+ ],
177
+ "expectedDisposition": "rejected",
178
+ "expectedReason": "changed-subject",
179
+ "observations": {
180
+ "envelopeSubjectId": "subject:task-2.6",
181
+ "receiptSubjectId": "subject:task-2.6-rewritten"
182
+ }
183
+ },
184
+ {
185
+ "caseId": "cross-workspace-authority-collapse",
186
+ "validationLayer": "schema",
187
+ "contractFixtures": [
188
+ {
189
+ "type": "cross-workspace-pack-composition",
190
+ "path": "contracts/cross-workspace-pack-composition.authority-collapse.invalid.json",
191
+ "expectedSchemaValid": false
192
+ }
193
+ ],
194
+ "expectedDisposition": "rejected",
195
+ "expectedReason": "cross-workspace-authority-collapse",
196
+ "observations": {
197
+ "authorityTransfer": true,
198
+ "operationGrantTransfer": true,
199
+ "receiptSubstitution": true
200
+ }
201
+ }
202
+ ]
203
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "matrixId": "task-4-diagnosis-health-separation",
4
+ "analyzeFirst": true,
5
+ "mutationsAllowed": false,
6
+ "cases": [
7
+ { "caseId": "nested-owner-boundary", "question": "what-exists", "observations": ["independent child repository", "nearest agent entry"], "expectedOwner": "diagnosis", "expectedOutput": "bounded-source-inventory" },
8
+ { "caseId": "nearest-governance-sources", "question": "what-exists", "observations": ["agent entry", "skills", "ownership source", "specification source", "native command entry"], "expectedOwner": "diagnosis", "expectedOutput": "source-locators-with-provenance" },
9
+ { "caseId": "dependency-unavailable", "question": "what-exists", "observations": ["required executable unavailable"], "expectedOwner": "diagnosis", "expectedOutput": "unavailable-with-limited-reason" },
10
+ { "caseId": "baseline-debt", "question": "what-exists", "observations": ["failure predates selected change"], "expectedOwner": "diagnosis", "expectedOutput": "baseline-debt-separated-from-diff" },
11
+ { "caseId": "stale-unclaimed-worktree", "question": "is-governance-healthy", "observations": ["worktree has no current owner", "recovery entry is stale"], "expectedOwner": "health", "expectedOutput": "recurring-stale-worktree-signal" },
12
+ { "caseId": "specification-adr-residue", "question": "is-governance-healthy", "observations": ["completed specification remains active", "architecture link points to superseded record"], "expectedOwner": "health", "expectedOutput": "lifecycle-and-recovery-drift" },
13
+ { "caseId": "ci-generated-drift", "question": "is-governance-healthy", "observations": ["declared CI topology differs from provider observation", "generated artifact differs from source"], "expectedOwner": "health", "expectedOutput": "drift-without-provider-pass" },
14
+ { "caseId": "compatibility-test-abstraction-bloat", "question": "is-governance-healthy", "observations": ["multiple compatibility paths", "implementation-shaped tests", "unclear current consumer"], "expectedOwner": "health", "expectedOutput": "maintenance-debt-signal" },
15
+ { "caseId": "runner-qualification-stale", "question": "is-governance-healthy", "observations": ["runner configuration changed after qualification"], "expectedOwner": "health", "expectedOutput": "qualification-freshness-risk" },
16
+ { "caseId": "exact-authority-and-receipt", "question": "can-transition-proceed", "observations": ["exact subject", "authority requirement", "validation topology", "receipt identity"], "expectedOwner": "core", "expectedOutput": "deterministic-control-result" },
17
+ { "caseId": "duplicate-capability-owner", "question": "what-minimal-implementation-remains", "observations": ["two state machines claim the same durable fact"], "expectedOwner": "architecture-convergence", "expectedOutput": "owner-map-and-deletion-first-plan" }
18
+ ]
19
+ }
@@ -0,0 +1,3 @@
1
+ # Documentation Workspace Instructions
2
+
3
+ Preserve existing documents. Diagnose before proposing changes, and do not create persistent tool state without explicit approval.
@@ -0,0 +1,3 @@
1
+ # No-Node documentation fixture
2
+
3
+ This fixture intentionally has no `package.json`, `node_modules`, or `.forgerail/` directory. It models a documentation-only project that uses Agent Plugin Skills without a project-local JavaScript runtime.
@@ -0,0 +1,3 @@
1
+ # ADR 0001: Durable records
2
+
3
+ Accepted decisions are stored as concise Markdown ADRs. Recommendations remain proposals until reviewed.