@cassiomc1/forgeloop 1.6.2 → 1.6.4

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 (127) hide show
  1. package/DOCS_INDEX.md +26 -4
  2. package/EXECUTION_STATE.md +7 -0
  3. package/LOOP_ENGINEERING.md +58 -0
  4. package/LOOP_SYSTEM_DESIGN.md +54 -0
  5. package/ORCHESTRATOR_INTEGRATION.md +23 -0
  6. package/PROTOCOL_INTEGRATION.md +36 -0
  7. package/QUALITY_SCORECARD.md +21 -0
  8. package/README.md +57 -2
  9. package/TERMINOLOGY.md +11 -0
  10. package/THREAT_MODEL.md +7 -0
  11. package/completions/_forgeloop +85 -0
  12. package/completions/forgeloop.bash +173 -0
  13. package/completions/forgeloop.fish +544 -0
  14. package/docs/AGENT_PROTOCOL_SUMMARY.md +281 -0
  15. package/docs/ARTIFACT_REFERENCE.md +226 -0
  16. package/docs/CLI_REFERENCE.md +308 -2
  17. package/docs/CODE_ATTESTATION.md +141 -0
  18. package/docs/CROSS_HARNESS_CONTINUITY.md +22 -2
  19. package/docs/DOCUMENTATION_GUIDE.md +13 -11
  20. package/docs/GETTING_STARTED.md +98 -1
  21. package/docs/MCP.md +8 -0
  22. package/docs/PLATFORM_ADAPTERS.md +69 -0
  23. package/docs/RECIPES.md +138 -0
  24. package/docs/RELEASE_CHECKLIST.md +54 -0
  25. package/docs/REVISION_PROVIDERS.md +136 -0
  26. package/docs/SIGNING_PROVIDERS.md +83 -0
  27. package/docs/TROUBLESHOOTING.md +184 -0
  28. package/docs/UNIVERSAL_INTEGRATION.md +11 -0
  29. package/docs/assets/diagrams/forgeloop-code-attestation-flow.html +13841 -0
  30. package/docs/assets/diagrams/forgeloop-code-attestation-flow.receipt.json +37 -0
  31. package/docs/assets/diagrams/forgeloop-code-attestation-flow.svg +5046 -0
  32. package/docs/assets/diagrams/forgeloop-engineering-flow.html +46 -43
  33. package/docs/assets/diagrams/forgeloop-engineering-flow.receipt.json +6 -6
  34. package/docs/assets/diagrams/forgeloop-engineering-flow.svg +41 -41
  35. package/docs/assets/diagrams/forgeloop-verification-trust-flow.html +13783 -0
  36. package/docs/assets/diagrams/forgeloop-verification-trust-flow.receipt.json +37 -0
  37. package/docs/assets/diagrams/forgeloop-verification-trust-flow.svg +4988 -0
  38. package/docs/diagrams/README.md +30 -22
  39. package/docs/diagrams/forgeloop-code-attestation-flow.workflow.json +125 -0
  40. package/docs/diagrams/forgeloop-engineering-flow.workflow.json +11 -8
  41. package/docs/diagrams/forgeloop-verification-trust-flow.workflow.json +116 -0
  42. package/docs/diagrams/manifest.json +42 -0
  43. package/docs/diagrams/reviews/forgeloop-code-attestation-flow.review.json +20 -0
  44. package/docs/diagrams/reviews/forgeloop-engineering-flow.review.json +3 -3
  45. package/docs/diagrams/reviews/forgeloop-verification-trust-flow.review.json +20 -0
  46. package/integrations/generic-ci/verify.sh +14 -0
  47. package/package.json +31 -9
  48. package/schemas/attestation-verification-result.schema.json +34 -0
  49. package/schemas/code-attestation.schema.json +61 -0
  50. package/schemas/code-manifest.schema.json +57 -0
  51. package/schemas/config.schema.json +57 -1
  52. package/schemas/handoff-envelope.schema.json +57 -0
  53. package/schemas/in-toto-statement.schema.json +32 -0
  54. package/schemas/responsibility.schema.json +37 -0
  55. package/schemas/verification-scope.schema.json +26 -0
  56. package/schemas/workspace-binding.schema.json +20 -0
  57. package/scripts/CI_VALIDATORS.md +3 -0
  58. package/scripts/benchmark-cli-startup.mjs +60 -0
  59. package/scripts/check-changelog-freshness.mjs +88 -0
  60. package/scripts/check-critical-coverage.mjs +58 -0
  61. package/scripts/generate-agent-protocol-summary.mjs +141 -0
  62. package/scripts/generate-shell-completions.mjs +132 -0
  63. package/scripts/write-forgeloop-attestation-summary.mjs +93 -0
  64. package/src/cli.js +114 -6
  65. package/src/commands/attestation-create.js +30 -0
  66. package/src/commands/attestation-status.js +12 -0
  67. package/src/commands/attestation-verify-range.js +32 -0
  68. package/src/commands/attestation-verify.js +23 -0
  69. package/src/commands/handoff-create.js +9 -0
  70. package/src/commands/handoff-list.js +12 -0
  71. package/src/commands/handoff-show.js +10 -0
  72. package/src/commands/responsibility-set.js +20 -0
  73. package/src/commands/responsibility-status.js +12 -0
  74. package/src/commands/run-check.js +43 -3
  75. package/src/commands/task-repair-legacy-recovery.js +1 -2
  76. package/src/commands/verify-scope.js +9 -0
  77. package/src/commands/workspace-bind.js +17 -0
  78. package/src/commands/workspace-status.js +19 -0
  79. package/src/core/artifact-registry.js +84 -0
  80. package/src/core/attestation-coverage.js +134 -0
  81. package/src/core/attestation-verifier.js +227 -0
  82. package/src/core/attestation.js +263 -0
  83. package/src/core/audit.js +67 -1
  84. package/src/core/bundles.js +210 -9
  85. package/src/core/cli-command-definitions.js +196 -0
  86. package/src/core/code-manifest.js +293 -0
  87. package/src/core/command-executors.js +79 -0
  88. package/src/core/command-input.js +69 -18
  89. package/src/core/command-runtime.js +2 -1
  90. package/src/core/completion.js +170 -8
  91. package/src/core/config.js +60 -2
  92. package/src/core/continuity-cli-options.js +9 -3
  93. package/src/core/continuity-reconciliation.js +20 -0
  94. package/src/core/diagnostic-projection.js +3 -1
  95. package/src/core/error-codes.js +146 -0
  96. package/src/core/events.js +109 -13
  97. package/src/core/exit-codes.js +22 -0
  98. package/src/core/handoff.js +208 -0
  99. package/src/core/information-gain-projection.js +3 -3
  100. package/src/core/integration-invocation-policy.js +40 -0
  101. package/src/core/integration-resources.js +54 -0
  102. package/src/core/next-action-phases.js +968 -0
  103. package/src/core/next-action.js +32 -951
  104. package/src/core/phase.js +29 -1
  105. package/src/core/protocol-info.js +41 -1
  106. package/src/core/repository.js +256 -11
  107. package/src/core/responsibility.js +265 -0
  108. package/src/core/revision/git.js +207 -0
  109. package/src/core/revision/provider.js +90 -0
  110. package/src/core/revision/registry.js +5 -0
  111. package/src/core/route-artifact.js +1 -1
  112. package/src/core/schema-validation.js +8 -0
  113. package/src/core/signing/none.js +23 -0
  114. package/src/core/signing/provider.js +21 -0
  115. package/src/core/signing/registry.js +7 -0
  116. package/src/core/signing/sigstore.js +158 -0
  117. package/src/core/task-command.js +9 -1
  118. package/src/core/task-paths.js +72 -0
  119. package/src/core/templates.js +8 -0
  120. package/src/core/verification-scope-capability.js +179 -0
  121. package/src/core/verification-scope.js +271 -0
  122. package/src/core/workspace-binding.js +211 -0
  123. package/src/integration.d.ts +91 -0
  124. package/AGENT_COMPATIBILITY.md +0 -11
  125. package/docs/RELEASE_CHECKLIST_1_4.md +0 -38
  126. package/docs/RELEASE_CHECKLIST_1_5_MCP.md +0 -78
  127. package/docs/RELEASE_CHECKLIST_1_6_1.md +0 -121
