@tea-agent/loop-agent 0.39.0-beta.7 → 0.39.0-beta.9

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 (164) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +23 -5
  3. package/README.md +2 -2
  4. package/dist/application/task-lifecycle/advance.js +12 -0
  5. package/dist/build-stamp.json +3 -3
  6. package/dist/cli/command-definitions.js +7 -0
  7. package/dist/cli/program.js +5 -0
  8. package/dist/cli/update/runtime-activity.js +1 -29
  9. package/dist/commands/dag-follow-up.js +138 -0
  10. package/dist/commands/dag-rerun.js +1 -1
  11. package/dist/commands/init.js +26 -0
  12. package/dist/executors/dag-pi-executor.js +326 -8
  13. package/dist/executors/pi-read-budget-policy.js +166 -0
  14. package/dist/executors/shell-executor.js +26 -30
  15. package/dist/shared/dag-prompt-override.js +4 -5
  16. package/dist/shared/update/npm-client.js +33 -11
  17. package/dist/task/config-types.js +15 -0
  18. package/dist/task/contract/apply.js +11 -1
  19. package/dist/task/contract/constants.js +2 -0
  20. package/dist/task/contract/hash.js +3 -0
  21. package/dist/task/contract/observe.js +25 -4
  22. package/dist/task/contract/paths.js +2 -1
  23. package/dist/task/contract/project.js +15 -1
  24. package/dist/task/contract/schema.js +2 -0
  25. package/dist/task/contract/transaction.js +12 -0
  26. package/dist/task/frontend-project-capability.js +123 -4
  27. package/dist/task/source-prepare/completeness.js +188 -0
  28. package/dist/task/source-prepare/fragment-inventory.js +477 -0
  29. package/dist/task/source-prepare/index.js +3 -0
  30. package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
  31. package/dist/task/source-prepare/ledger-review.js +214 -0
  32. package/dist/task/source-prepare/ledger.js +545 -0
  33. package/dist/task/source-prepare/prepare.js +262 -1
  34. package/dist/task/source-prepare/semantic-intake.js +25 -5
  35. package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
  36. package/dist/task/source-prepare/types.js +22 -0
  37. package/dist/worker/cli.js +12 -26
  38. package/dist/worker/console/console-handoff.js +82 -0
  39. package/dist/worker/console/console-update-and-init.js +115 -0
  40. package/dist/worker/console/console-update-runtime.js +84 -0
  41. package/dist/worker/console/draft-store.js +49 -0
  42. package/dist/worker/console/operation-store.js +1 -1
  43. package/dist/worker/console/operator-actions.js +129 -4
  44. package/dist/worker/console/operator-surface-health.js +1 -0
  45. package/dist/worker/console/prd-intake-bridge.js +13 -0
  46. package/dist/worker/console/routes.js +3 -0
  47. package/dist/worker/console/server.js +73 -5
  48. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-bPer1waP.js → abnfDiagram-N423BO3Z-D1-Z-BBa.js} +1 -1
  49. package/dist/worker/console/static/assets/{arc-BLdkwucW.js → arc-q8qAYm5m.js} +1 -1
  50. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-Bw4wo4I1.js → architectureDiagram-T3A2C74G-CAu4_lve.js} +1 -1
  51. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-DUUkc0gr.js → blockDiagram-VBNYF7ZC-D5GhQvHm.js} +1 -1
  52. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BC3O0nob.js → c4Diagram-5PPSVZJV-ClQjeLkO.js} +1 -1
  53. package/dist/worker/console/static/assets/channel-ClAuhSUL.js +1 -0
  54. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-Dd4g2nti.js → chunk-2GRJ4B5K-DLqWlFbo.js} +1 -1
  55. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-s2EDm7-n.js → chunk-2Q5K7J3B-DkRT_usL.js} +1 -1
  56. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-GqtHM2yQ.js → chunk-5RXB4S5H-Cqp7Chi3.js} +1 -1
  57. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BzRFrN8j.js → chunk-5VM5RSS4-CedEdFB9.js} +1 -1
  58. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-Bw9nFjCJ.js → chunk-6Q2QTUOP-BHM8vP5x.js} +1 -1
  59. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-B4n-03Qm.js → chunk-GF5L2VYU-D7EFr377.js} +1 -1
  60. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-Dt75ZdBD.js → chunk-JWPE2WC7-DR38mTWV.js} +1 -1
  61. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-B_afMhHB.js → chunk-KBJHAD2P-BFv2LsR3.js} +1 -1
  62. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-Bd8Rqqg9.js → chunk-RYQCIY6F-BAvpJS5z.js} +1 -1
  63. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-9boOMji4.js → chunk-XXDRQBXY-eKI9TO72.js} +1 -1
  64. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-cBgeCpVU.js +1 -0
  65. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-cBgeCpVU.js +1 -0
  66. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BtCycfCc.js → cose-bilkent-JH36ORCC-BMJXpgo4.js} +1 -1
  67. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-eTOts9L1.js → cynefin-VYW2F7L2-CKJ2ofZx.js} +1 -1
  68. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Cibd2mjg.js → cynefinDiagram-MW4NZA55-CsKnsazm.js} +1 -1
  69. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CDjDZtDV.js → dagre-VZM6K2ZE-DVQ46vIw.js} +1 -1
  70. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Btexn-JJ.js → diagram-7IWD3JNH-D_RuonYS.js} +1 -1
  71. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-Cyl8sdpM.js → diagram-B4RE2ZJO-D2Mt0nMu.js} +1 -1
  72. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-Ev-83E1t.js → diagram-LBJQPF4R-DjBDuye6.js} +1 -1
  73. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-41LqE0Mc.js → diagram-Q27KOJAE-8VZkqpE_.js} +1 -1
  74. package/dist/worker/console/static/assets/{diagram-UB23O5K3-BC39T5R3.js → diagram-UB23O5K3-D0izYxia.js} +1 -1
  75. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-DzcNRuri.js → ebnfDiagram-BXEA7PRR-CncG2I95.js} +1 -1
  76. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-B5Frvvnz.js → erDiagram-JOGREHBK-DiBUUXR8.js} +1 -1
  77. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-BapxROIM.js → flowDiagram-UKHOOZJN-Dtc0fArb.js} +1 -1
  78. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-Cd4d4wQ0.js → ganttDiagram-PKOTCBZU-BPNFP5OZ.js} +1 -1
  79. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-CrL6buFW.js → gitGraphDiagram-DS77QQ5N-CsgpxEEd.js} +1 -1
  80. package/dist/worker/console/static/assets/{index-DBh_x_Ek.js → index-Bai8Z25q.js} +81 -81
  81. package/dist/worker/console/static/assets/index-CH0Tr5hY.css +1 -0
  82. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-BrSiNxyd.js → infoDiagram-6WML65LV-kHGxkJUS.js} +1 -1
  83. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-gvlvY-n9.js → ishikawaDiagram-WSZJBQD7-CbLe9wrr.js} +1 -1
  84. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-D-YaPzRQ.js → journeyDiagram-NVQOT4AX-BOkwxAcP.js} +1 -1
  85. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BsmDv9E_.js → kanban-definition-27J2QSJJ-BHYQ2rDu.js} +1 -1
  86. package/dist/worker/console/static/assets/{linear-UWaoDN3h.js → linear-CHT4ujob.js} +1 -1
  87. package/dist/worker/console/static/assets/{mermaid.core-BlvpGVG8.js → mermaid.core-yL8sfqnY.js} +5 -5
  88. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-CUCIP5CP.js → mindmap-definition-FAOFIHXS-DZx1coV-.js} +1 -1
  89. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-CB1aQUAK.js → pegDiagram-VL7TDLO6-DStWRCI8.js} +1 -1
  90. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-BwehHxhf.js → pieDiagram-7S7Q4E2Y-DSKZkwzK.js} +1 -1
  91. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-CFz30APB.js → quadrantDiagram-CIZ2JOQS-CmoEGOuW.js} +1 -1
  92. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BwNmw1i6.js → railroadDiagram-AXF67PYL-BLqzhKyq.js} +1 -1
  93. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-jg-tPXlI.js → requirementDiagram-LRYGKXZP-gbHeUabM.js} +1 -1
  94. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-BlyReDKl.js → sankeyDiagram-W5VNT64P-CaKkBCKO.js} +1 -1
  95. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DBUzW1f3.js → sequenceDiagram-SI44F4Z6-PUbi3Upu.js} +1 -1
  96. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-BYcI2RAr.js → sizeCapture-X5ZJPWSS-dm7S9Qfe.js} +1 -1
  97. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-D7AiyJdo.js → stateDiagram-OKZ733FA-C7WSzv4p.js} +1 -1
  98. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-sQDv5AP3.js +1 -0
  99. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-BHGt7Kkv.js → swimlanes-SLNWSIFB-CBKCiQwd.js} +2 -2
  100. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BXwsmcPs.js +8 -0
  101. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-OPjooWcX.js → timeline-definition-Z64GVDOM-CvnUlylk.js} +1 -1
  102. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-ggsWDvrO.js → vennDiagram-T6HMQDX7-xM0StY1O.js} +1 -1
  103. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DjNe-BjZ.js → wardleyDiagram-T6FBY63Y-CWtJMagy.js} +1 -1
  104. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-Byp63Hei.js → xychartDiagram-ELKLHX3M-BO_-MeK8.js} +1 -1
  105. package/dist/worker/console/static/index.html +2 -2
  106. package/dist/worker/console/static-src/app/console-types.js +40 -1
  107. package/dist/worker/console/static-src/app/useOperatorActions.js +5 -0
  108. package/dist/worker/console/static-src/app/useTaskWizard.js +73 -1
  109. package/dist/worker/observability/init-runtime-activity.js +26 -0
  110. package/dist/worker/observe/node-input.js +88 -2
  111. package/dist/worker/observe/routes.js +188 -0
  112. package/dist/worker/observe/static/api.js +3 -3
  113. package/dist/worker/observe/static/format.js +37 -0
  114. package/dist/worker/observe/static/index.html +5 -0
  115. package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
  116. package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
  117. package/dist/worker/observe/static/state.js +2 -2
  118. package/dist/worker/observe/static/styles.css +331 -35
  119. package/dist/worker/observe/static/views/dag-inspector.js +509 -78
  120. package/dist/worker/observe/static/views/task.js +55 -0
  121. package/dist/workflows/dag/frontend-design-policy.js +19 -9
  122. package/dist/workflows/dag/frontend-implementation-contract.js +117 -50
  123. package/dist/workflows/dag/frontend-plan-render.js +27 -0
  124. package/dist/workflows/dag/frontend-prewrite-gate.js +45 -1
  125. package/dist/workflows/dag/frontend-recovery-controller.js +1 -0
  126. package/dist/workflows/dag/frontend-review-context.js +102 -15
  127. package/dist/workflows/dag/frontend-review-findings.js +42 -10
  128. package/dist/workflows/dag/frontend-shadow-dual-write.js +36 -2
  129. package/dist/workflows/dag/frontend-source-fidelity-ledger.js +108 -0
  130. package/dist/workflows/dag/frontend-worktree-diff.js +154 -0
  131. package/dist/workflows/dag/frontend-writer-admission.js +12 -0
  132. package/dist/workflows/dag/init-hybrid.js +297 -65
  133. package/dist/workflows/dag/interrupt-request.js +7 -0
  134. package/dist/workflows/dag/node-execution.js +111 -1
  135. package/dist/workflows/dag/prompt.js +34 -1
  136. package/dist/workflows/dag/recovery-lease.js +80 -0
  137. package/dist/workflows/dag/rerun-feedback.js +31 -8
  138. package/dist/workflows/dag/rerun-run.js +23 -0
  139. package/dist/workflows/dag/rerun-task.js +29 -0
  140. package/dist/workflows/dag/retry-policy.js +34 -9
  141. package/dist/workflows/dag/runner.js +83 -16
  142. package/dist/workflows/dag/types.js +67 -11
  143. package/docs/README.md +1 -0
  144. package/docs/architecture/evolution.md +45 -0
  145. package/docs/init-surface.manifest.json +4 -0
  146. package/docs/templates/README.md +2 -1
  147. package/docs/templates/frontend-implementation-contract.schema.json +684 -24
  148. package/docs/templates/spec-registry.schema.json +45 -0
  149. package/harness.json +3 -3
  150. package/package.json +1 -1
  151. package/skills/frontend-bounded-implement/SKILL.md +8 -14
  152. package/skills/frontend-design-review/SKILL.md +20 -41
  153. package/skills/frontend-implementation/SKILL.md +2 -3
  154. package/skills/frontend-implementation/references/design-spec.md +4 -3
  155. package/skills/frontend-implementation/references/node-contracts.md +4 -3
  156. package/skills/frontend-review/SKILL.md +22 -14
  157. package/skills/frontend-review/references/review-findings.md +6 -7
  158. package/skills/loop-agent/references/hybrid-dag.md +7 -0
  159. package/dist/worker/console/static/assets/channel-AbFtVnFm.js +0 -1
  160. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-n1yf2Jcv.js +0 -1
  161. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-n1yf2Jcv.js +0 -1
  162. package/dist/worker/console/static/assets/index-DwOGauxU.css +0 -1
  163. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BBSH5c8m.js +0 -1
  164. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-D2F7-U4H.js +0 -8