@@ -1,7 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en" data-theme="dark" data-preset="signal-flow" data-present="true">
3
3
  <head>
4
- <meta name="forgeloop-diagram-source-sha256" content="e4778296d1b9b2129b1ff6c956acaa1e7faba3dbfe68e0e5a6fb47dae3499308">
4
+ <meta name="forgeloop-diagram-source-sha256" content="a83128a8639db5db497ac552cfdbc318839e6451c718581fbfcd064e3e869981">
5
5
  <meta name="forgeloop-diagram-renderer" content="archify@2.15.0 (e1ac748f19cf805e44bf74fb93c796662152e273)">
6
6
  <meta charset="UTF-8">
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -4865,7 +4865,7 @@
4865
4865
  <div class="pulse-dot"></div>
4866
4866
  <h1>ForgeLoop Evidence-First Engineering Flow</h1>
4867
4867
  </div>
4868
- <p class="subtitle">Typed intent → gated work → validator-backed closure</p>
4868
+ <p class="subtitle">Typed intent → scoped work → observed evidence → validator-backed closure</p>
4869
4869
  </div>
4870
4870
 
4871
4871
  <script id="archify-guided-views-data" type="application/json">[{"id":"contract-to-work","label":"Contract to work","focus":["request","profile","contract","route","gates","preflight","work"],"note":"Follow how a request becomes scoped, routed, and safe to execute."},{"id":"evidence-to-close","label":"Evidence to close","focus":["work","evidence","review","valid"],"note":"See the evidence and review boundary that makes completion trustworthy."},{"id":"recovery-loop","label":"Recovery loop","focus":["evidence","diagnose","correct","preflight","blocked"],"note":"Failures return to diagnosis and correction before another claim is made."}]</script>
@@ -4913,7 +4913,7 @@
4913
4913
  <div class="diagram-container" data-detail-level="read">
4914
4914
  <svg viewBox="0 0 720 900" role="img" aria-labelledby="archify-diagram-title archify-diagram-description" data-animation="trace" data-preset="signal-flow" data-quality-profile="showcase">
4915
4915
  <title id="archify-diagram-title">ForgeLoop Evidence-First Engineering Flow</title>
4916
- <desc id="archify-diagram-description">Typed intent → gated work → validator-backed closure</desc>
4916
+ <desc id="archify-diagram-description">Typed intent → scoped work → observed evidence → validator-backed closure</desc>
4917
4917
  <!-- Definitions -->
4918
4918
  <defs>
4919
4919
  <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
@@ -4979,15 +4979,15 @@
4979
4979
  <path data-edge-from="request" data-edge-to="profile" data-edge-key="0" data-edge-id="request-profile" data-composition-points="113,119;195,119" d="M 113 119 L 195 119" class="a-emphasis" data-animate="edge" style="--step:0" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4980
4980
  <path data-edge-from="profile" data-edge-to="contract" data-edge-key="1" data-edge-id="profile-contract" data-composition-points="245,119;275,119" d="M 245 119 L 275 119" class="a-default" data-animate="edge" style="--step:1" stroke-width="1.4" marker-end="url(#arrowhead)"/>
4981
4981
  <path data-edge-from="contract" data-edge-to="route" data-edge-key="2" data-edge-id="contract-route" data-composition-points="300,153;300,166;300,166;300,209" d="M 300 153 L 300 166 L 300 166 L 300 209" class="a-emphasis" data-animate="edge" style="--step:2" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4982
- <path data-edge-from="route" data-edge-to="gates" data-edge-key="3" data-edge-id="route-gates" data-composition-points="325,243;405,243" d="M 325 243 L 405 243" class="a-emphasis" data-animate="edge" style="--step:3" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4982
+ <path data-edge-from="route" data-edge-to="gates" data-edge-key="3" data-edge-id="route-gates" data-composition-points="325,243;399,243" d="M 325 243 L 399 243" class="a-emphasis" data-animate="edge" style="--step:3" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4983
4983
  <path data-edge-from="gates" data-edge-to="preflight" data-edge-key="4" data-edge-id="gates-preflight" data-composition-points="430,269;430,312;500,312;500,277" d="M 430 269 L 430 312 L 500 312 L 500 277" class="a-security" data-animate="edge" style="--step:4" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4984
4984
  <path data-edge-from="preflight" data-edge-to="work" data-edge-key="5" data-edge-id="preflight-work" data-composition-points="500,277;500,290;500,290;500,341" d="M 500 277 L 500 290 L 500 290 L 500 341" class="a-emphasis" data-animate="edge" style="--step:5" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4985
4985
  <path data-edge-from="work" data-edge-to="evidence" data-edge-key="6" data-edge-id="work-evidence" data-composition-points="500,393;500,414;500,414;500,457" d="M 500 393 L 500 414 L 500 414 L 500 457" class="a-dashed" data-animate="edge" style="--step:6" stroke-width="1.4" marker-end="url(#arrowhead-dashed)"/>
4986
- <path data-edge-from="evidence" data-edge-to="review" data-edge-key="7" data-edge-id="evidence-review" data-composition-points="475,491;360,491;360,739;600,739" d="M 475 491 L 360 491 L 360 739 L 600 739" class="a-emphasis" data-animate="edge" style="--step:7" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4986
+ <path data-edge-from="evidence" data-edge-to="review" data-edge-key="7" data-edge-id="evidence-review" data-composition-points="465,491;360,491;360,739;600,739" d="M 465 491 L 360 491 L 360 739 L 600 739" class="a-emphasis" data-animate="edge" style="--step:7" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4987
4987
  <path data-edge-from="review" data-edge-to="valid" data-edge-key="8" data-edge-id="review-valid" data-composition-points="650,739;760,739;760,491;650,491" d="M 650 739 L 760 739 L 760 491 L 650 491" class="a-emphasis" data-animate="edge" style="--step:8" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4988
- <path data-edge-from="evidence" data-edge-to="diagnose" data-edge-key="9" data-edge-id="evidence-diagnose" data-composition-points="475,491;360,491;360,615;325,615" d="M 475 491 L 360 491 L 360 615 L 325 615" class="a-security" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4988
+ <path data-edge-from="evidence" data-edge-to="diagnose" data-edge-key="9" data-edge-id="evidence-diagnose" data-composition-points="465,491;360,491;360,615;325,615" d="M 465 491 L 360 491 L 360 615 L 325 615" class="a-security" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4989
4989
  <path data-edge-from="diagnose" data-edge-to="correct" data-edge-key="10" data-edge-id="diagnose-correct" data-composition-points="275,615;167,615;167,615;245,615" d="M 275 615 L 167 615 L 167 615 L 245 615" class="a-dashed" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-dashed)"/>
4990
- <path data-edge-from="correct" data-edge-to="evidence" data-edge-key="11" data-edge-id="correct-evidence" data-composition-points="195,615;160,615;160,491;475,491" d="M 195 615 L 160 615 L 160 491 L 475 491" class="a-security" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4990
+ <path data-edge-from="correct" data-edge-to="evidence" data-edge-key="11" data-edge-id="correct-evidence" data-composition-points="195,615;160,615;160,491;465,491" d="M 195 615 L 160 615 L 160 491 L 465 491" class="a-security" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4991
4991
  <path data-edge-from="correct" data-edge-to="blocked" data-edge-key="12" data-edge-id="correct-blocked" data-composition-points="195,615;35,615;35,615;113,615" d="M 195 615 L 35 615 L 35 615 L 113 615" class="a-dashed" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-dashed)"/>
4992
4992
 
4993
4993
  <!-- Nodes -->
@@ -5003,15 +5003,15 @@
5003
5003
  <text data-detail="context" x="88" y="131" class="t-muted" font-size="8" text-anchor="middle">intent</text>
5004
5004
  </g>
5005
5005
 
5006
- <g id="node-profile" data-node-id="profile" data-node-label="Profile" tabindex="0" role="button" aria-label="Focus Profile, facts, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="backend" data-node-sublabel="facts" data-node-context="Intent + Context › Discover + scope">
5007
- <title>Profile · facts · Intent + Context › Discover + scope</title>
5006
+ <g id="node-profile" data-node-id="profile" data-node-label="Profile" tabindex="0" role="button" aria-label="Focus Profile, discover, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="backend" data-node-sublabel="discover" data-node-context="Intent + Context › Discover + scope">
5007
+ <title>Profile · discover · Intent + Context › Discover + scope</title>
5008
5008
  <rect x="195" y="93" width="50" height="52" rx="6" class="c-mask"/>
5009
5009
  <rect x="195" y="93" width="50" height="52" rx="6" class="c-backend" data-animate="node" style="--step:1" stroke-width="1.5"/>
5010
5010
  <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(201 99) scale(0.6875)">
5011
5011
  <path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
5012
5012
  </g>
5013
5013
  <text data-detail-anchor x="220" y="114" class="t-primary" font-size="10" font-weight="600" text-anchor="middle">Profile</text>
5014
- <text data-detail="context" x="220" y="131" class="t-muted" font-size="8" text-anchor="middle">facts</text>
5014
+ <text data-detail="context" x="220" y="131" class="t-muted" font-size="8" text-anchor="middle">discover</text>
5015
5015
  </g>
5016
5016
 
5017
5017
  <g id="node-contract" data-node-id="contract" data-node-label="Contract" tabindex="0" role="button" aria-label="Focus Contract, scope, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="security" data-node-sublabel="scope" data-node-tag="saved" data-node-context="Intent + Context › Discover + scope">
@@ -5040,53 +5040,53 @@
5040
5040
  <text data-detail="fine" x="300" y="265" class="t-security" font-size="6.3" text-anchor="middle">fail closed</text>
5041
5041
  </g>
5042
5042
 
5043
- <g id="node-gates" data-node-id="gates" data-node-label="Gates" tabindex="0" role="button" aria-label="Focus Gates, policy, Policy Boundary › Contract boundary › Route + authorize" aria-pressed="false" data-node-kind="security" data-node-sublabel="policy" data-node-context="Policy Boundary › Contract boundary › Route + authorize">
5044
- <title>Gates · policy · Policy Boundary › Contract boundary › Route + authorize</title>
5045
- <rect x="405" y="217" width="50" height="52" rx="6" class="c-mask"/>
5046
- <rect x="405" y="217" width="50" height="52" rx="6" class="c-security" data-animate="node" style="--step:4" stroke-width="1.5"/>
5047
- <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(411 223) scale(0.6875)">
5043
+ <g id="node-gates" data-node-id="gates" data-node-label="Claims" tabindex="0" role="button" aria-label="Focus Claims, Task + gates, Policy Boundary › Contract boundary › Route + authorize" aria-pressed="false" data-node-kind="security" data-node-sublabel="Task + gates" data-node-context="Policy Boundary › Contract boundary › Route + authorize">
5044
+ <title>Claims · Task + gates · Policy Boundary › Contract boundary › Route + authorize</title>
5045
+ <rect x="399" y="217" width="62" height="52" rx="6" class="c-mask"/>
5046
+ <rect x="399" y="217" width="62" height="52" rx="6" class="c-security" data-animate="node" style="--step:4" stroke-width="1.5"/>
5047
+ <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(405 223) scale(0.6875)">
5048
5048
  <path d="M8 2.2 13 4v3.5c0 3.1-1.8 5.4-5 6.5-3.2-1.1-5-3.4-5-6.5V4Z"/>
5049
5049
  <path d="m5.8 8 1.5 1.5 3-3"/>
5050
5050
  </g>
5051
- <text data-detail-anchor x="430" y="238" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Gates</text>
5052
- <text data-detail="context" x="430" y="255" class="t-muted" font-size="8" text-anchor="middle">policy</text>
5051
+ <text data-detail-anchor x="430" y="238" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Claims</text>
5052
+ <text data-detail="context" x="430" y="255" class="t-muted" font-size="7.5" text-anchor="middle">Task + gates</text>
5053
5053
  </g>
5054
5054
 