@@ -4,32 +4,692 @@
4
4
  "title": "Frontend Implementation Contract v1",
5
5
  "type": "object",
6
6
  "additionalProperties": false,
7
- "required": ["schemaVersion", "sourceBinding", "riskLevel", "targets", "requirements", "uiStates", "interactions", "mockApi", "designEvidence", "verificationTargets", "evidenceGaps"],
7
+ "required": [
8
+ "schemaVersion",
9
+ "sourceBinding",
10
+ "riskLevel",
11
+ "targets",
12
+ "requirements",
13
+ "uiStates",
14
+ "interactions",
15
+ "mockApi",
16
+ "designEvidence",
17
+ "verificationTargets",
18
+ "evidenceGaps"
19
+ ],
8
20
  "properties": {
9
- "schemaVersion": { "const": 1 },
10
- "sourceBinding": { "$ref": "#/$defs/sourceBinding" },
11
- "riskLevel": { "enum": ["small", "standard", "high-risk"] },
12
- "targets": { "type": "object", "additionalProperties": false, "required": ["files"], "properties": { "files": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/path" } }, "routes": { "type": "array", "items": { "type": "string", "pattern": "^/" } }, "publicApiChanges": { "type": "array", "items": { "type": "string", "minLength": 1 } } } },
13
- "requirements": { "type": "array", "minItems": 1, "items": { "type": "object", "additionalProperties": false, "required": ["id", "expectedOutcome", "implementationTargets", "verificationTargetIds"], "properties": { "id": { "$ref": "#/$defs/requirementId" }, "expectedOutcome": { "type": "string", "minLength": 1 }, "implementationTargets": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "verificationTargetIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "evidenceGap": { "$ref": "#/$defs/gap" } } } },
14
- "uiStates": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["name", "applicable"], "properties": { "name": { "type": "string", "minLength": 1 }, "applicable": { "type": "boolean" }, "expectedBehavior": { "type": "string", "minLength": 1 }, "implementationTargets": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "verificationTargetIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "notApplicableReason": { "type": "string", "minLength": 1 } }, "allOf": [{ "if": { "properties": { "applicable": { "const": true } }, "required": ["applicable"] }, "then": { "required": ["expectedBehavior", "implementationTargets", "verificationTargetIds"], "properties": { "implementationTargets": { "minItems": 1 }, "verificationTargetIds": { "minItems": 1 } } } }, { "if": { "properties": { "applicable": { "const": false } }, "required": ["applicable"] }, "then": { "required": ["notApplicableReason"] } }] } },
15
- "interactions": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["name", "trigger", "expectedBehavior", "implementationTargets", "verificationTargetIds"], "properties": { "name": { "type": "string", "minLength": 1 }, "trigger": { "type": "string", "minLength": 1 }, "expectedBehavior": { "type": "string", "minLength": 1 }, "implementationTargets": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "verificationTargetIds": { "type": "array", "items": { "type": "string" } } } } },
16
- "mockApi": { "type": "object", "additionalProperties": false, "required": ["strategy", "productionDefaultOff", "activation", "endpoints"], "properties": { "strategy": { "enum": ["native", "browser-intercept", "request-adapter", "not-needed"] }, "productionDefaultOff": { "const": true }, "activation": { "type": ["string", "null"], "minLength": 1 }, "endpoints": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["method", "path"], "properties": { "method": { "enum": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] }, "path": { "type": "string", "pattern": "^/" }, "fixture": { "anyOf": [{ "$ref": "#/$defs/path" }, { "type": "null" }] }, "consumer": { "anyOf": [{ "$ref": "#/$defs/path" }, { "type": "null" }] } } } } } },
17
- "designEvidence": { "type": "object", "additionalProperties": false, "required": ["source", "paths", "conflicts"], "properties": { "source": { "type": "string", "minLength": 1 }, "paths": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "conflicts": { "type": "array", "items": { "type": "string", "minLength": 1 } } } },
18
- "verificationTargets": { "type": "array", "minItems": 1, "items": { "type": "object", "additionalProperties": false, "required": ["id", "type", "commandLabel", "file", "requirementIds", "uiStates"], "properties": { "id": { "type": "string", "minLength": 1 }, "type": { "enum": ["static", "unit", "component", "integration", "mock"] }, "commandLabel": { "type": "string", "minLength": 1 }, "file": { "$ref": "#/$defs/path" }, "symbol": { "anyOf": [{ "type": "string", "minLength": 1 }, { "type": "null" }] }, "requirementIds": { "type": "array", "items": { "$ref": "#/$defs/requirementId" } }, "uiStates": { "type": "array", "items": { "type": "string", "minLength": 1 } } } } },
19
- "evidenceGaps": { "type": "array", "items": { "$ref": "#/$defs/gap" } },
20
- "implementationSteps": { "type": "array", "items": { "type": "string", "minLength": 1 } },
21
- "stylingStrategy": { "type": "string", "minLength": 1 },
22
- "uiComponentChoices": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["purpose", "component", "decision", "rationale"], "properties": { "purpose": { "type": "string", "minLength": 1 }, "component": { "type": "string", "minLength": 1 }, "decision": { "enum": ["specified", "reuse-existing", "new"] }, "specReference": { "anyOf": [{ "$ref": "#/$defs/uiComponentSpecReference" }, { "type": "null" }] }, "rationale": { "type": "string", "minLength": 1 } }, "allOf": [ { "if": { "properties": { "decision": { "const": "specified" } }, "required": ["decision"] }, "then": { "required": ["specReference"], "properties": { "specReference": { "$ref": "#/$defs/uiComponentSpecReference" } } } }, { "if": { "properties": { "decision": { "const": "new" } }, "required": ["decision"] }, "then": { "properties": { "specReference": { "type": "null" } } } } ] } },
23
- "dependencyPolicy": { "type": "string", "minLength": 1 },
24
- "residualRisks": { "type": "array", "items": { "type": "string", "minLength": 1 } },
25
- "realIntegrationGap": { "type": "string", "minLength": 1 }
21
+ "schemaVersion": {
22
+ "const": 1
23
+ },
24
+ "sourceBinding": {
25
+ "$ref": "#/$defs/sourceBinding"
26
+ },
27
+ "riskLevel": {
28
+ "enum": [
29
+ "small",
30
+ "standard",
31
+ "high-risk"
32
+ ]
33
+ },
34
+ "targets": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": [
38
+ "files"
39
+ ],
40
+ "properties": {
41
+ "files": {
42
+ "type": "array",
43
+ "minItems": 1,
44
+ "items": {
45
+ "$ref": "#/$defs/path"
46
+ }
47
+ },
48
+ "routes": {
49
+ "type": "array",
50
+ "items": {
51
+ "type": "string",
52
+ "pattern": "^/"
53
+ }
54
+ },
55
+ "publicApiChanges": {
56
+ "type": "array",
57
+ "items": {
58
+ "type": "string",
59
+ "minLength": 1
60
+ }
61
+ }
62
+ }
63
+ },
64
+ "requirements": {
65
+ "type": "array",
66
+ "minItems": 1,
67
+ "items": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "required": [
71
+ "id",
72
+ "expectedOutcome",
73
+ "implementationTargets",
74
+ "verificationTargetIds"
75
+ ],
76
+ "properties": {
77
+ "id": {
78
+ "$ref": "#/$defs/requirementId"
79
+ },
80
+ "expectedOutcome": {
81
+ "type": "string",
82
+ "minLength": 1
83
+ },
84
+ "implementationTargets": {
85
+ "type": "array",
86
+ "items": {
87
+ "$ref": "#/$defs/path"
88
+ }
89
+ },
90
+ "verificationTargetIds": {
91
+ "type": "array",
92
+ "items": {
93
+ "type": "string",
94
+ "minLength": 1
95
+ }
96
+ },
97
+ "evidenceGap": {
98
+ "$ref": "#/$defs/gap"
99
+ },
100
+ "sourceFragmentIds": {
101
+ "type": "array",
102
+ "items": {
103
+ "type": "string",
104
+ "minLength": 1
105
+ }
106
+ },
107
+ "sourceRefs": {
108
+ "type": "array",
109
+ "items": {
110
+ "$ref": "#/$defs/path"
111
+ }
112
+ }
113
+ }
114
+ }
115
+ },
116
+ "uiStates": {
117
+ "type": "array",
118
+ "items": {
119
+ "type": "object",
120
+ "additionalProperties": false,
121
+ "required": [
122
+ "name",
123
+ "applicable"
124
+ ],
125
+ "properties": {
126
+ "name": {
127
+ "type": "string",
128
+ "minLength": 1
129
+ },
130
+ "applicable": {
131
+ "type": "boolean"
132
+ },
133
+ "expectedBehavior": {
134
+ "type": "string",
135
+ "minLength": 1
136
+ },
137
+ "implementationTargets": {
138
+ "type": "array",
139
+ "items": {
140
+ "$ref": "#/$defs/path"
141
+ }
142
+ },
143
+ "verificationTargetIds": {
144
+ "type": "array",
145
+ "items": {
146
+ "type": "string",
147
+ "minLength": 1
148
+ }
149
+ },
150
+ "notApplicableReason": {
151
+ "type": "string",
152
+ "minLength": 1
153
+ }
154
+ },
155
+ "allOf": [
156
+ {
157
+ "if": {
158
+ "properties": {
159
+ "applicable": {
160
+ "const": true
161
+ }
162
+ },
163
+ "required": [
164
+ "applicable"
165
+ ]
166
+ },
167
+ "then": {
168
+ "required": [
169
+ "expectedBehavior",
170
+ "implementationTargets",
171
+ "verificationTargetIds"
172
+ ],
173
+ "properties": {
174
+ "implementationTargets": {
175
+ "minItems": 1
176
+ },
177
+ "verificationTargetIds": {
178
+ "minItems": 1
179
+ }
180
+ }
181
+ }
182
+ },
183
+ {
184
+ "if": {
185
+ "properties": {
186
+ "applicable": {
187
+ "const": false
188
+ }
189
+ },
190
+ "required": [
191
+ "applicable"
192
+ ]
193
+ },
194
+ "then": {
195
+ "required": [
196
+ "notApplicableReason"
197
+ ]
198
+ }
199
+ }
200
+ ]
201
+ }
202
+ },
203
+ "interactions": {
204
+ "type": "array",
205
+ "items": {
206
+ "type": "object",
207
+ "additionalProperties": false,
208
+ "required": [
209
+ "name",
210
+ "trigger",
211
+ "expectedBehavior",
212
+ "implementationTargets",
213
+ "verificationTargetIds"
214
+ ],
215
+ "properties": {
216
+ "name": {
217
+ "type": "string",
218
+ "minLength": 1
219
+ },
220
+ "trigger": {
221
+ "type": "string",
222
+ "minLength": 1
223
+ },
224
+ "expectedBehavior": {
225
+ "type": "string",
226
+ "minLength": 1
227
+ },
228
+ "implementationTargets": {
229
+ "type": "array",
230
+ "items": {
231
+ "$ref": "#/$defs/path"
232
+ }
233
+ },
234
+ "verificationTargetIds": {
235
+ "type": "array",
236
+ "items": {
237
+ "type": "string"
238
+ }
239
+ }
240
+ }
241
+ }
242
+ },
243
+ "mockApi": {
244
+ "type": "object",
245
+ "additionalProperties": false,
246
+ "required": [
247
+ "strategy",
248
+ "productionDefaultOff",
249
+ "activation",
250
+ "endpoints"
251
+ ],
252
+ "properties": {
253
+ "strategy": {
254
+ "enum": [
255
+ "native",
256
+ "browser-intercept",
257
+ "request-adapter",
258
+ "not-needed"
259
+ ]
260
+ },
261
+ "productionDefaultOff": {
262
+ "const": true
263
+ },
264
+ "activation": {
265
+ "type": [
266
+ "string",
267
+ "null"
268
+ ],
269
+ "minLength": 1
270
+ },
271
+ "endpoints": {
272
+ "type": "array",
273
+ "items": {
274
+ "type": "object",
275
+ "additionalProperties": false,
276
+ "required": [
277
+ "method",
278
+ "path"
279
+ ],
280
+ "properties": {
281
+ "method": {
282
+ "enum": [
283
+ "GET",
284
+ "POST",
285
+ "PUT",
286
+ "PATCH",
287
+ "DELETE",
288
+ "HEAD",
289
+ "OPTIONS"
290
+ ]
291
+ },
292
+ "path": {
293
+ "type": "string",
294
+ "pattern": "^/"
295
+ },
296
+ "fixture": {
297
+ "anyOf": [
298
+ {
299
+ "$ref": "#/$defs/path"
300
+ },
301
+ {
302
+ "type": "null"
303
+ }
304
+ ]
305
+ },
306
+ "consumer": {
307
+ "anyOf": [
308
+ {
309
+ "$ref": "#/$defs/path"
310
+ },
311
+ {
312
+ "type": "null"
313
+ }
314
+ ]
315
+ }
316
+ }
317
+ }
318
+ }
319
+ }
320
+ },
321
+ "designEvidence": {
322
+ "type": "object",
323
+ "additionalProperties": false,
324
+ "required": [
325
+ "source",
326
+ "paths",
327
+ "conflicts"
328
+ ],
329
+ "properties": {
330
+ "source": {
331
+ "type": "string",
332
+ "minLength": 1
333
+ },
334
+ "paths": {
335
+ "type": "array",
336
+ "items": {
337
+ "$ref": "#/$defs/path"
338
+ }
339
+ },
340
+ "conflicts": {
341
+ "type": "array",
342
+ "items": {
343
+ "type": "string",
344
+ "minLength": 1
345
+ }
346
+ }
347
+ }
348
+ },
349
+ "verificationTargets": {
350
+ "type": "array",
351
+ "minItems": 1,
352
+ "items": {
353
+ "type": "object",
354
+ "additionalProperties": false,
355
+ "required": [
356
+ "id",
357
+ "type",
358
+ "commandLabel",
359
+ "file",
360
+ "requirementIds",
361
+ "uiStates"
362
+ ],
363
+ "properties": {
364
+ "id": {
365
+ "type": "string",
366
+ "minLength": 1
367
+ },
368
+ "type": {
369
+ "enum": [
370
+ "static",
371
+ "unit",
372
+ "component",
373
+ "integration",
374
+ "mock"
375
+ ]
376
+ },
377
+ "commandLabel": {
378
+ "type": "string",
379
+ "minLength": 1
380
+ },
381
+ "file": {
382
+ "$ref": "#/$defs/path"
383
+ },
384
+ "symbol": {
385
+ "anyOf": [
386
+ {
387
+ "type": "string",
388
+ "minLength": 1
389
+ },
390
+ {
391
+ "type": "null"
392
+ }
393
+ ]
394
+ },
395
+ "requirementIds": {
396
+ "type": "array",
397
+ "items": {
398
+ "$ref": "#/$defs/requirementId"
399
+ }
400
+ },
401
+ "uiStates": {
402
+ "type": "array",
403
+ "items": {
404
+ "type": "string",
405
+ "minLength": 1
406
+ }
407
+ }
408
+ }
409
+ }
410
+ },
411
+ "evidenceGaps": {
412
+ "type": "array",
413
+ "items": {
414
+ "$ref": "#/$defs/gap"
415
+ }
416
+ },
417
+ "implementationSteps": {
418
+ "type": "array",
419
+ "items": {
420
+ "type": "string",
421
+ "minLength": 1
422
+ }
423
+ },
424
+ "stylingStrategy": {
425
+ "type": "string",
426
+ "minLength": 1
427
+ },
428
+ "uiComponentChoices": {
429
+ "type": "array",
430
+ "items": {
431
+ "type": "object",
432
+ "additionalProperties": false,
433
+ "required": [
434
+ "purpose",
435
+ "component",
436
+ "decision",
437
+ "rationale"
438
+ ],
439
+ "properties": {
440
+ "purpose": {
441
+ "type": "string",
442
+ "minLength": 1
443
+ },
444
+ "component": {
445
+ "type": "string",
446
+ "minLength": 1
447
+ },
448
+ "decision": {
449
+ "enum": [
450
+ "specified",
451
+ "reuse-existing",
452
+ "new"
453
+ ]
454
+ },
455
+ "specReference": {
456
+ "anyOf": [
457
+ {
458
+ "$ref": "#/$defs/uiComponentSpecReference"
459
+ },
460
+ {
461
+ "type": "null"
462
+ }
463
+ ]
464
+ },
465
+ "rationale": {
466
+ "type": "string",
467
+ "minLength": 1
468
+ }
469
+ },
470
+ "allOf": [
471
+ {
472
+ "if": {
473
+ "properties": {
474
+ "decision": {
475
+ "const": "specified"
476
+ }
477
+ },
478
+ "required": [
479
+ "decision"
480
+ ]
481
+ },
482
+ "then": {
483
+ "required": [
484
+ "specReference"
485
+ ],
486
+ "properties": {
487
+ "specReference": {
488
+ "$ref": "#/$defs/uiComponentSpecReference"
489
+ }
490
+ }
491
+ }
492
+ },
493
+ {
494
+ "if": {
495
+ "properties": {
496
+ "decision": {
497
+ "const": "new"
498
+ }
499
+ },
500
+ "required": [
501
+ "decision"
502
+ ]
503
+ },
504
+ "then": {
505
+ "required": [
506
+ "specReference"
507
+ ],
508
+ "properties": {
509
+ "specReference": {
510
+ "$ref": "#/$defs/uiComponentSpecReference"
511
+ }
512
+ }
513
+ }
514
+ }
515
+ ]
516
+ }
517
+ },
518
+ "dependencyPolicy": {
519
+ "type": "string",
520
+ "minLength": 1
521
+ },
522
+ "residualRisks": {
523
+ "type": "array",
524
+ "items": {
525
+ "type": "string",
526
+ "minLength": 1
527
+ }
528
+ },
529
+ "realIntegrationGap": {
530
+ "type": "string",
531
+ "minLength": 1
532
+ }
26
533
  },