5055
- <g id="node-preflight" data-node-id="preflight" data-node-label="READY" tabindex="0" role="button" aria-label="Focus READY, unlock, Policy Boundary › Contract boundary › Route + authorize" aria-pressed="false" data-node-kind="security" data-node-sublabel="unlock" data-node-tag="PREFLIGHT" data-node-context="Policy Boundary › Contract boundary › Route + authorize">
5056
- <title>READY · unlock · Policy Boundary › Contract boundary › Route + authorize · PREFLIGHT</title>
5057
- <rect x="475" y="209" width="50" height="68" rx="6" class="c-mask"/>
5058
- <rect x="475" y="209" width="50" height="68" rx="6" class="c-security" data-animate="node" style="--step:5" stroke-width="1.5"/>
5059
- <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(481 215) scale(0.6875)">
5055
+ <g id="node-preflight" data-node-id="preflight" data-node-label="READY" tabindex="0" role="button" aria-label="Focus READY, binding, Policy Boundary › Contract boundary › Route + authorize" aria-pressed="false" data-node-kind="security" data-node-sublabel="binding" data-node-tag="Preflight" data-node-context="Policy Boundary › Contract boundary › Route + authorize">
5056
+ <title>READY · binding · Policy Boundary › Contract boundary › Route + authorize · Preflight</title>
5057
+ <rect x="470" y="209" width="60" height="68" rx="6" class="c-mask"/>
5058
+ <rect x="470" y="209" width="60" height="68" rx="6" class="c-security" data-animate="node" style="--step:5" stroke-width="1.5"/>
5059
+ <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(476 215) scale(0.6875)">
5060
5060
  <path d="M8 2.2 13 4v3.5c0 3.1-1.8 5.4-5 6.5-3.2-1.1-5-3.4-5-6.5V4Z"/>
5061
5061
  <path d="m5.8 8 1.5 1.5 3-3"/>
5062
5062
  </g>
5063
5063
  <text data-detail-anchor x="500" y="230" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">READY</text>
5064
- <text data-detail="context" x="500" y="247" class="t-muted" font-size="8" text-anchor="middle">unlock</text>
5065
- <text data-detail="fine" x="500" y="265" class="t-security" font-size="7" text-anchor="middle">PREFLIGHT</text>
5064
+ <text data-detail="context" x="500" y="247" class="t-muted" font-size="8" text-anchor="middle">binding</text>
5065
+ <text data-detail="fine" x="500" y="265" class="t-security" font-size="7" text-anchor="middle">Preflight</text>
5066
5066
  </g>
5067
5067
 
5068
- <g id="node-work" data-node-id="work" data-node-label="Work" tabindex="0" role="button" aria-label="Focus Work, checkpoint, Resumable Execution › Route + authorize" aria-pressed="false" data-node-kind="backend" data-node-sublabel="checkpoint" data-node-context="Resumable Execution › Route + authorize">
5069
- <title>Work · checkpoint · Resumable Execution › Route + authorize</title>
5070
- <rect x="475" y="341" width="50" height="52" rx="6" class="c-mask"/>
5071
- <rect x="475" y="341" width="50" height="52" rx="6" class="c-backend" data-animate="node" style="--step:6" stroke-width="1.5"/>
5072
- <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(481 347) scale(0.6875)">
5068
+ <g id="node-work" data-node-id="work" data-node-label="Execution" tabindex="0" role="button" aria-label="Focus Execution, checkpoint, Resumable Execution › Route + authorize" aria-pressed="false" data-node-kind="backend" data-node-sublabel="checkpoint" data-node-context="Resumable Execution › Route + authorize">
5069
+ <title>Execution · checkpoint · Resumable Execution › Route + authorize</title>
5070
+ <rect x="469" y="341" width="62" height="52" rx="6" class="c-mask"/>
5071
+ <rect x="469" y="341" width="62" height="52" rx="6" class="c-backend" data-animate="node" style="--step:6" stroke-width="1.5"/>
5072
+ <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(475 347) scale(0.6875)">
5073
5073
  <path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
5074
5074
  </g>
5075
- <text data-detail-anchor x="500" y="362" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Work</text>
5076
- <text data-detail="context" x="500" y="379" class="t-muted" font-size="7" text-anchor="middle">checkpoint</text>
5075
+ <text data-detail-anchor x="500" y="362" class="t-primary" font-size="10" font-weight="600" text-anchor="middle">Execution</text>
5076
+ <text data-detail="context" x="500" y="379" class="t-muted" font-size="8" text-anchor="middle">checkpoint</text>
5077
5077
  </g>
5078
5078
 
5079
- <g id="node-evidence" data-node-id="evidence" data-node-label="Evidence" tabindex="0" role="button" aria-label="Focus Evidence, checks, Evidence Ledger › Evidence boundary › Route + authorize" aria-pressed="false" data-node-kind="database" data-node-sublabel="checks" data-node-tag="freshness" data-node-context="Evidence Ledger › Evidence boundary › Route + authorize">
5080
- <title>Evidence · checks · Evidence Ledger › Evidence boundary › Route + authorize · freshness</title>
5081
- <rect x="475" y="457" width="50" height="68" rx="6" class="c-mask"/>
5082
- <rect x="475" y="457" width="50" height="68" rx="6" class="c-database" data-animate="node" style="--step:7" stroke-width="1.5"/>
5083
- <g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(481 463) scale(0.6875)">
5079
+ <g id="node-evidence" data-node-id="evidence" data-node-label="Evidence" tabindex="0" role="button" aria-label="Focus Evidence, scope + checks, Evidence Ledger › Evidence boundary › Route + authorize" aria-pressed="false" data-node-kind="database" data-node-sublabel="scope + checks" data-node-tag="observed" data-node-context="Evidence Ledger › Evidence boundary › Route + authorize">
5080
+ <title>Evidence · scope + checks · Evidence Ledger › Evidence boundary › Route + authorize · observed</title>
5081
+ <rect x="465" y="457" width="70" height="68" rx="6" class="c-mask"/>
5082
+ <rect x="465" y="457" width="70" height="68" rx="6" class="c-database" data-animate="node" style="--step:7" stroke-width="1.5"/>
5083
+ <g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(471 463) scale(0.6875)">
5084
5084
  <ellipse cx="8" cy="4" rx="5" ry="2"/>
5085
5085
  <path d="M3 4v8c0 1.1 2.2 2 5 2s5-.9 5-2V4M3 8c0 1.1 2.2 2 5 2s5-.9 5-2"/>
5086
5086
  </g>