27
- "allOf": [{ "if": { "properties": { "mockApi": { "properties": { "strategy": { "enum": ["native", "browser-intercept", "request-adapter"] } } } } }, "then": { "properties": { "mockApi": { "properties": { "endpoints": { "minItems": 1, "items": { "required": ["method", "path", "fixture", "consumer"] } } } } } } }],
534
+ "allOf": [
535
+ {
536
+ "if": {
537
+ "properties": {
538
+ "mockApi": {
539
+ "properties": {
540
+ "strategy": {
541
+ "enum": [
542
+ "native",
543
+ "browser-intercept",
544
+ "request-adapter"
545
+ ]
546
+ }
547
+ }
548
+ }
549
+ }
550
+ },
551
+ "then": {
552
+ "properties": {
553
+ "mockApi": {
554
+ "properties": {
555
+ "endpoints": {
556
+ "minItems": 1,
557
+ "items": {
558
+ "required": [
559
+ "method",
560
+ "path",
561
+ "fixture",
562
+ "consumer"
563
+ ]
564
+ }
565
+ }
566
+ }
567
+ }
568
+ }
569
+ }
570
+ }
571
+ ],
28
572
  "$defs": {
29
- "path": { "type": "string", "minLength": 1, "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$" },
30
- "requirementId": { "type": "string", "pattern": "^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$" },
31
- "gap": { "type": "object", "additionalProperties": false, "required": ["description", "blocking"], "properties": { "requirementId": { "$ref": "#/$defs/requirementId" }, "description": { "type": "string", "minLength": 1 }, "blocking": { "type": "boolean" } } },
32
- "sourceBinding": { "type": "object", "additionalProperties": false, "required": ["taskId", "requirementPath", "requirementSha256", "referencePaths", "requirementIds"], "properties": { "taskId": { "type": "string", "minLength": 1 }, "requirementPath": { "$ref": "#/$defs/path" }, "requirementSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "referencePaths": { "type": "array", "items": { "$ref": "#/$defs/path" } }, "requirementIds": { "type": "array", "items": { "$ref": "#/$defs/requirementId" } } } },
33
- "uiComponentSpecReference": { "type": "object", "additionalProperties": false, "required": ["path", "section"], "properties": { "path": { "$ref": "#/$defs/path" }, "section": { "type": "string" }, "line": { "anyOf": [{ "type": "integer" }, { "type": "null" }] } } }
573
+ "path": {
574
+ "type": "string",
575
+ "minLength": 1,
576
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$"
577
+ },
578
+ "requirementId": {
579
+ "type": "string",
580
+ "pattern": "^(?:REQ|BR|AC)-[A-Z0-9]+(?:-[A-Z0-9]+)*$"
581
+ },
582
+ "gap": {
583
+ "type": "object",
584
+ "additionalProperties": false,
585
+ "required": [
586
+ "description",
587
+ "blocking"
588
+ ],
589
+ "properties": {
590
+ "requirementId": {
591
+ "$ref": "#/$defs/requirementId"
592
+ },
593
+ "description": {
594
+ "type": "string",
595
+ "minLength": 1
596
+ },
597
+ "blocking": {
598
+ "type": "boolean"
599
+ }
600
+ }
601
+ },
602
+ "sourceBinding": {
603
+ "type": "object",
604
+ "additionalProperties": false,
605
+ "required": [
606
+ "taskId",
607
+ "requirementPath",
608
+ "requirementSha256",
609
+ "referencePaths",
610
+ "requirementIds"
611
+ ],
612
+ "allOf": [
613
+ {
614
+ "if": {
615
+ "required": ["ledgerPath"]
616
+ },
617
+ "then": {
618
+ "required": ["ledgerSha256", "inputDigest", "requirementToFragments"]
619
+ }
620
+ }
621
+ ],
622
+ "properties": {
623
+ "taskId": {
624
+ "type": "string",
625
+ "minLength": 1
626
+ },
627
+ "requirementPath": {
628
+ "$ref": "#/$defs/path"
629
+ },
630
+ "requirementSha256": {
631
+ "type": "string",
632
+ "pattern": "^[a-f0-9]{64}$"
633
+ },
634
+ "referencePaths": {
635
+ "type": "array",
636
+ "items": {
637
+ "$ref": "#/$defs/path"
638
+ }
639
+ },
640
+ "requirementIds": {
641
+ "type": "array",
642
+ "items": {
643
+ "$ref": "#/$defs/requirementId"
644
+ }
645
+ },
646
+ "ledgerPath": {
647
+ "$ref": "#/$defs/path"
648
+ },
649
+ "ledgerSha256": {
650
+ "type": "string",
651
+ "pattern": "^[a-f0-9]{64}$"
652
+ },
653
+ "inputDigest": {
654
+ "type": "string",
655
+ "pattern": "^[a-f0-9]{64}$"
656
+ },
657
+ "requirementToFragments": {
658
+ "type": "object",
659
+ "additionalProperties": {
660
+ "type": "array",
661
+ "items": {
662
+ "type": "string"
663
+ }
664
+ }
665
+ }
666
+ }
667
+ },
668
+ "uiComponentSpecReference": {
669
+ "type": "object",
670
+ "additionalProperties": false,
671
+ "required": [
672
+ "path",
673
+ "section"
674
+ ],
675
+ "properties": {
676
+ "path": {
677
+ "$ref": "#/$defs/path"
678
+ },
679
+ "section": {
680
+ "type": "string"
681
+ },
682
+ "line": {
683
+ "anyOf": [
684
+ {
685
+ "type": "integer"
686
+ },
687
+ {
688
+ "type": "null"
689
+ }
690
+ ]
691
+ }
692
+ }
693
+ }
34
694
  }
35
695
  }