5087
- <text data-detail-anchor x="500" y="478" class="t-primary" font-size="9" font-weight="600" text-anchor="middle">Evidence</text>
5088
- <text data-detail="context" x="500" y="495" class="t-muted" font-size="8" text-anchor="middle">checks</text>
5089
- <text data-detail="fine" x="500" y="513" class="t-database" font-size="7" text-anchor="middle">freshness</text>
5087
+ <text data-detail-anchor x="500" y="478" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Evidence</text>
5088
+ <text data-detail="context" x="500" y="495" class="t-muted" font-size="7.3" text-anchor="middle">scope + checks</text>
5089
+ <text data-detail="fine" x="500" y="513" class="t-database" font-size="7" text-anchor="middle">observed</text>
5090
5090
  </g>
5091
5091
 
5092
5092
  <g id="node-review" data-node-id="review" data-node-label="Review" tabindex="0" role="button" aria-label="Focus Review, drift, Review + Closure › Execute + verify" aria-pressed="false" data-node-kind="backend" data-node-sublabel="drift" data-node-context="Review + Closure › Execute + verify">
@@ -5100,8 +5100,8 @@
5100
5100
  <text data-detail="context" x="625" y="751" class="t-muted" font-size="8" text-anchor="middle">drift</text>
5101
5101
  </g>
5102
5102
 
5103
- <g id="node-valid" data-node-id="valid" data-node-label="VALID" tabindex="0" role="button" aria-label="Focus VALID, validator, Evidence Ledger › Evidence boundary › Execute + verify" aria-pressed="false" data-node-kind="database" data-node-sublabel="validator" data-node-tag="claim" data-node-context="Evidence Ledger › Evidence boundary › Execute + verify">
5104
- <title>VALID · validator · Evidence Ledger › Evidence boundary › Execute + verify · claim</title>
5103
+ <g id="node-valid" data-node-id="valid" data-node-label="VALID" tabindex="0" role="button" aria-label="Focus VALID, completion, Evidence Ledger › Evidence boundary › Execute + verify" aria-pressed="false" data-node-kind="database" data-node-sublabel="completion" data-node-tag="claim" data-node-context="Evidence Ledger › Evidence boundary › Execute + verify">
5104
+ <title>VALID · completion · Evidence Ledger › Evidence boundary › Execute + verify · claim</title>
5105
5105
  <rect x="600" y="457" width="50" height="68" rx="6" class="c-mask"/>
5106
5106
  <rect x="600" y="457" width="50" height="68" rx="6" class="c-database" data-animate="node" style="--step:9" stroke-width="1.5"/>
5107
5107
  <g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(606 463) scale(0.6875)">
@@ -5109,7 +5109,7 @@
5109
5109
  <path d="M3 4v8c0 1.1 2.2 2 5 2s5-.9 5-2V4M3 8c0 1.1 2.2 2 5 2s5-.9 5-2"/>
5110
5110
  </g>
5111
5111
  <text data-detail-anchor x="625" y="478" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">VALID</text>
5112
- <text data-detail="context" x="625" y="495" class="t-muted" font-size="7.7" text-anchor="middle">validator</text>
5112
+ <text data-detail="context" x="625" y="495" class="t-muted" font-size="7" text-anchor="middle">completion</text>
5113
5113
  <text data-detail="fine" x="625" y="513" class="t-database" font-size="7" text-anchor="middle">claim</text>
5114
5114
  </g>
5115
5115
 
@@ -5380,6 +5380,7 @@
5380
5380
  </div>
5381
5381
  <ul>
5382
5382
  <li>&bull; Execution starts only after PREFLIGHT_READY</li>
5383
+ <li>&bull; Workspace binding is optional but blocks mismatched execution</li>
5383
5384
  <li>&bull; Failures return to diagnosis before another claim</li>
5384
5385
  <li>&bull; Completion is validator-backed, not inferred from a screenshot</li>
5385
5386
  </ul>
@@ -5391,7 +5392,8 @@
5391
5392
  <h3>Evidence contract</h3>
5392
5393
  </div>
5393
5394
  <ul>
5394
- <li>&bull; run-check binds commands to an execution reference</li>
5395
+ <li>&bull; Verification scope narrows only through a fresh canonical boundary</li>
5396
+ <li>&bull; run-check binds exact commands to an execution reference</li>
5395
5397
  <li>&bull; record-check covers manual observations</li>
5396
5398
  <li>&bull; Drift reopens verification instead of being hidden</li>
5397
5399
  </ul>
@@ -5405,6 +5407,7 @@
5405
5407
  <ul>
5406
5408
  <li>&bull; JSON IR is the source of truth</li>
5407
5409
  <li>&bull; HTML stays explorable and SVG stays GitHub-safe</li>
5410
+ <li>&bull; Attestation remains optional and separate from verification scope</li>
5408
5411
  <li>&bull; The text fallback carries the same lifecycle semantics</li>
5409
5412
  </ul>
5410
5413
  </div>
@@ -15,17 +15,17 @@
15
15
  "license": "MIT"
16
16
  },
17
17
  "input": {
18
- "sha256": "e4778296d1b9b2129b1ff6c956acaa1e7faba3dbfe68e0e5a6fb47dae3499308",
19
- "bytes": 7329
18
+ "sha256": "a83128a8639db5db497ac552cfdbc318839e6451c718581fbfcd064e3e869981",
19
+ "bytes": 7610
20
20
  },
21
21
  "artifacts": {
22
22
  "html": {
23
- "sha256": "d121216816942648e0de296093cf104b05b0b94efd0a4a8946add6acbd771504",
24
- "bytes": 647371
23
+ "sha256": "55d71098d15a46778454d53690110195e0e923d37f34cb6c57fcc5e6601ab7ec",
24
+ "bytes": 647796
25
25
  },
26
26
  "svg": {
27
- "sha256": "f549d1f998c2c84793783b9b6ce7aabe05d9a91edebecb764403c67dfbb4cc52",
28
- "bytes": 211037
27
+ "sha256": "37244a07cc862e3fe4a7188f5236a509a4adf565d5b785ba3c0932057ac6f3a8",
28
+ "bytes": 211160
29
29
  }
30
30
  },
31
31
  "staticSvg": {
@@ -1,4 +1,4 @@
1
- <svg data-archify-version="2.15.0" data-forgeloop-source-sha256="e4778296d1b9b2129b1ff6c956acaa1e7faba3dbfe68e0e5a6fb47dae3499308" data-theme="dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 900" role="img" aria-labelledby="archify-diagram-title archify-diagram-description" data-animation="trace" data-preset="signal-flow" data-quality-profile="showcase">
1
+ <svg data-archify-version="2.15.0" data-forgeloop-source-sha256="a83128a8639db5db497ac552cfdbc318839e6451c718581fbfcd064e3e869981" data-theme="dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 900" role="img" aria-labelledby="archify-diagram-title archify-diagram-description" data-animation="trace" data-preset="signal-flow" data-quality-profile="showcase">
2
2
  <style>
3
3
  .c-bg-rect { fill: var(--bg); }
4
4
  /* Keep boundary labels clear of the first node in each group. */
@@ -4723,7 +4723,7 @@
4723
4723
  </style>
4724
4724
  <rect width="100%" height="100%" class="c-bg-rect" />
4725
4725
  <title id="archify-diagram-title">ForgeLoop Evidence-First Engineering Flow</title>
4726
- <desc id="archify-diagram-description">Typed intent → gated work → validator-backed closure</desc>
4726
+ <desc id="archify-diagram-description">Typed intent → scoped work → observed evidence → validator-backed closure</desc>
4727
4727
  <!-- Definitions -->
4728
4728
  <defs>
4729
4729
  <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
@@ -4789,15 +4789,15 @@
4789
4789
  <path data-edge-from="request" data-edge-to="profile" data-edge-key="0" data-edge-id="request-profile" data-composition-points="113,119;195,119" d="M 113 119 L 195 119" class="a-emphasis" data-animate="edge" style="--step:0" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4790
4790
  <path data-edge-from="profile" data-edge-to="contract" data-edge-key="1" data-edge-id="profile-contract" data-composition-points="245,119;275,119" d="M 245 119 L 275 119" class="a-default" data-animate="edge" style="--step:1" stroke-width="1.4" marker-end="url(#arrowhead)"/>
4791
4791
  <path data-edge-from="contract" data-edge-to="route" data-edge-key="2" data-edge-id="contract-route" data-composition-points="300,153;300,166;300,166;300,209" d="M 300 153 L 300 166 L 300 166 L 300 209" class="a-emphasis" data-animate="edge" style="--step:2" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4792
- <path data-edge-from="route" data-edge-to="gates" data-edge-key="3" data-edge-id="route-gates" data-composition-points="325,243;405,243" d="M 325 243 L 405 243" class="a-emphasis" data-animate="edge" style="--step:3" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4792
+ <path data-edge-from="route" data-edge-to="gates" data-edge-key="3" data-edge-id="route-gates" data-composition-points="325,243;399,243" d="M 325 243 L 399 243" class="a-emphasis" data-animate="edge" style="--step:3" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4793
4793
  <path data-edge-from="gates" data-edge-to="preflight" data-edge-key="4" data-edge-id="gates-preflight" data-composition-points="430,269;430,312;500,312;500,277" d="M 430 269 L 430 312 L 500 312 L 500 277" class="a-security" data-animate="edge" style="--step:4" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4794
4794
  <path data-edge-from="preflight" data-edge-to="work" data-edge-key="5" data-edge-id="preflight-work" data-composition-points="500,277;500,290;500,290;500,341" d="M 500 277 L 500 290 L 500 290 L 500 341" class="a-emphasis" data-animate="edge" style="--step:5" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4795
4795
  <path data-edge-from="work" data-edge-to="evidence" data-edge-key="6" data-edge-id="work-evidence" data-composition-points="500,393;500,414;500,414;500,457" d="M 500 393 L 500 414 L 500 414 L 500 457" class="a-dashed" data-animate="edge" style="--step:6" stroke-width="1.4" marker-end="url(#arrowhead-dashed)"/>
4796
- <path data-edge-from="evidence" data-edge-to="review" data-edge-key="7" data-edge-id="evidence-review" data-composition-points="475,491;360,491;360,739;600,739" d="M 475 491 L 360 491 L 360 739 L 600 739" class="a-emphasis" data-animate="edge" style="--step:7" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4796
+ <path data-edge-from="evidence" data-edge-to="review" data-edge-key="7" data-edge-id="evidence-review" data-composition-points="465,491;360,491;360,739;600,739" d="M 465 491 L 360 491 L 360 739 L 600 739" class="a-emphasis" data-animate="edge" style="--step:7" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4797
4797
  <path data-edge-from="review" data-edge-to="valid" data-edge-key="8" data-edge-id="review-valid" data-composition-points="650,739;760,739;760,491;650,491" d="M 650 739 L 760 739 L 760 491 L 650 491" class="a-emphasis" data-animate="edge" style="--step:8" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
4798
- <path data-edge-from="evidence" data-edge-to="diagnose" data-edge-key="9" data-edge-id="evidence-diagnose" data-composition-points="475,491;360,491;360,615;325,615" d="M 475 491 L 360 491 L 360 615 L 325 615" class="a-security" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4798
+ <path data-edge-from="evidence" data-edge-to="diagnose" data-edge-key="9" data-edge-id="evidence-diagnose" data-composition-points="465,491;360,491;360,615;325,615" d="M 465 491 L 360 491 L 360 615 L 325 615" class="a-security" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4799
4799
  <path data-edge-from="diagnose" data-edge-to="correct" data-edge-key="10" data-edge-id="diagnose-correct" data-composition-points="275,615;167,615;167,615;245,615" d="M 275 615 L 167 615 L 167 615 L 245 615" class="a-dashed" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-dashed)"/>
4800
- <path data-edge-from="correct" data-edge-to="evidence" data-edge-key="11" data-edge-id="correct-evidence" data-composition-points="195,615;160,615;160,491;475,491" d="M 195 615 L 160 615 L 160 491 L 475 491" class="a-security" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4800
+ <path data-edge-from="correct" data-edge-to="evidence" data-edge-key="11" data-edge-id="correct-evidence" data-composition-points="195,615;160,615;160,491;465,491" d="M 195 615 L 160 615 L 160 491 L 465 491" class="a-security" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
4801
4801
  <path data-edge-from="correct" data-edge-to="blocked" data-edge-key="12" data-edge-id="correct-blocked" data-composition-points="195,615;35,615;35,615;113,615" d="M 195 615 L 35 615 L 35 615 L 113 615" class="a-dashed" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-dashed)"/>
4802
4802
 
4803
4803
  <!-- Nodes -->
@@ -4813,15 +4813,15 @@
4813
4813
  <text data-detail="context" x="88" y="131" class="t-muted" font-size="8" text-anchor="middle">intent</text>
4814
4814
  </g>
4815
4815
 
4816
- <g id="node-profile" data-node-id="profile" data-node-label="Profile" tabindex="0" role="button" aria-label="Focus Profile, facts, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="backend" data-node-sublabel="facts" data-node-context="Intent + Context › Discover + scope">
4817
- <title>Profile · facts · Intent + Context › Discover + scope</title>
4816
+ <g id="node-profile" data-node-id="profile" data-node-label="Profile" tabindex="0" role="button" aria-label="Focus Profile, discover, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="backend" data-node-sublabel="discover" data-node-context="Intent + Context › Discover + scope">
4817
+ <title>Profile · discover · Intent + Context › Discover + scope</title>
4818
4818
  <rect x="195" y="93" width="50" height="52" rx="6" class="c-mask"/>
4819
4819
  <rect x="195" y="93" width="50" height="52" rx="6" class="c-backend" data-animate="node" style="--step:1" stroke-width="1.5"/>
4820
4820
  <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(201 99) scale(0.6875)">
4821
4821
  <path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
4822
4822
  </g>
4823
4823
  <text data-detail-anchor="true" x="220" y="114" class="t-primary" font-size="10" font-weight="600" text-anchor="middle">Profile</text>
4824
- <text data-detail="context" x="220" y="131" class="t-muted" font-size="8" text-anchor="middle">facts</text>
4824
+ <text data-detail="context" x="220" y="131" class="t-muted" font-size="8" text-anchor="middle">discover</text>
4825
4825
  </g>
4826
4826
 
4827
4827
  <g id="node-contract" data-node-id="contract" data-node-label="Contract" tabindex="0" role="button" aria-label="Focus Contract, scope, Intent + Context › Discover + scope" aria-pressed="false" data-node-kind="security" data-node-sublabel="scope" data-node-tag="saved" data-node-context="Intent + Context › Discover + scope">
@@ -4850,53 +4850,53 @@
4850
4850
  <text data-detail="fine" x="300" y="265" class="t-security" font-size="6.3" text-anchor="middle">fail closed</text>
4851
4851
  </g>
4852
4852
 
4853
- <g id="node-gates" data-node-id="gates" data-node-label="Gates" tabindex="0" role="button" aria-label="Focus Gates, policy, Policy Boundary › Contract boundary › Route + authorize" aria-pressed="false" data-node-kind="security" data-node-sublabel="policy" data-node-context="Policy Boundary › Contract boundary › Route + authorize">
4854
- <title>Gates · policy · Policy Boundary › Contract boundary › Route + authorize</title>
4855
- <rect x="405" y="217" width="50" height="52" rx="6" class="c-mask"/>
4856
- <rect x="405" y="217" width="50" height="52" rx="6" class="c-security" data-animate="node" style="--step:4" stroke-width="1.5"/>
4857
- <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(411 223) scale(0.6875)">
4853
+ <g id="node-gates" data-node-id="gates" data-node-label="Claims" tabindex="0" role="button" aria-label="Focus Claims, Task + gates, Policy Boundary › Contract boundary › Route + authorize" aria-pressed="false" data-node-kind="security" data-node-sublabel="Task + gates" data-node-context="Policy Boundary › Contract boundary › Route + authorize">
4854
+ <title>Claims · Task + gates · Policy Boundary › Contract boundary › Route + authorize</title>
4855
+ <rect x="399" y="217" width="62" height="52" rx="6" class="c-mask"/>
4856
+ <rect x="399" y="217" width="62" height="52" rx="6" class="c-security" data-animate="node" style="--step:4" stroke-width="1.5"/>
4857
+ <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(405 223) scale(0.6875)">
4858
4858
  <path d="M8 2.2 13 4v3.5c0 3.1-1.8 5.4-5 6.5-3.2-1.1-5-3.4-5-6.5V4Z"/>
4859
4859
  <path d="m5.8 8 1.5 1.5 3-3"/>
4860
4860
  </g>
4861
- <text data-detail-anchor="true" x="430" y="238" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Gates</text>
4862
- <text data-detail="context" x="430" y="255" class="t-muted" font-size="8" text-anchor="middle">policy</text>
4861
+ <text data-detail-anchor="true" x="430" y="238" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Claims</text>
4862
+ <text data-detail="context" x="430" y="255" class="t-muted" font-size="7.5" text-anchor="middle">Task + gates</text>
4863
4863
  </g>
4864
4864
 
4865
- <g id="node-preflight" data-node-id="preflight" data-node-label="READY" tabindex="0" role="button" aria-label="Focus READY, unlock, Policy Boundary › Contract boundary › Route + authorize" aria-pressed="false" data-node-kind="security" data-node-sublabel="unlock" data-node-tag="PREFLIGHT" data-node-context="Policy Boundary › Contract boundary › Route + authorize">
4866
- <title>READY · unlock · Policy Boundary › Contract boundary › Route + authorize · PREFLIGHT</title>
4867
- <rect x="475" y="209" width="50" height="68" rx="6" class="c-mask"/>
4868
- <rect x="475" y="209" width="50" height="68" rx="6" class="c-security" data-animate="node" style="--step:5" stroke-width="1.5"/>
4869
- <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(481 215) scale(0.6875)">
4865
+ <g id="node-preflight" data-node-id="preflight" data-node-label="READY" tabindex="0" role="button" aria-label="Focus READY, binding, Policy Boundary › Contract boundary › Route + authorize" aria-pressed="false" data-node-kind="security" data-node-sublabel="binding" data-node-tag="Preflight" data-node-context="Policy Boundary › Contract boundary › Route + authorize">
4866
+ <title>READY · binding · Policy Boundary › Contract boundary › Route + authorize · Preflight</title>
4867
+ <rect x="470" y="209" width="60" height="68" rx="6" class="c-mask"/>
4868
+ <rect x="470" y="209" width="60" height="68" rx="6" class="c-security" data-animate="node" style="--step:5" stroke-width="1.5"/>
4869
+ <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(476 215) scale(0.6875)">
4870
4870
  <path d="M8 2.2 13 4v3.5c0 3.1-1.8 5.4-5 6.5-3.2-1.1-5-3.4-5-6.5V4Z"/>
4871
4871
  <path d="m5.8 8 1.5 1.5 3-3"/>
4872
4872
  </g>
4873
4873
  <text data-detail-anchor="true" x="500" y="230" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">READY</text>
4874
- <text data-detail="context" x="500" y="247" class="t-muted" font-size="8" text-anchor="middle">unlock</text>
4875
- <text data-detail="fine" x="500" y="265" class="t-security" font-size="7" text-anchor="middle">PREFLIGHT</text>
4874
+ <text data-detail="context" x="500" y="247" class="t-muted" font-size="8" text-anchor="middle">binding</text>
4875
+ <text data-detail="fine" x="500" y="265" class="t-security" font-size="7" text-anchor="middle">Preflight</text>
4876
4876
  </g>
4877
4877
 
4878
- <g id="node-work" data-node-id="work" data-node-label="Work" tabindex="0" role="button" aria-label="Focus Work, checkpoint, Resumable Execution › Route + authorize" aria-pressed="false" data-node-kind="backend" data-node-sublabel="checkpoint" data-node-context="Resumable Execution › Route + authorize">
4879
- <title>Work · checkpoint · Resumable Execution › Route + authorize</title>
4880
- <rect x="475" y="341" width="50" height="52" rx="6" class="c-mask"/>
4881
- <rect x="475" y="341" width="50" height="52" rx="6" class="c-backend" data-animate="node" style="--step:6" stroke-width="1.5"/>
4882
- <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(481 347) scale(0.6875)">
4878
+ <g id="node-work" data-node-id="work" data-node-label="Execution" tabindex="0" role="button" aria-label="Focus Execution, checkpoint, Resumable Execution › Route + authorize" aria-pressed="false" data-node-kind="backend" data-node-sublabel="checkpoint" data-node-context="Resumable Execution › Route + authorize">
4879
+ <title>Execution · checkpoint · Resumable Execution › Route + authorize</title>
4880
+ <rect x="469" y="341" width="62" height="52" rx="6" class="c-mask"/>
4881
+ <rect x="469" y="341" width="62" height="52" rx="6" class="c-backend" data-animate="node" style="--step:6" stroke-width="1.5"/>
4882
+ <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(475 347) scale(0.6875)">
4883
4883
  <path d="M6 3 3 8l3 5M10 3l3 5-3 5"/>
4884
4884
  </g>
4885
- <text data-detail-anchor="true" x="500" y="362" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Work</text>
4886
- <text data-detail="context" x="500" y="379" class="t-muted" font-size="7" text-anchor="middle">checkpoint</text>
4885
+ <text data-detail-anchor="true" x="500" y="362" class="t-primary" font-size="10" font-weight="600" text-anchor="middle">Execution</text>
4886
+ <text data-detail="context" x="500" y="379" class="t-muted" font-size="8" text-anchor="middle">checkpoint</text>
4887
4887
  </g>
4888
4888
 
4889
- <g id="node-evidence" data-node-id="evidence" data-node-label="Evidence" tabindex="0" role="button" aria-label="Focus Evidence, checks, Evidence Ledger › Evidence boundary › Route + authorize" aria-pressed="false" data-node-kind="database" data-node-sublabel="checks" data-node-tag="freshness" data-node-context="Evidence Ledger › Evidence boundary › Route + authorize">
4890
- <title>Evidence · checks · Evidence Ledger › Evidence boundary › Route + authorize · freshness</title>
4891
- <rect x="475" y="457" width="50" height="68" rx="6" class="c-mask"/>
4892
- <rect x="475" y="457" width="50" height="68" rx="6" class="c-database" data-animate="node" style="--step:7" stroke-width="1.5"/>
4893
- <g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(481 463) scale(0.6875)">
4889
+ <g id="node-evidence" data-node-id="evidence" data-node-label="Evidence" tabindex="0" role="button" aria-label="Focus Evidence, scope + checks, Evidence Ledger › Evidence boundary › Route + authorize" aria-pressed="false" data-node-kind="database" data-node-sublabel="scope + checks" data-node-tag="observed" data-node-context="Evidence Ledger › Evidence boundary › Route + authorize">
4890
+ <title>Evidence · scope + checks · Evidence Ledger › Evidence boundary › Route + authorize · observed</title>
4891
+ <rect x="465" y="457" width="70" height="68" rx="6" class="c-mask"/>
4892
+ <rect x="465" y="457" width="70" height="68" rx="6" class="c-database" data-animate="node" style="--step:7" stroke-width="1.5"/>
4893
+ <g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(471 463) scale(0.6875)">
4894
4894
  <ellipse cx="8" cy="4" rx="5" ry="2"/>
4895
4895
  <path d="M3 4v8c0 1.1 2.2 2 5 2s5-.9 5-2V4M3 8c0 1.1 2.2 2 5 2s5-.9 5-2"/>
4896
4896
  </g>
4897
- <text data-detail-anchor="true" x="500" y="478" class="t-primary" font-size="9" font-weight="600" text-anchor="middle">Evidence</text>
4898
- <text data-detail="context" x="500" y="495" class="t-muted" font-size="8" text-anchor="middle">checks</text>
4899
- <text data-detail="fine" x="500" y="513" class="t-database" font-size="7" text-anchor="middle">freshness</text>
4897
+ <text data-detail-anchor="true" x="500" y="478" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">Evidence</text>
4898
+ <text data-detail="context" x="500" y="495" class="t-muted" font-size="7.3" text-anchor="middle">scope + checks</text>
4899
+ <text data-detail="fine" x="500" y="513" class="t-database" font-size="7" text-anchor="middle">observed</text>
4900
4900
  </g>
4901
4901
 
4902
4902
  <g id="node-review" data-node-id="review" data-node-label="Review" tabindex="0" role="button" aria-label="Focus Review, drift, Review + Closure › Execute + verify" aria-pressed="false" data-node-kind="backend" data-node-sublabel="drift" data-node-context="Review + Closure › Execute + verify">
@@ -4910,8 +4910,8 @@
4910
4910
  <text data-detail="context" x="625" y="751" class="t-muted" font-size="8" text-anchor="middle">drift</text>
4911
4911
  </g>
4912
4912
 
4913
- <g id="node-valid" data-node-id="valid" data-node-label="VALID" tabindex="0" role="button" aria-label="Focus VALID, validator, Evidence Ledger › Evidence boundary › Execute + verify" aria-pressed="false" data-node-kind="database" data-node-sublabel="validator" data-node-tag="claim" data-node-context="Evidence Ledger › Evidence boundary › Execute + verify">
4914
- <title>VALID · validator · Evidence Ledger › Evidence boundary › Execute + verify · claim</title>
4913
+ <g id="node-valid" data-node-id="valid" data-node-label="VALID" tabindex="0" role="button" aria-label="Focus VALID, completion, Evidence Ledger › Evidence boundary › Execute + verify" aria-pressed="false" data-node-kind="database" data-node-sublabel="completion" data-node-tag="claim" data-node-context="Evidence Ledger › Evidence boundary › Execute + verify">
4914
+ <title>VALID · completion · Evidence Ledger › Evidence boundary › Execute + verify · claim</title>
4915
4915
  <rect x="600" y="457" width="50" height="68" rx="6" class="c-mask"/>
4916
4916
  <rect x="600" y="457" width="50" height="68" rx="6" class="c-database" data-animate="node" style="--step:9" stroke-width="1.5"/>
4917
4917
  <g aria-hidden="true" data-semantic-sigil="database" class="semantic-sigil s-database" transform="translate(606 463) scale(0.6875)">
@@ -4919,7 +4919,7 @@
4919
4919
  <path d="M3 4v8c0 1.1 2.2 2 5 2s5-.9 5-2V4M3 8c0 1.1 2.2 2 5 2s5-.9 5-2"/>
4920
4920
  </g>
4921
4921
  <text data-detail-anchor="true" x="625" y="478" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">VALID</text>
4922
- <text data-detail="context" x="625" y="495" class="t-muted" font-size="7.7" text-anchor="middle">validator</text>
4922
+ <text data-detail="context" x="625" y="495" class="t-muted" font-size="7" text-anchor="middle">completion</text>
4923
4923
  <text data-detail="fine" x="625" y="513" class="t-database" font-size="7" text-anchor="middle">claim</text>
4924
4924
  </g>
4925
4925