shapeup-sdlc 1.6.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.
- package/.claude/settings.local.example.json +20 -0
- package/.claude-plugin/marketplace.json +16 -0
- package/.claude-plugin/plugin.json +18 -0
- package/.env.shapeup.example +14 -0
- package/AGENTS.md +133 -0
- package/LICENSE +21 -0
- package/README.md +362 -0
- package/SECURITY.md +72 -0
- package/bin/init.mjs +329 -0
- package/commands/build.md +14 -0
- package/commands/eval.md +15 -0
- package/commands/hammer.md +12 -0
- package/commands/orient.md +11 -0
- package/commands/qa.md +12 -0
- package/commands/retro.md +13 -0
- package/commands/scopes.md +14 -0
- package/commands/shape.md +12 -0
- package/commands/ship.md +53 -0
- package/commands/wire.md +11 -0
- package/hooks/anti-rationalization.mjs +244 -0
- package/hooks/compact-snapshot.mjs +47 -0
- package/hooks/gate-deadline.mjs +151 -0
- package/hooks/gate-intake.mjs +110 -0
- package/hooks/gate-l2.mjs +161 -0
- package/hooks/gate-zerowork.mjs +264 -0
- package/hooks/hooks.json +118 -0
- package/hooks/lib/decision.mjs +183 -0
- package/hooks/safety-spine.mjs +296 -0
- package/hooks/sandbox-guard.mjs +172 -0
- package/hooks/session-rehydrate.mjs +109 -0
- package/hooks/slop-cleaner.mjs +176 -0
- package/oracles/_shared.mjs +46 -0
- package/oracles/http-oracle.mjs +155 -0
- package/oracles/index.mjs +36 -0
- package/oracles/process-oracle.mjs +146 -0
- package/oracles/snapshot-oracle.mjs +119 -0
- package/oracles/test-oracle.mjs +138 -0
- package/package.json +49 -0
- package/skills/advisor-protocol/SKILL.md +171 -0
- package/skills/ba-pitch-analyzer/SKILL.md +175 -0
- package/skills/ba-pitch-analyzer/assets/templates/_index.tmpl.md +84 -0
- package/skills/ba-pitch-analyzer/assets/templates/api-feasibility.tmpl.md +65 -0
- package/skills/ba-pitch-analyzer/assets/templates/assess-report.tmpl.md +127 -0
- package/skills/ba-pitch-analyzer/assets/templates/contracts/be-service.contract.tmpl.md +62 -0
- package/skills/ba-pitch-analyzer/assets/templates/contracts/offline-storage.contract.tmpl.md +92 -0
- package/skills/ba-pitch-analyzer/assets/templates/contracts/third-party-api.contract.tmpl.md +66 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/context-map.tmpl.md +64 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/event-choreography.tmpl.md +77 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/migration-plan.tmpl.md +104 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/team-handoff.tmpl.md +79 -0
- package/skills/ba-pitch-analyzer/assets/templates/domain-model.tmpl.md +79 -0
- package/skills/ba-pitch-analyzer/assets/templates/feedback.tmpl.md +87 -0
- package/skills/ba-pitch-analyzer/assets/templates/integration.tmpl.md +64 -0
- package/skills/ba-pitch-analyzer/assets/templates/run-state.tmpl.md +77 -0
- package/skills/ba-pitch-analyzer/assets/templates/scope-summary.tmpl.md +105 -0
- package/skills/ba-pitch-analyzer/assets/templates/synthesis.tmpl.md +215 -0
- package/skills/ba-pitch-analyzer/assets/templates/task-board.tmpl.md +35 -0
- package/skills/ba-pitch-analyzer/assets/templates/task-spike.tmpl.md +86 -0
- package/skills/ba-pitch-analyzer/assets/templates/task.tmpl.md +84 -0
- package/skills/ba-pitch-analyzer/assets/templates/usecase.tmpl.md +105 -0
- package/skills/ba-pitch-analyzer/assets/templates/ux-behavior.tmpl.md +65 -0
- package/skills/ba-pitch-analyzer/references/contract-patterns.md +152 -0
- package/skills/ba-pitch-analyzer/references/ddd-patterns.md +173 -0
- package/skills/ba-pitch-analyzer/references/doc-schemas.md +275 -0
- package/skills/ba-pitch-analyzer/references/integration-analysis.md +152 -0
- package/skills/ba-pitch-analyzer/references/task-generation.md +623 -0
- package/skills/ba-pitch-analyzer/references/test-surface.md +102 -0
- package/skills/ba-pitch-analyzer/references/ux-behavior-patterns.md +269 -0
- package/skills/ba-pitch-analyzer/scripts/board-derive.mjs +241 -0
- package/skills/ba-pitch-analyzer/scripts/spec-lint.mjs +239 -0
- package/skills/coach/SKILL.md +202 -0
- package/skills/orient/SKILL.md +262 -0
- package/skills/qa-edge-hunter/SKILL.md +369 -0
- package/skills/scope-architect/SKILL.md +111 -0
- package/skills/scope-hammer/SKILL.md +186 -0
- package/skills/shapeup/SKILL.md +403 -0
- package/skills/shapeup/resources/breadboard-reflection.md +88 -0
- package/skills/shapeup/resources/breadboarding.md +334 -0
- package/skills/shapeup/resources/context-compaction.md +240 -0
- package/skills/shapeup/resources/framing-doc.md +92 -0
- package/skills/shapeup/resources/kickoff-doc.md +95 -0
- package/skills/shapeup/resources/shaping.md +194 -0
- package/skills/shapeup/resources/spike.md +86 -0
- package/skills/solution-architect/SKILL.md +129 -0
- package/skills/spec-evaluator/README.md +93 -0
- package/skills/spec-evaluator/SKILL.md +213 -0
- package/skills/spec-evaluator/references/anti-leniency.md +50 -0
- package/skills/spec-evaluator/references/dimension-contract.md +126 -0
- package/skills/spec-evaluator/references/dimensions/_registry.md +40 -0
- package/skills/spec-evaluator/references/dimensions/completeness.md +102 -0
- package/skills/spec-evaluator/references/dimensions/integration.md +129 -0
- package/skills/spec-evaluator/references/dimensions/performance.md +48 -0
- package/skills/spec-evaluator/references/dimensions/security.md +60 -0
- package/skills/spec-evaluator/references/dimensions/spec-conformance.md +134 -0
- package/skills/spec-evaluator/references/dimensions/tdd-surface.md +110 -0
- package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +100 -0
- package/skills/spec-evaluator/references/probing.md +177 -0
- package/skills/spec-evaluator/references/report-schema.md +101 -0
- package/skills/spec-evaluator/references/verdict-ledger.md +92 -0
- package/skills/spec-evaluator/scripts/verdict-ledger.mjs +166 -0
- package/skills/task-executor/SKILL.md +194 -0
- package/skills/tech-lead/README.md +71 -0
- package/skills/tech-lead/SKILL.md +459 -0
- package/skills/tech-lead/references/delegation.md +254 -0
- package/skills/tech-lead/references/gates.md +379 -0
- package/skills/tech-lead/references/invocation.md +45 -0
- package/skills/tech-lead/references/ledger-schema.md +214 -0
- package/skills/tech-lead/references/round-protocol.md +184 -0
- package/skills/tech-lead/references/state-model.md +66 -0
- package/skills/tech-lead/references/tiny-lane.md +52 -0
- package/skills/tech-lead/schemas/domain.schema.json +2294 -0
- package/skills/tech-lead/schemas/gate-answers.schema.json +92 -0
- package/skills/tech-lead/schemas/work-order.schema.json +21 -0
- package/skills/tech-lead/schemas/work-result.schema.json +40 -0
- package/skills/tech-lead/scripts/aegis-digest.mjs +124 -0
- package/skills/tech-lead/scripts/budget-check.mjs +156 -0
- package/skills/tech-lead/scripts/compile-order.mjs +518 -0
- package/skills/tech-lead/scripts/fit-check.mjs +196 -0
- package/skills/tech-lead/scripts/gate-answers.mjs +338 -0
- package/skills/tech-lead/scripts/ingest-result.mjs +270 -0
- package/skills/tech-lead/scripts/init-run.mjs +326 -0
- package/skills/tech-lead/scripts/lib/argv.mjs +224 -0
- package/skills/tech-lead/scripts/lib/contract-md.mjs +481 -0
- package/skills/tech-lead/scripts/lib/is-main.mjs +82 -0
- package/skills/tech-lead/scripts/lib/paths.mjs +278 -0
- package/skills/tech-lead/scripts/lib/ratchet-tree.mjs +112 -0
- package/skills/tech-lead/scripts/run-snapshot.mjs +269 -0
- package/skills/tech-lead/scripts/ship-report.mjs +275 -0
- package/skills/tech-lead/scripts/stats.mjs +423 -0
- package/skills/tech-lead/scripts/t0-verify.mjs +470 -0
- package/skills/tech-lead/scripts/trace-lint.mjs +367 -0
- package/skills/tech-lead/scripts/validate-envelope.mjs +283 -0
- package/skills/translator/README.md +66 -0
- package/skills/translator/SKILL.md +258 -0
- package/skills/translator/references/preservation-rules.md +102 -0
|
@@ -0,0 +1,2294 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$id": "domain.schema.json",
|
|
3
|
+
"title": "HarnessDomain",
|
|
4
|
+
"description": "The CENTRAL domain registry of the pure-skill architecture. Every shared field that crosses a skill boundary is defined here exactly once, with its meaning, owner, and storage tier annotated — work-order.schema.json and work-result.schema.json $ref into $defs below instead of re-defining records inline, and no skill may introduce a cross-boundary field that is not registered here first. Annotation keys: x-tier = SHARED (committed under shapeup/, survives clone+crash) | LOCAL (gitignored under .shapeup/, regenerable run-trace) | EMBEDDED (a record type that only lives inside another entity); x-location = the canonical path; x-writer = the single component allowed to write it; x-readers = who consumes it. The x-erd block is the machine-readable entity-relationship map; x-payload-by-worker is the authoritative table of which WorkOrder payload fields each worker may rely on.",
|
|
5
|
+
"x-erd": {
|
|
6
|
+
"description": "Relationship map. Cardinality reads left-to-right (WorkOrder 1:1 WorkResult = every order has exactly one result). Join keys: <slug> (the feature) is the aggregate root every path is keyed off; scope_id is the STABLE cross-machine key (boards regenerate; hill shards, T0 history and branches join on it); TASK-NNN ids are machine-local and must never be joined across machines (generate-board joins on scope, not task id).",
|
|
7
|
+
"relationships": [
|
|
8
|
+
{
|
|
9
|
+
"from": "WorkOrder",
|
|
10
|
+
"to": "WorkResult",
|
|
11
|
+
"cardinality": "1:1",
|
|
12
|
+
"via": "order_id",
|
|
13
|
+
"note": "the envelope port — compile-order.mjs emits, worker answers, ingest-result.mjs applies"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"from": "WorkOrder",
|
|
17
|
+
"to": "ScopeContract",
|
|
18
|
+
"cardinality": "N:0..1",
|
|
19
|
+
"via": "payload.scope_contract",
|
|
20
|
+
"note": "build attempts carry the active scope verbatim"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"from": "WorkOrder",
|
|
24
|
+
"to": "TaskRef",
|
|
25
|
+
"cardinality": "1:N",
|
|
26
|
+
"via": "payload.tasks[]",
|
|
27
|
+
"note": "parsed from the LOCAL board by compile-order, never by the worker"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"from": "TaskRef",
|
|
31
|
+
"to": "UseCase (SHARED spec doc)",
|
|
32
|
+
"cardinality": "N:1..N",
|
|
33
|
+
"via": "use_case_refs[]",
|
|
34
|
+
"note": "the LOCAL→SHARED traceability anchor (single-anchor rule on reconcile) — spec-evaluator's traceability source. Tier direction: persisted links flow LOCAL→SHARED only; a committed spec doc never references a machine-local task id back (spec-lint TIER-DIRECTION/UC-ANCHOR)"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"from": "AcResult (LOCAL board AC)",
|
|
38
|
+
"to": "RequirementClause (SHARED registry)",
|
|
39
|
+
"cardinality": "N:0..N",
|
|
40
|
+
"via": "acceptance_criteria[].covers[]",
|
|
41
|
+
"note": "the covers-closure anchor — same sanctioned LOCAL→SHARED direction as use_case_refs. trace-lint asserts every status:covered REQ-id is named by ≥1 AC's covers[]; a REQ neither covered nor CUT is red. REQ-ids are stable cross-machine keys (supersede-never-delete), never renumbered like TASK-NNN"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"from": "CriterionVerdict / Discovery",
|
|
45
|
+
"to": "RequirementClause (SHARED registry)",
|
|
46
|
+
"cardinality": "N:0..N",
|
|
47
|
+
"via": "traces_to[]",
|
|
48
|
+
"note": "optional finding→REQ back-link (LOCAL→SHARED) so an edge case maps to a business requirement by id, not by grepping the ledger; the lint only checks the id resolves in the registry — purely a navigation anchor"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"from": "WiringMap",
|
|
52
|
+
"to": "UseCase (SHARED spec doc)",
|
|
53
|
+
"cardinality": "1:N",
|
|
54
|
+
"via": "entries[].use_case",
|
|
55
|
+
"note": "reachability map: per UC engine → wiring seam → entry-point call site → player-visible affordance. trace-lint asserts each UC's engine reaches ProjectProfile.entry_point via the import graph; an unreachable engine (0 import sites) is red"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"from": "WiringMap",
|
|
59
|
+
"to": "ProjectProfile",
|
|
60
|
+
"cardinality": "N:1",
|
|
61
|
+
"via": "entry_point resolution",
|
|
62
|
+
"note": "reachability resolves entry_point from the profile (archetype-specific: main.js for a game is not the seam for a web-service) — never hardcoded"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"from": "WorkOrder",
|
|
66
|
+
"to": "Decision",
|
|
67
|
+
"cardinality": "1:N",
|
|
68
|
+
"via": "payload.decisions[]",
|
|
69
|
+
"note": "this scope's adjudicated answers, read back from round-ledger.md — the only entity that flows BACKWARD into orders"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"from": "WorkOrder",
|
|
73
|
+
"to": "AegisTriple",
|
|
74
|
+
"cardinality": "1:N",
|
|
75
|
+
"via": "payload.digested_errors[]",
|
|
76
|
+
"note": "previous attempt's T0 failures, digested"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"from": "WorkResult",
|
|
80
|
+
"to": "TaskResult",
|
|
81
|
+
"cardinality": "1:N",
|
|
82
|
+
"via": "task_results[]"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"from": "TaskResult",
|
|
86
|
+
"to": "AcResult",
|
|
87
|
+
"cardinality": "1:N",
|
|
88
|
+
"via": "ac_results[]"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"from": "TaskResult",
|
|
92
|
+
"to": "Task (LOCAL board file)",
|
|
93
|
+
"cardinality": "N:1",
|
|
94
|
+
"via": "task_id",
|
|
95
|
+
"note": "ingest ticks AC boxes, flips frontmatter status, appends the Execution Log"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"from": "WorkResult",
|
|
99
|
+
"to": "Discovery",
|
|
100
|
+
"cardinality": "1:N",
|
|
101
|
+
"via": "discoveries[]",
|
|
102
|
+
"note": "ingest appends to discovery/ledger.md — three producers (executor +, QA ~, planner overflow), zero direct writers"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"from": "WorkResult",
|
|
106
|
+
"to": "Escalate",
|
|
107
|
+
"cardinality": "1:N",
|
|
108
|
+
"via": "escalates[]",
|
|
109
|
+
"note": "ingest queues to escalates/<order>.json; advisor-protocol adjudicates into a Decision"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"from": "Escalate",
|
|
113
|
+
"to": "Decision",
|
|
114
|
+
"cardinality": "1:0..1",
|
|
115
|
+
"via": "advisor-protocol adjudication",
|
|
116
|
+
"note": "persisted to the committed round-ledger the instant it is answered (zero-memory handoff)"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"from": "WorkResult",
|
|
120
|
+
"to": "Verdict",
|
|
121
|
+
"cardinality": "1:0..1",
|
|
122
|
+
"via": "verdict",
|
|
123
|
+
"note": "spec-evaluator only — the single judge"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"from": "Verdict",
|
|
127
|
+
"to": "CriterionVerdict",
|
|
128
|
+
"cardinality": "1:N",
|
|
129
|
+
"via": "criteria[]",
|
|
130
|
+
"note": "ingest appends to evaluation/.verdicts-<target>.jsonl (append-only; flips force confidence low)"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"from": "Verdict",
|
|
134
|
+
"to": "RefutedAc",
|
|
135
|
+
"cardinality": "1:N",
|
|
136
|
+
"via": "refuted[]",
|
|
137
|
+
"note": "ingest un-ticks the AC box and stamps eval_verdict: fail"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"from": "Verdict",
|
|
141
|
+
"to": "T0Citation",
|
|
142
|
+
"cardinality": "1:N",
|
|
143
|
+
"via": "t0_citations[]",
|
|
144
|
+
"note": "sha256 recomputed from disk — a scoped verdict without one is structurally invalid"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"from": "T0Citation",
|
|
148
|
+
"to": "T0Artifact",
|
|
149
|
+
"cardinality": "N:1",
|
|
150
|
+
"via": "path + sha256",
|
|
151
|
+
"note": "content-addressed evidence the generator cannot fabricate"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"from": "ScopeContract",
|
|
155
|
+
"to": "TaskRef",
|
|
156
|
+
"cardinality": "1:N",
|
|
157
|
+
"via": "tasks[] (scope_id is the stable key)"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"from": "ScopeContract",
|
|
161
|
+
"to": "AffordanceEntry",
|
|
162
|
+
"cardinality": "1:N",
|
|
163
|
+
"via": "affordance_manifest",
|
|
164
|
+
"note": "the evaluator asserts UI affordance-only against this"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"from": "ScopeContract",
|
|
168
|
+
"to": "T0Artifact",
|
|
169
|
+
"cardinality": "1:N",
|
|
170
|
+
"via": "scope_id, one per attempt"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"from": "ScopeContract",
|
|
174
|
+
"to": "HillShard",
|
|
175
|
+
"cardinality": "1:0..1",
|
|
176
|
+
"via": "scope_id",
|
|
177
|
+
"note": "phase derived from T0/T1/seesaw facts, never authored"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"from": "ScopeContract",
|
|
181
|
+
"to": "ScopeContract",
|
|
182
|
+
"cardinality": "1:N",
|
|
183
|
+
"via": "superseded_by[]",
|
|
184
|
+
"note": "set by split-scope — supersede-never-delete keeps branch and T0 history attributable"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"from": "T0Artifact",
|
|
188
|
+
"to": "CommandResult",
|
|
189
|
+
"cardinality": "1:N",
|
|
190
|
+
"via": "fixtures[] + db_probe",
|
|
191
|
+
"note": "produced by actually running the commands — no agent can fabricate them"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"from": "T0Artifact",
|
|
195
|
+
"to": "SeesawCheck",
|
|
196
|
+
"cardinality": "1:1",
|
|
197
|
+
"via": "seesaw",
|
|
198
|
+
"note": "the regression half of T0 — every FINISHED scope's fixtures re-run"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"from": "T0Artifact",
|
|
202
|
+
"to": "AegisTriple",
|
|
203
|
+
"cardinality": "1:N",
|
|
204
|
+
"via": "discovered_tasks[]",
|
|
205
|
+
"note": "red attempts feed the next order's digested_errors"
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"from": "T0Artifact",
|
|
209
|
+
"to": "TrialRow",
|
|
210
|
+
"cardinality": "1:1",
|
|
211
|
+
"via": "trial",
|
|
212
|
+
"note": "every T0 run appends exactly one ledger row; artifact + sha256 address the evidence"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"from": "TrialRow",
|
|
216
|
+
"to": "TrialRow",
|
|
217
|
+
"cardinality": "N:0..1",
|
|
218
|
+
"via": "baseline_trial",
|
|
219
|
+
"note": "the parent link — lineage and SUPERSEDES without a graph store"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"from": "WorkOrder",
|
|
223
|
+
"to": "TrialRow",
|
|
224
|
+
"cardinality": "1:N",
|
|
225
|
+
"via": "payload.trial_history[]",
|
|
226
|
+
"note": "inspect(): the loop reads its own recent history, across the round boundary"
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"from": "SeesawRegistry",
|
|
230
|
+
"to": "ScopeContract",
|
|
231
|
+
"cardinality": "1:N",
|
|
232
|
+
"via": "scopes[].scope_id",
|
|
233
|
+
"note": "every FINISHED scope's fixtures re-run on each later attempt"
|
|
234
|
+
}
|
|
235
|
+
]
|
|
236
|
+
},
|
|
237
|
+
"x-payload-by-worker": {
|
|
238
|
+
"description": "Which WorkOrderPayload fields each worker may rely on, per its SKILL.md input contract. Every name listed here MUST exist in $defs/WorkOrderPayload/properties (structural test enforced). A worker treats any field absent from its order as unknown — never inferred.",
|
|
239
|
+
"task-executor": [
|
|
240
|
+
"tasks",
|
|
241
|
+
"scope_contract",
|
|
242
|
+
"decisions",
|
|
243
|
+
"digested_errors",
|
|
244
|
+
"trial_history",
|
|
245
|
+
"verify",
|
|
246
|
+
"kb_rules_path",
|
|
247
|
+
"constraints",
|
|
248
|
+
"bugs"
|
|
249
|
+
],
|
|
250
|
+
"ba-pitch-analyzer": [
|
|
251
|
+
"pitch",
|
|
252
|
+
"lens",
|
|
253
|
+
"orient_dir",
|
|
254
|
+
"spec_folder",
|
|
255
|
+
"feature",
|
|
256
|
+
"discovered_ledger",
|
|
257
|
+
"kb_rules_path",
|
|
258
|
+
"requirements"
|
|
259
|
+
],
|
|
260
|
+
"scope-architect": [
|
|
261
|
+
"feature",
|
|
262
|
+
"spec_folder",
|
|
263
|
+
"tasks",
|
|
264
|
+
"discovered_ledger",
|
|
265
|
+
"scope_id"
|
|
266
|
+
],
|
|
267
|
+
"solution-architect": [
|
|
268
|
+
"feature",
|
|
269
|
+
"spec_folder",
|
|
270
|
+
"project_profile"
|
|
271
|
+
],
|
|
272
|
+
"spec-evaluator": [
|
|
273
|
+
"spec_folder",
|
|
274
|
+
"feature",
|
|
275
|
+
"dimensions",
|
|
276
|
+
"run_cmd",
|
|
277
|
+
"t0_artifacts",
|
|
278
|
+
"browser",
|
|
279
|
+
"tasks"
|
|
280
|
+
],
|
|
281
|
+
"orient": [
|
|
282
|
+
"pitch",
|
|
283
|
+
"stack",
|
|
284
|
+
"spec_folder",
|
|
285
|
+
"feature"
|
|
286
|
+
],
|
|
287
|
+
"qa-edge-hunter": [
|
|
288
|
+
"feature",
|
|
289
|
+
"spec_folder",
|
|
290
|
+
"eval_report",
|
|
291
|
+
"app_url",
|
|
292
|
+
"ledger",
|
|
293
|
+
"kb_rules_path"
|
|
294
|
+
],
|
|
295
|
+
"translator": [
|
|
296
|
+
"intake",
|
|
297
|
+
"glossary"
|
|
298
|
+
],
|
|
299
|
+
"scope-hammer": [
|
|
300
|
+
"feature",
|
|
301
|
+
"baseline",
|
|
302
|
+
"breaker",
|
|
303
|
+
"scope_id"
|
|
304
|
+
],
|
|
305
|
+
"coach": [
|
|
306
|
+
"feedback"
|
|
307
|
+
],
|
|
308
|
+
"advisor-protocol": [
|
|
309
|
+
"ledger",
|
|
310
|
+
"escalate",
|
|
311
|
+
"scope_id",
|
|
312
|
+
"round"
|
|
313
|
+
]
|
|
314
|
+
},
|
|
315
|
+
"x-result-by-worker": {
|
|
316
|
+
"description": "Which WorkResult fields each worker is allowed to output. A worker must only return fields explicitly mapped here (e.g., spec-evaluator is the sole judge and only it may return a verdict; task-executor is the only one to return task_results).",
|
|
317
|
+
"task-executor": [
|
|
318
|
+
"task_results",
|
|
319
|
+
"files_touched",
|
|
320
|
+
"escalates",
|
|
321
|
+
"discoveries",
|
|
322
|
+
"artifacts",
|
|
323
|
+
"assumptions",
|
|
324
|
+
"deviations"
|
|
325
|
+
],
|
|
326
|
+
"spec-evaluator": [
|
|
327
|
+
"verdict",
|
|
328
|
+
"files_touched",
|
|
329
|
+
"artifacts",
|
|
330
|
+
"assumptions",
|
|
331
|
+
"deviations"
|
|
332
|
+
],
|
|
333
|
+
"ba-pitch-analyzer": [
|
|
334
|
+
"discoveries",
|
|
335
|
+
"escalates",
|
|
336
|
+
"files_touched",
|
|
337
|
+
"artifacts",
|
|
338
|
+
"assumptions",
|
|
339
|
+
"deviations"
|
|
340
|
+
],
|
|
341
|
+
"scope-architect": [
|
|
342
|
+
"escalates",
|
|
343
|
+
"files_touched",
|
|
344
|
+
"artifacts",
|
|
345
|
+
"assumptions",
|
|
346
|
+
"deviations"
|
|
347
|
+
],
|
|
348
|
+
"solution-architect": [
|
|
349
|
+
"escalates",
|
|
350
|
+
"files_touched",
|
|
351
|
+
"artifacts",
|
|
352
|
+
"assumptions",
|
|
353
|
+
"deviations"
|
|
354
|
+
],
|
|
355
|
+
"orient": [
|
|
356
|
+
"files_touched",
|
|
357
|
+
"artifacts",
|
|
358
|
+
"assumptions",
|
|
359
|
+
"deviations"
|
|
360
|
+
],
|
|
361
|
+
"qa-edge-hunter": [
|
|
362
|
+
"discoveries",
|
|
363
|
+
"files_touched",
|
|
364
|
+
"artifacts",
|
|
365
|
+
"assumptions",
|
|
366
|
+
"deviations"
|
|
367
|
+
],
|
|
368
|
+
"translator": [
|
|
369
|
+
"files_touched",
|
|
370
|
+
"artifacts",
|
|
371
|
+
"assumptions",
|
|
372
|
+
"deviations"
|
|
373
|
+
],
|
|
374
|
+
"scope-hammer": [
|
|
375
|
+
"files_touched",
|
|
376
|
+
"artifacts",
|
|
377
|
+
"assumptions",
|
|
378
|
+
"deviations"
|
|
379
|
+
],
|
|
380
|
+
"coach": [
|
|
381
|
+
"files_touched",
|
|
382
|
+
"artifacts",
|
|
383
|
+
"assumptions",
|
|
384
|
+
"deviations"
|
|
385
|
+
],
|
|
386
|
+
"advisor-protocol": [
|
|
387
|
+
"files_touched",
|
|
388
|
+
"artifacts",
|
|
389
|
+
"assumptions",
|
|
390
|
+
"deviations"
|
|
391
|
+
]
|
|
392
|
+
},
|
|
393
|
+
"$defs": {
|
|
394
|
+
"WorkerName": {
|
|
395
|
+
"description": "The complete worker roster — the only skills a WorkOrder may be addressed to. tech-lead and shapeup are deliberately absent (orchestrator and PO-personal shaping are not workers).",
|
|
396
|
+
"type": "string",
|
|
397
|
+
"enum": [
|
|
398
|
+
"task-executor",
|
|
399
|
+
"spec-evaluator",
|
|
400
|
+
"ba-pitch-analyzer",
|
|
401
|
+
"scope-architect",
|
|
402
|
+
"solution-architect",
|
|
403
|
+
"orient",
|
|
404
|
+
"qa-edge-hunter",
|
|
405
|
+
"translator",
|
|
406
|
+
"scope-hammer",
|
|
407
|
+
"coach",
|
|
408
|
+
"advisor-protocol"
|
|
409
|
+
]
|
|
410
|
+
},
|
|
411
|
+
"Operation": {
|
|
412
|
+
"description": "The full operation vocabulary. Replaces lifecycle flags (--tasks-only, --from-discovered, --remap …): the caller knows the pipeline position; the worker never re-derives it. Ownership: execute/fix/spike = task-executor · analyze/generate-board/reconcile/retrofit-surface/coverage = ba-pitch-analyzer · map-scopes/remap/split-scope = scope-architect · wire = solution-architect · evaluate = spec-evaluator · orient = orient · hunt/recheck = qa-edge-hunter · translate = translator · hammer = scope-hammer · coach = coach · adjudicate = advisor-protocol.",
|
|
413
|
+
"type": "string",
|
|
414
|
+
"enum": [
|
|
415
|
+
"execute",
|
|
416
|
+
"fix",
|
|
417
|
+
"spike",
|
|
418
|
+
"analyze",
|
|
419
|
+
"generate-board",
|
|
420
|
+
"reconcile",
|
|
421
|
+
"retrofit-surface",
|
|
422
|
+
"coverage",
|
|
423
|
+
"map-scopes",
|
|
424
|
+
"remap",
|
|
425
|
+
"split-scope",
|
|
426
|
+
"wire",
|
|
427
|
+
"evaluate",
|
|
428
|
+
"orient",
|
|
429
|
+
"hunt",
|
|
430
|
+
"recheck",
|
|
431
|
+
"translate",
|
|
432
|
+
"hammer",
|
|
433
|
+
"coach",
|
|
434
|
+
"adjudicate"
|
|
435
|
+
]
|
|
436
|
+
},
|
|
437
|
+
"Substrate": {
|
|
438
|
+
"description": "The write contract of one order — mode/flag differences ARE write-contract differences (one whitelist template per operation, compile-order substrateFor()). Enforced mechanically by the sandbox hook; a worker needing a file outside it must ESCALATE (substrate-expansion), never write.",
|
|
439
|
+
"x-tier": "EMBEDDED",
|
|
440
|
+
"x-writer": "compile-order.mjs (templates) / scope-architect (per-scope globs)",
|
|
441
|
+
"type": "object",
|
|
442
|
+
"properties": {
|
|
443
|
+
"allowed": {
|
|
444
|
+
"type": "array",
|
|
445
|
+
"items": {
|
|
446
|
+
"type": "string"
|
|
447
|
+
},
|
|
448
|
+
"description": "Globs the worker MAY write. For build attempts: the scope's allowed_file_substrate + the spike dir."
|
|
449
|
+
},
|
|
450
|
+
"shared": {
|
|
451
|
+
"type": "array",
|
|
452
|
+
"items": {
|
|
453
|
+
"type": "string"
|
|
454
|
+
},
|
|
455
|
+
"description": "Globs ≥2 scopes both touch — every write here forces a full seesaw run at the next gate."
|
|
456
|
+
},
|
|
457
|
+
"append_only": {
|
|
458
|
+
"type": "array",
|
|
459
|
+
"items": {
|
|
460
|
+
"type": "string"
|
|
461
|
+
},
|
|
462
|
+
"description": "Sections that may only grow (e.g. usecases/*.md#Invariants, #Test Surface during reconcile)."
|
|
463
|
+
},
|
|
464
|
+
"frozen": {
|
|
465
|
+
"type": "array",
|
|
466
|
+
"items": {
|
|
467
|
+
"type": "string"
|
|
468
|
+
},
|
|
469
|
+
"description": "Explicitly untouchable paths (spec core: domain-model, UC Steps, contracts, ux-behavior)."
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
},
|
|
473
|
+
"Interaction": {
|
|
474
|
+
"description": "Caller policy. Pausing is the CALLER's decision — a pure worker only surfaces questions/assumptions; it never decides whether the pipeline stops.",
|
|
475
|
+
"x-tier": "EMBEDDED",
|
|
476
|
+
"type": "object",
|
|
477
|
+
"properties": {
|
|
478
|
+
"pause_gates": {
|
|
479
|
+
"type": "boolean",
|
|
480
|
+
"description": "true (standalone default): pause at the worker's phase checkpoints. false: run straight through, surfacing questions as assumptions[]/escalates[]."
|
|
481
|
+
},
|
|
482
|
+
"max_questions": {
|
|
483
|
+
"type": "integer",
|
|
484
|
+
"description": "Question budget per checkpoint (worker convention: 2)."
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
"TaskRef": {
|
|
489
|
+
"description": "One task as carried inside a WorkOrder — parsed from the LOCAL board file (.shapeup/<slug>/tasks/TASK-*.md frontmatter + AC checkboxes) by compile-order parseTaskFile(). NOTE: task ids are machine-local (boards regenerate and renumber); never join on id across machines — the scope is the stable key.",
|
|
490
|
+
"x-tier": "EMBEDDED",
|
|
491
|
+
"x-writer": "compile-order.mjs (from the board ba-pitch-analyzer generated)",
|
|
492
|
+
"type": "object",
|
|
493
|
+
"required": [
|
|
494
|
+
"id"
|
|
495
|
+
],
|
|
496
|
+
"properties": {
|
|
497
|
+
"id": {
|
|
498
|
+
"type": "string",
|
|
499
|
+
"description": "TASK-NNN (machine-local)."
|
|
500
|
+
},
|
|
501
|
+
"title": {
|
|
502
|
+
"type": "string"
|
|
503
|
+
},
|
|
504
|
+
"body_path": {
|
|
505
|
+
"type": "string",
|
|
506
|
+
"description": "Path to the full task file — the worker must read it fully, never rely on this summary alone."
|
|
507
|
+
},
|
|
508
|
+
"acceptance_criteria": {
|
|
509
|
+
"type": "array",
|
|
510
|
+
"description": "The AC checkbox texts, verbatim — ingest ticks boxes by matching this text back. ADDITIVE union (spine v1.3): a plain `string` (legacy boards, unchanged) OR `{text, covers?}` when the board line carries a `(covers: REQ-…)` clause. `.text` stays BYTE-IDENTICAL to the checkbox so ingest-result's substring tick-back (AcResult.ac) is untouched; `covers[]` is the LOCAL→SHARED anchor trace-lint reads for covers-closure. A pre-covers board keeps parsing as string[] (the ✦ non-regression invariant).",
|
|
511
|
+
"items": {
|
|
512
|
+
"anyOf": [
|
|
513
|
+
{
|
|
514
|
+
"type": "string"
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
"type": "object",
|
|
518
|
+
"required": [
|
|
519
|
+
"text"
|
|
520
|
+
],
|
|
521
|
+
"properties": {
|
|
522
|
+
"text": {
|
|
523
|
+
"type": "string",
|
|
524
|
+
"description": "The checkbox text, verbatim (byte-identical to the board line — includes any trailing (covers: …) clause)."
|
|
525
|
+
},
|
|
526
|
+
"covers": {
|
|
527
|
+
"type": "array",
|
|
528
|
+
"items": {
|
|
529
|
+
"type": "string",
|
|
530
|
+
"pattern": "^REQ-[0-9]+$"
|
|
531
|
+
},
|
|
532
|
+
"description": "REQ-ids this AC covers — resolved against the SHARED requirements registry by trace-lint."
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
]
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
"status": {
|
|
540
|
+
"type": "string",
|
|
541
|
+
"description": "ready | in-progress | blocked | done | cut (board frontmatter; informational inside an order)."
|
|
542
|
+
},
|
|
543
|
+
"priority": {
|
|
544
|
+
"type": "integer",
|
|
545
|
+
"description": "Board ordering (lower = earlier)."
|
|
546
|
+
},
|
|
547
|
+
"depends_on": {
|
|
548
|
+
"type": "array",
|
|
549
|
+
"items": {
|
|
550
|
+
"type": "string"
|
|
551
|
+
},
|
|
552
|
+
"description": "Explicit dependencies. The inverse (unlocks) is ALWAYS derived by board-derive.mjs, never hand-authored (KB-BA-001)."
|
|
553
|
+
},
|
|
554
|
+
"use_case_refs": {
|
|
555
|
+
"type": "array",
|
|
556
|
+
"items": {
|
|
557
|
+
"type": "string"
|
|
558
|
+
},
|
|
559
|
+
"description": "UC ids this task implements (e.g. UC-CreateOrder) — the task's LOCAL→SHARED anchor into the committed spec and spec-evaluator's traceability source. Links flow one direction: the LOCAL task cites the SHARED UC; a committed doc never links a task id back (ids are machine-local)."
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
},
|
|
563
|
+
"Decision": {
|
|
564
|
+
"description": "One adjudicated ESCALATE answer as carried inside a WorkOrder — binding precedent the worker must apply. Compiled from the committed round-ledger.md Decisions table (columns: Round | Scope | Kind | Question | Answer | Resolved by) filtered to this scope. The full row lives in the ledger; the envelope carries the minimal {id, answer} projection.",
|
|
565
|
+
"x-tier": "EMBEDDED (projection of the SHARED round-ledger.md Decisions row)",
|
|
566
|
+
"x-location": ".shapeup/<slug>/round-ledger.md",
|
|
567
|
+
"x-writer": "advisor-protocol (via tech-lead) — promoted the instant an answer is given",
|
|
568
|
+
"type": "object",
|
|
569
|
+
"required": [
|
|
570
|
+
"id",
|
|
571
|
+
"answer"
|
|
572
|
+
],
|
|
573
|
+
"properties": {
|
|
574
|
+
"id": {
|
|
575
|
+
"type": "string",
|
|
576
|
+
"description": "ESC-NN — stable across the run."
|
|
577
|
+
},
|
|
578
|
+
"answer": {
|
|
579
|
+
"type": "string",
|
|
580
|
+
"description": "The adjudicated answer, applied verbatim."
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
},
|
|
584
|
+
"AegisTriple": {
|
|
585
|
+
"description": "One digested failure — aegis-digest.mjs distills raw build/test/Playwright logs into these so the next attempt gets a few lines of signal instead of a stack-trace dump. Appears as T0Artifact.discovered_tasks[] (red attempts) and as WorkOrder payload.digested_errors[] (the next attempt's starting bug list).",
|
|
586
|
+
"x-tier": "EMBEDDED",
|
|
587
|
+
"x-writer": "aegis-digest.mjs (regex pass; Sonnet fallback only on unrecognized formats)",
|
|
588
|
+
"type": "object",
|
|
589
|
+
"properties": {
|
|
590
|
+
"file": {
|
|
591
|
+
"type": "string",
|
|
592
|
+
"description": "Source file of the failure; null/absent when the log line carried no location (raw triple — never invented)."
|
|
593
|
+
},
|
|
594
|
+
"line": {
|
|
595
|
+
"type": "integer"
|
|
596
|
+
},
|
|
597
|
+
"core_message": {
|
|
598
|
+
"type": "string",
|
|
599
|
+
"description": "The failure message, normalized, ≤200 chars."
|
|
600
|
+
},
|
|
601
|
+
"kind": {
|
|
602
|
+
"type": "string",
|
|
603
|
+
"description": "Log-format tag (stack | tap | tsc | error | raw)."
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
"VerifySpec": {
|
|
608
|
+
"description": "How the doer proves its work: the verification command the caller pins (task-executor never chooses its own test command in orchestrated mode).",
|
|
609
|
+
"x-tier": "EMBEDDED",
|
|
610
|
+
"type": "object",
|
|
611
|
+
"properties": {
|
|
612
|
+
"test_cmd": {
|
|
613
|
+
"type": "string"
|
|
614
|
+
},
|
|
615
|
+
"env": {
|
|
616
|
+
"type": "array",
|
|
617
|
+
"items": {
|
|
618
|
+
"type": "string"
|
|
619
|
+
},
|
|
620
|
+
"description": "Env var names the command needs."
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
},
|
|
624
|
+
"Constraints": {
|
|
625
|
+
"description": "Non-Go items and freezes for a build order. The moment an implementation starts touching a non_go item the worker stops that path and reports — scope expansion is the caller's decision.",
|
|
626
|
+
"x-tier": "EMBEDDED",
|
|
627
|
+
"type": "object",
|
|
628
|
+
"properties": {
|
|
629
|
+
"non_go": {
|
|
630
|
+
"type": "array",
|
|
631
|
+
"items": {
|
|
632
|
+
"type": "string"
|
|
633
|
+
},
|
|
634
|
+
"description": "Excluded paths/features from the pitch boundaries."
|
|
635
|
+
},
|
|
636
|
+
"ui_layers": {
|
|
637
|
+
"type": "object",
|
|
638
|
+
"description": "e.g. {layer3_frozen: true} — no pixel/CSS polish beyond semantic HTML defaults."
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
},
|
|
642
|
+
"AffordanceEntry": {
|
|
643
|
+
"description": "One interactive element of a scope's UI, derived from ux-behavior.md state tables. Layer-1 contract: every element the doer builds binds to a manifest test_id/role and expresses its state via data-state; the judge asserts UI affordance-only against this (never pixels — Layer 3 is frozen). An element the manifest lacks is a spec gap → ESCALATE, never a silent extension.",
|
|
644
|
+
"x-tier": "EMBEDDED (inside ScopeContract.affordance_manifest)",
|
|
645
|
+
"type": "object",
|
|
646
|
+
"properties": {
|
|
647
|
+
"test_id": {
|
|
648
|
+
"type": "string",
|
|
649
|
+
"description": "The data-testid the element binds to."
|
|
650
|
+
},
|
|
651
|
+
"role": {
|
|
652
|
+
"type": "string",
|
|
653
|
+
"description": "Semantic/ARIA role."
|
|
654
|
+
},
|
|
655
|
+
"required_states": {
|
|
656
|
+
"type": "array",
|
|
657
|
+
"items": {
|
|
658
|
+
"type": "string"
|
|
659
|
+
},
|
|
660
|
+
"description": "Subset of [idle, loading, success, error, empty] the element must express via data-state."
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
},
|
|
664
|
+
"ScopeContract": {
|
|
665
|
+
"description": "A vertical scope as a committed, mechanically enforceable contract — Shape Up's 'map the scopes' as data. Sliced by business flow (one call chain: UI screen + API route + use case + repository), NEVER by directory (PA1). The sandbox hook enforces the substrate, t0-verify runs the fixtures, the evaluator asserts against the manifest. Superseded contracts are kept, never deleted (branch and T0 history stay attributable). ON-DISK FORMAT IS MARKDOWN (ADR-0001): frontmatter carries the scalars and [a, b] lists, a markdown table carries the one array-of-objects field, and prose carries the rationale a reviewer reads. THIS SCHEMA DESCRIBES THE PARSED OBJECT — the wire form embedded in the WorkOrder envelope — not the file. `skills/tech-lead/scripts/lib/contract-md.mjs` is the only reader/writer of the file form; everything downstream of that parse sees exactly this shape.",
|
|
666
|
+
"x-tier": "SHARED",
|
|
667
|
+
"x-location": "shapeup/<slug>/scopes/<scope-id>.md",
|
|
668
|
+
"x-writer": "scope-architect (SOLE writer — a hand-edit anywhere else is a defect)",
|
|
669
|
+
"x-readers": "compile-order.mjs, sandbox-guard hook, t0-verify.mjs, spec-lint.mjs, spec-evaluator, scope-hammer, tech-lead",
|
|
670
|
+
"type": "object",
|
|
671
|
+
"required": [
|
|
672
|
+
"scope_id"
|
|
673
|
+
],
|
|
674
|
+
"properties": {
|
|
675
|
+
"scope_id": {
|
|
676
|
+
"type": "string",
|
|
677
|
+
"description": "The STABLE cross-machine join key: hill shards, T0 verdicts, branches, and decisions all key on it (task ids renumber per machine; this never does)."
|
|
678
|
+
},
|
|
679
|
+
"topology_type": {
|
|
680
|
+
"type": "string",
|
|
681
|
+
"enum": [
|
|
682
|
+
"LAYER_CAKE",
|
|
683
|
+
"ICEBERG",
|
|
684
|
+
"CHOWDER"
|
|
685
|
+
],
|
|
686
|
+
"description": "LAYER_CAKE = thin balanced UI+backend · ICEBERG = complexity on one side · CHOWDER = true strays with no shared flow (the one deliberate exception to cross-layer slicing)."
|
|
687
|
+
},
|
|
688
|
+
"tasks": {
|
|
689
|
+
"type": "array",
|
|
690
|
+
"items": {
|
|
691
|
+
"type": "string"
|
|
692
|
+
},
|
|
693
|
+
"description": "Task ids this scope names (machine-local ids; the scope↔task grouping is re-derived on regeneration)."
|
|
694
|
+
},
|
|
695
|
+
"allowed_file_substrate": {
|
|
696
|
+
"type": "array",
|
|
697
|
+
"items": {
|
|
698
|
+
"type": "string"
|
|
699
|
+
},
|
|
700
|
+
"description": "Exact write-whitelist globs — the sandbox hook's deny list boundary. Wrong here = a legitimate ESCALATE later."
|
|
701
|
+
},
|
|
702
|
+
"shared_substrate": {
|
|
703
|
+
"type": "array",
|
|
704
|
+
"items": {
|
|
705
|
+
"type": "string"
|
|
706
|
+
},
|
|
707
|
+
"description": "Files ≥2 scopes both touch — must be declared in BOTH scopes' lists (spec-lint DISJOINT) and every write forces a full seesaw run."
|
|
708
|
+
},
|
|
709
|
+
"affordance_manifest": {
|
|
710
|
+
"type": "array",
|
|
711
|
+
"items": {
|
|
712
|
+
"$ref": "#/$defs/AffordanceEntry"
|
|
713
|
+
},
|
|
714
|
+
"description": "Every interactive element of this scope's screens — appears in exactly ONE scope's manifest."
|
|
715
|
+
},
|
|
716
|
+
"e2e_verification_fixtures": {
|
|
717
|
+
"type": "array",
|
|
718
|
+
"items": {
|
|
719
|
+
"type": "string"
|
|
720
|
+
},
|
|
721
|
+
"description": "Command(s) that drive this scope end-to-end (the T0 layer). Too speculative to fixture → an explicit TBD flag, never an invented fixture."
|
|
722
|
+
},
|
|
723
|
+
"db_probe": {
|
|
724
|
+
"type": "string",
|
|
725
|
+
"description": "Optional command asserting real persisted state (catches the hardcoded-array Layer-2 violation). Absent = not applicable, never a failure."
|
|
726
|
+
},
|
|
727
|
+
"hill_phase": {
|
|
728
|
+
"type": "string",
|
|
729
|
+
"enum": [
|
|
730
|
+
"UPHILL_UNKNOWN",
|
|
731
|
+
"UPHILL_SOLVED",
|
|
732
|
+
"DOWNHILL_EXECUTION",
|
|
733
|
+
"FINISHED"
|
|
734
|
+
],
|
|
735
|
+
"description": "ALWAYS authored as UPHILL_UNKNOWN (DD-10). The live phase is DERIVED from T0/T1/seesaw facts into hill/<scope-id>.yml — facts move dots, not authors."
|
|
736
|
+
},
|
|
737
|
+
"superseded_by": {
|
|
738
|
+
"type": "array",
|
|
739
|
+
"items": {
|
|
740
|
+
"type": "string"
|
|
741
|
+
},
|
|
742
|
+
"description": "Set by split-scope: the replacing scope ids. Supersede-never-delete."
|
|
743
|
+
},
|
|
744
|
+
"business_goal": {
|
|
745
|
+
"type": "string",
|
|
746
|
+
"description": "What a user can do when this scope ships — the must-have trace scope-hammer's census checks against."
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
},
|
|
750
|
+
"AcResult": {
|
|
751
|
+
"description": "One acceptance criterion's outcome with evidence. 'ac' carries the checkbox text VERBATIM — ingest ticks boxes by substring-matching it. No recorded evidence = the worker reports fail by its own hand.",
|
|
752
|
+
"x-tier": "EMBEDDED",
|
|
753
|
+
"type": "object",
|
|
754
|
+
"required": [
|
|
755
|
+
"ac",
|
|
756
|
+
"result"
|
|
757
|
+
],
|
|
758
|
+
"properties": {
|
|
759
|
+
"ac": {
|
|
760
|
+
"type": "string",
|
|
761
|
+
"description": "The AC checkbox text, verbatim from the task file."
|
|
762
|
+
},
|
|
763
|
+
"result": {
|
|
764
|
+
"type": "string",
|
|
765
|
+
"enum": [
|
|
766
|
+
"pass",
|
|
767
|
+
"fail",
|
|
768
|
+
"skipped"
|
|
769
|
+
]
|
|
770
|
+
},
|
|
771
|
+
"evidence": {
|
|
772
|
+
"type": "string",
|
|
773
|
+
"description": "Concrete observable proof (command output, response, snapshot path)."
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
},
|
|
777
|
+
"TaskResult": {
|
|
778
|
+
"description": "Per-task outcome inside a WorkResult. ingest-result flips the board row, ticks pass ACs, sets frontmatter status/completed_at, and appends the Execution Log from these entries — the worker itself writes none of that.",
|
|
779
|
+
"x-tier": "EMBEDDED",
|
|
780
|
+
"type": "object",
|
|
781
|
+
"required": [
|
|
782
|
+
"task_id",
|
|
783
|
+
"status"
|
|
784
|
+
],
|
|
785
|
+
"properties": {
|
|
786
|
+
"task_id": {
|
|
787
|
+
"type": "string"
|
|
788
|
+
},
|
|
789
|
+
"status": {
|
|
790
|
+
"type": "string",
|
|
791
|
+
"enum": [
|
|
792
|
+
"done",
|
|
793
|
+
"partial",
|
|
794
|
+
"failed",
|
|
795
|
+
"skipped"
|
|
796
|
+
]
|
|
797
|
+
},
|
|
798
|
+
"ac_results": {
|
|
799
|
+
"type": "array",
|
|
800
|
+
"items": {
|
|
801
|
+
"$ref": "#/$defs/AcResult"
|
|
802
|
+
}
|
|
803
|
+
},
|
|
804
|
+
"notes": {
|
|
805
|
+
"type": "string"
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
},
|
|
809
|
+
"FileTouched": {
|
|
810
|
+
"description": "One file the worker created/modified/deleted — audit data for the run ledger; also how the orchestrator sees substrate usage.",
|
|
811
|
+
"x-tier": "EMBEDDED",
|
|
812
|
+
"type": "object",
|
|
813
|
+
"required": [
|
|
814
|
+
"path",
|
|
815
|
+
"change"
|
|
816
|
+
],
|
|
817
|
+
"properties": {
|
|
818
|
+
"path": {
|
|
819
|
+
"type": "string"
|
|
820
|
+
},
|
|
821
|
+
"change": {
|
|
822
|
+
"type": "string",
|
|
823
|
+
"enum": [
|
|
824
|
+
"created",
|
|
825
|
+
"modified",
|
|
826
|
+
"deleted"
|
|
827
|
+
]
|
|
828
|
+
},
|
|
829
|
+
"lines": {
|
|
830
|
+
"type": "integer"
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
},
|
|
834
|
+
"Escalate": {
|
|
835
|
+
"description": "The worker's ONE outward port: a decision it cannot make alone. Ingest queues these to escalates/<order>.json; advisor-protocol adjudicates (budget ≤3/scope/round) and the answer returns as a Decision in the next order. The advisor-side grammar adds scope_id/round/attempt/options/default_if_silent (see EscalateBlock).",
|
|
836
|
+
"x-tier": "EMBEDDED",
|
|
837
|
+
"type": "object",
|
|
838
|
+
"required": [
|
|
839
|
+
"kind",
|
|
840
|
+
"question"
|
|
841
|
+
],
|
|
842
|
+
"properties": {
|
|
843
|
+
"kind": {
|
|
844
|
+
"type": "string",
|
|
845
|
+
"enum": [
|
|
846
|
+
"design-decision",
|
|
847
|
+
"spec-ambiguity",
|
|
848
|
+
"substrate-expansion"
|
|
849
|
+
],
|
|
850
|
+
"description": "Three kinds, three resolution paths: design/spec go to the PO (or default_if_silent unattended); substrate-expansion is NEVER silently approved — it routes to a scope-architect remap order."
|
|
851
|
+
},
|
|
852
|
+
"question": {
|
|
853
|
+
"type": "string",
|
|
854
|
+
"description": "One checkable question."
|
|
855
|
+
},
|
|
856
|
+
"blocked_ac": {
|
|
857
|
+
"type": "string",
|
|
858
|
+
"description": "Which AC waits on this — work on unrelated ACs continues."
|
|
859
|
+
},
|
|
860
|
+
"context": {
|
|
861
|
+
"type": "string",
|
|
862
|
+
"description": "The two interpretations / the file and why it's needed."
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
},
|
|
866
|
+
"EscalateBlock": {
|
|
867
|
+
"description": "The advisor-protocol adjudication grammar — an Escalate enriched with run coordinates and options, as passed to /advisor-protocol --escalate. The answer is persisted to the committed round-ledger.md Decisions table the instant it's given (zero-memory handoff: escalation memory lives in files, not chat).",
|
|
868
|
+
"x-tier": "EMBEDDED",
|
|
869
|
+
"x-readers": "advisor-protocol",
|
|
870
|
+
"type": "object",
|
|
871
|
+
"required": [
|
|
872
|
+
"kind",
|
|
873
|
+
"question"
|
|
874
|
+
],
|
|
875
|
+
"properties": {
|
|
876
|
+
"scope_id": {
|
|
877
|
+
"type": "string"
|
|
878
|
+
},
|
|
879
|
+
"round": {
|
|
880
|
+
"type": "integer"
|
|
881
|
+
},
|
|
882
|
+
"attempt": {
|
|
883
|
+
"type": "integer"
|
|
884
|
+
},
|
|
885
|
+
"kind": {
|
|
886
|
+
"type": "string",
|
|
887
|
+
"enum": [
|
|
888
|
+
"design-decision",
|
|
889
|
+
"spec-ambiguity",
|
|
890
|
+
"substrate-expansion"
|
|
891
|
+
]
|
|
892
|
+
},
|
|
893
|
+
"question": {
|
|
894
|
+
"type": "string"
|
|
895
|
+
},
|
|
896
|
+
"options": {
|
|
897
|
+
"type": "array",
|
|
898
|
+
"items": {
|
|
899
|
+
"type": "string"
|
|
900
|
+
},
|
|
901
|
+
"description": "Proposed answers, each with its rationale."
|
|
902
|
+
},
|
|
903
|
+
"default_if_silent": {
|
|
904
|
+
"type": "string",
|
|
905
|
+
"description": "Optional low-risk fallback — applied under --unattended (logged + flagged for GATE H); the advisor is never forced to accept it."
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
},
|
|
909
|
+
"Discovery": {
|
|
910
|
+
"description": "The universal currency of surprise: one raw discovered line. Producers: task-executor (marker +, P3.7), qa-edge-hunter (always ~, repro required), ba-pitch-analyzer (overflow reports). NO producer writes the ledger — ingest-result appends every entry to discovery/ledger.md (single-writer, mechanically). Promotion ~ → must-have is always a human act at SHIP S.0/GATE H.",
|
|
911
|
+
"x-tier": "EMBEDDED (projection into the LOCAL discovery ledger)",
|
|
912
|
+
"x-location": ".shapeup/<slug>/discovery/ledger.md",
|
|
913
|
+
"x-writer": "ingest-result.mjs",
|
|
914
|
+
"x-readers": "ba-pitch-analyzer (reconcile), scope-architect (remap), scope-hammer (census), qa-edge-hunter (covered-territory context)",
|
|
915
|
+
"type": "object",
|
|
916
|
+
"required": [
|
|
917
|
+
"marker",
|
|
918
|
+
"line"
|
|
919
|
+
],
|
|
920
|
+
"properties": {
|
|
921
|
+
"marker": {
|
|
922
|
+
"type": "string",
|
|
923
|
+
"enum": [
|
|
924
|
+
"+",
|
|
925
|
+
"~"
|
|
926
|
+
],
|
|
927
|
+
"description": "+ = candidate work (build discoveries) · ~ = nice-to-have (all QA findings are born ~)."
|
|
928
|
+
},
|
|
929
|
+
"line": {
|
|
930
|
+
"type": "string",
|
|
931
|
+
"description": "One raw line, e.g. \"[QA-003] [UC-04] Double-click Confirm creates 2 orders\"."
|
|
932
|
+
},
|
|
933
|
+
"lens": {
|
|
934
|
+
"type": "string",
|
|
935
|
+
"description": "QA lens tag (①boundary ②concurrency ③interruption ④cross-UC ⑤no-go ⑥residue)."
|
|
936
|
+
},
|
|
937
|
+
"repro": {
|
|
938
|
+
"type": "string",
|
|
939
|
+
"description": "Numbered repro steps — mandatory for QA findings (no repro = unconfirmed observation, not a finding)."
|
|
940
|
+
},
|
|
941
|
+
"severity_hint": {
|
|
942
|
+
"type": "string",
|
|
943
|
+
"description": "data-integrity | boundary-breach | ux-degradation | cosmetic — the Hunter's ADVICE to triage, never a decision."
|
|
944
|
+
},
|
|
945
|
+
"test_gap": {
|
|
946
|
+
"type": "string",
|
|
947
|
+
"description": "unit | integration | exploratory-only — advises reconciliation whether to generate a test-writing task."
|
|
948
|
+
},
|
|
949
|
+
"contradicts": {
|
|
950
|
+
"type": "string",
|
|
951
|
+
"description": "EVAL criterion id this finding disproves — routes back through triage; the judge's record itself is never edited."
|
|
952
|
+
},
|
|
953
|
+
"traces_to": {
|
|
954
|
+
"type": "array",
|
|
955
|
+
"items": {
|
|
956
|
+
"type": "string",
|
|
957
|
+
"pattern": "^REQ-[0-9]+$"
|
|
958
|
+
},
|
|
959
|
+
"description": "OPTIONAL (spine v1.3) — REQ-ids this finding maps back to. The checkable back-link (LOCAL→SHARED) so an edge case maps to a business requirement by id instead of grepping ledger.md; trace-lint only checks the id resolves in the registry."
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
},
|
|
963
|
+
"T0Citation": {
|
|
964
|
+
"description": "The judge's pointer to a mechanical T0 artifact. The evaluator RECOMPUTES sha256 from disk — a handed hash is never trusted; a verdict on a scoped spec without a citation is structurally invalid (PA4/DD-7: T0 is a machine fact the generator cannot fabricate).",
|
|
965
|
+
"x-tier": "EMBEDDED",
|
|
966
|
+
"type": "object",
|
|
967
|
+
"required": [
|
|
968
|
+
"scope_id",
|
|
969
|
+
"path",
|
|
970
|
+
"sha256"
|
|
971
|
+
],
|
|
972
|
+
"properties": {
|
|
973
|
+
"scope_id": {
|
|
974
|
+
"type": "string"
|
|
975
|
+
},
|
|
976
|
+
"path": {
|
|
977
|
+
"type": "string",
|
|
978
|
+
"description": ".shapeup/<slug>/t0/verdicts/r<N>-a<M>.json"
|
|
979
|
+
},
|
|
980
|
+
"sha256": {
|
|
981
|
+
"type": "string",
|
|
982
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
},
|
|
986
|
+
"CriterionVerdict": {
|
|
987
|
+
"description": "One graded criterion. Ingest appends these as VerdictLedgerLine rows to evaluation/.verdicts-<target>.jsonl (append-only — history is how a single-snapshot judge becomes measurable; a flip vs a prior run forces confidence low). A FAIL additionally REQUIRES an evidence locator (file:line) — findings must be actionable without re-investigation.",
|
|
988
|
+
"x-tier": "EMBEDDED",
|
|
989
|
+
"anyOf": [
|
|
990
|
+
{
|
|
991
|
+
"type": "object",
|
|
992
|
+
"required": [
|
|
993
|
+
"criterion",
|
|
994
|
+
"verdict"
|
|
995
|
+
],
|
|
996
|
+
"properties": {
|
|
997
|
+
"criterion": {
|
|
998
|
+
"type": "string",
|
|
999
|
+
"description": "Traces to committed spec text (UC step/error/invariant/TS row, domain rule, contract field, Done-when, Non-Go) — never a task file's paraphrase."
|
|
1000
|
+
},
|
|
1001
|
+
"dimension": {
|
|
1002
|
+
"type": "string",
|
|
1003
|
+
"description": "spec-conformance (default) | tdd-surface | integration | completeness | test-surface-conformance | security | performance."
|
|
1004
|
+
},
|
|
1005
|
+
"verdict": {
|
|
1006
|
+
"type": "string",
|
|
1007
|
+
"enum": [
|
|
1008
|
+
"PASS"
|
|
1009
|
+
]
|
|
1010
|
+
},
|
|
1011
|
+
"confidence": {
|
|
1012
|
+
"type": "string",
|
|
1013
|
+
"enum": [
|
|
1014
|
+
"high",
|
|
1015
|
+
"medium",
|
|
1016
|
+
"low"
|
|
1017
|
+
]
|
|
1018
|
+
},
|
|
1019
|
+
"reprobed": {
|
|
1020
|
+
"type": "boolean",
|
|
1021
|
+
"description": "Every FAIL is re-probed once before finalizing."
|
|
1022
|
+
},
|
|
1023
|
+
"evidence": {
|
|
1024
|
+
"type": "string",
|
|
1025
|
+
"description": "Probe output / file:line — 'NO EVIDENCE' fails the criterion."
|
|
1026
|
+
},
|
|
1027
|
+
"traces_to": {
|
|
1028
|
+
"type": "array",
|
|
1029
|
+
"items": {
|
|
1030
|
+
"type": "string",
|
|
1031
|
+
"pattern": "^REQ-[0-9]+$"
|
|
1032
|
+
},
|
|
1033
|
+
"description": "OPTIONAL (spine v1.3) — REQ-ids this criterion maps back to. A checkable finding→requirement anchor (LOCAL→SHARED) so the judge's record maps to a business requirement by id; trace-lint only checks each id resolves in the registry. Navigation aid, never a grading input."
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
},
|
|
1037
|
+
{
|
|
1038
|
+
"type": "object",
|
|
1039
|
+
"required": [
|
|
1040
|
+
"criterion",
|
|
1041
|
+
"verdict",
|
|
1042
|
+
"evidence"
|
|
1043
|
+
],
|
|
1044
|
+
"properties": {
|
|
1045
|
+
"criterion": {
|
|
1046
|
+
"type": "string",
|
|
1047
|
+
"description": "Traces to committed spec text (UC step/error/invariant/TS row, domain rule, contract field, Done-when, Non-Go) — never a task file's paraphrase."
|
|
1048
|
+
},
|
|
1049
|
+
"dimension": {
|
|
1050
|
+
"type": "string",
|
|
1051
|
+
"description": "spec-conformance (default) | tdd-surface | integration | completeness | test-surface-conformance | security | performance."
|
|
1052
|
+
},
|
|
1053
|
+
"verdict": {
|
|
1054
|
+
"type": "string",
|
|
1055
|
+
"enum": [
|
|
1056
|
+
"FAIL"
|
|
1057
|
+
]
|
|
1058
|
+
},
|
|
1059
|
+
"confidence": {
|
|
1060
|
+
"type": "string",
|
|
1061
|
+
"enum": [
|
|
1062
|
+
"high",
|
|
1063
|
+
"medium",
|
|
1064
|
+
"low"
|
|
1065
|
+
]
|
|
1066
|
+
},
|
|
1067
|
+
"reprobed": {
|
|
1068
|
+
"type": "boolean",
|
|
1069
|
+
"description": "Every FAIL is re-probed once before finalizing."
|
|
1070
|
+
},
|
|
1071
|
+
"evidence": {
|
|
1072
|
+
"type": "string",
|
|
1073
|
+
"pattern": "[\\w./\\-]+:[0-9]+",
|
|
1074
|
+
"description": "A FAIL must carry a file:line locator. Was stated 5x in spec-evaluator/SKILL.md prose and enforced 0x; a measured run returned a correct FAIL verdict with bugs[] null and no locator anywhere, so the finding could not be acted on without re-investigating. Now mechanical: validate-envelope rejects it before ingest."
|
|
1075
|
+
},
|
|
1076
|
+
"traces_to": {
|
|
1077
|
+
"type": "array",
|
|
1078
|
+
"items": {
|
|
1079
|
+
"type": "string",
|
|
1080
|
+
"pattern": "^REQ-[0-9]+$"
|
|
1081
|
+
},
|
|
1082
|
+
"description": "OPTIONAL (spine v1.3) — REQ-ids this criterion maps back to. A checkable finding→requirement anchor (LOCAL→SHARED) so the judge's record maps to a business requirement by id; trace-lint only checks each id resolves in the registry. Navigation aid, never a grading input."
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
]
|
|
1087
|
+
},
|
|
1088
|
+
"RefutedAc": {
|
|
1089
|
+
"description": "An AC box the judge's evidence disproves. Un-ticking is INGEST's act (the judge never touches a task file): ingest un-ticks the box and stamps eval_verdict: fail + eval_at on the task frontmatter.",
|
|
1090
|
+
"x-tier": "EMBEDDED",
|
|
1091
|
+
"type": "object",
|
|
1092
|
+
"required": [
|
|
1093
|
+
"task_id",
|
|
1094
|
+
"ac"
|
|
1095
|
+
],
|
|
1096
|
+
"properties": {
|
|
1097
|
+
"task_id": {
|
|
1098
|
+
"type": "string"
|
|
1099
|
+
},
|
|
1100
|
+
"ac": {
|
|
1101
|
+
"type": "string",
|
|
1102
|
+
"description": "The checkbox text the evidence disproves, verbatim."
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
},
|
|
1106
|
+
"Verdict": {
|
|
1107
|
+
"description": "The single judge's return — spec-evaluator only. Overall PASS requires ALL active dimensions to pass (halo effect banned); the judge NEVER sets a task done — closure belongs to the orchestrator.",
|
|
1108
|
+
"x-tier": "EMBEDDED",
|
|
1109
|
+
"type": "object",
|
|
1110
|
+
"properties": {
|
|
1111
|
+
"overall": {
|
|
1112
|
+
"type": "string",
|
|
1113
|
+
"enum": [
|
|
1114
|
+
"PASS",
|
|
1115
|
+
"FAIL"
|
|
1116
|
+
]
|
|
1117
|
+
},
|
|
1118
|
+
"report_path": {
|
|
1119
|
+
"type": "string",
|
|
1120
|
+
"description": ".shapeup/<slug>/evaluation/EVAL-FEATURE-<slug>.md (or EVAL-<task_id>.md per-task)."
|
|
1121
|
+
},
|
|
1122
|
+
"t0_citations": {
|
|
1123
|
+
"type": "array",
|
|
1124
|
+
"items": {
|
|
1125
|
+
"$ref": "#/$defs/T0Citation"
|
|
1126
|
+
}
|
|
1127
|
+
},
|
|
1128
|
+
"criteria": {
|
|
1129
|
+
"type": "array",
|
|
1130
|
+
"items": {
|
|
1131
|
+
"$ref": "#/$defs/CriterionVerdict"
|
|
1132
|
+
}
|
|
1133
|
+
},
|
|
1134
|
+
"refuted": {
|
|
1135
|
+
"type": "array",
|
|
1136
|
+
"items": {
|
|
1137
|
+
"$ref": "#/$defs/RefutedAc"
|
|
1138
|
+
}
|
|
1139
|
+
},
|
|
1140
|
+
"bugs": {
|
|
1141
|
+
"type": "array",
|
|
1142
|
+
"description": "report-schema bug entries: severity, criterion, file:line, repro, expected vs actual."
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
},
|
|
1146
|
+
"CommandResult": {
|
|
1147
|
+
"description": "One executed command's outcome inside a T0 artifact — produced by actually running the command; no agent can fabricate it.",
|
|
1148
|
+
"x-tier": "EMBEDDED",
|
|
1149
|
+
"type": "object",
|
|
1150
|
+
"properties": {
|
|
1151
|
+
"cmd": {
|
|
1152
|
+
"type": "string"
|
|
1153
|
+
},
|
|
1154
|
+
"exit": {
|
|
1155
|
+
"type": "integer"
|
|
1156
|
+
},
|
|
1157
|
+
"pass": {
|
|
1158
|
+
"type": "boolean"
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
},
|
|
1162
|
+
"SeesawCheck": {
|
|
1163
|
+
"description": "The regression half of T0: every FINISHED scope's fixtures re-run from the SeesawRegistry. fixtures/db green + seesaw red = a REGRESSION (the new scope broke a finished one) → git stash rollback + retry, not 'fix the new scope's bug'.",
|
|
1164
|
+
"x-tier": "EMBEDDED",
|
|
1165
|
+
"type": "object",
|
|
1166
|
+
"properties": {
|
|
1167
|
+
"ran": {
|
|
1168
|
+
"type": "boolean",
|
|
1169
|
+
"description": "false when no registry was passed or the attempt was already red (don't seesaw a red attempt)."
|
|
1170
|
+
},
|
|
1171
|
+
"pass": {
|
|
1172
|
+
"type": "boolean"
|
|
1173
|
+
},
|
|
1174
|
+
"scopes_checked": {
|
|
1175
|
+
"type": "array",
|
|
1176
|
+
"items": {
|
|
1177
|
+
"type": "string"
|
|
1178
|
+
}
|
|
1179
|
+
},
|
|
1180
|
+
"failing": {
|
|
1181
|
+
"type": "array",
|
|
1182
|
+
"items": {
|
|
1183
|
+
"type": "string"
|
|
1184
|
+
},
|
|
1185
|
+
"description": "scope_ids whose fixtures broke."
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
},
|
|
1189
|
+
"T0Artifact": {
|
|
1190
|
+
"description": "The mechanical verification verdict for one build attempt — the evidence layer under the LLM judge. Written by t0-verify.mjs from actually running the scope's fixtures + DB probe + seesaw; zero LLM tokens. spec-evaluator must cite it (sha256) on scoped specs. Red artifacts carry AEGIS triples that become the next attempt's digested_errors.",
|
|
1191
|
+
"x-tier": "LOCAL",
|
|
1192
|
+
"x-location": ".shapeup/<slug>/t0/verdicts/r<N>-a<M>-t<T>.json (schema_version 2; the unsuffixed r<N>-a<M>.json of schema_version 1 is still readable)",
|
|
1193
|
+
"x-writer": "t0-verify.mjs",
|
|
1194
|
+
"x-readers": "compile-order.mjs (next attempt), spec-evaluator (citation), tech-lead (hill derivation, GATE L2.3), scope-hammer (stall census)",
|
|
1195
|
+
"type": "object",
|
|
1196
|
+
"properties": {
|
|
1197
|
+
"schema_version": {
|
|
1198
|
+
"type": "integer",
|
|
1199
|
+
"enum": [
|
|
1200
|
+
1,
|
|
1201
|
+
2
|
|
1202
|
+
]
|
|
1203
|
+
},
|
|
1204
|
+
"round": {
|
|
1205
|
+
"type": "integer"
|
|
1206
|
+
},
|
|
1207
|
+
"attempt": {
|
|
1208
|
+
"type": "integer"
|
|
1209
|
+
},
|
|
1210
|
+
"trial": {
|
|
1211
|
+
"type": "integer",
|
|
1212
|
+
"description": "schema_version 2+: the retry ordinal within (round, attempt). Written with flag 'wx', so a retry of the SAME attempt lands beside its predecessor instead of destroying it (invariant I4)."
|
|
1213
|
+
},
|
|
1214
|
+
"at": {
|
|
1215
|
+
"type": "string",
|
|
1216
|
+
"description": "ISO timestamp."
|
|
1217
|
+
},
|
|
1218
|
+
"scope_id": {
|
|
1219
|
+
"type": "string"
|
|
1220
|
+
},
|
|
1221
|
+
"fixtures": {
|
|
1222
|
+
"type": "array",
|
|
1223
|
+
"items": {
|
|
1224
|
+
"$ref": "#/$defs/CommandResult"
|
|
1225
|
+
}
|
|
1226
|
+
},
|
|
1227
|
+
"db_probe": {
|
|
1228
|
+
"$ref": "#/$defs/CommandResult"
|
|
1229
|
+
},
|
|
1230
|
+
"seesaw": {
|
|
1231
|
+
"$ref": "#/$defs/SeesawCheck"
|
|
1232
|
+
},
|
|
1233
|
+
"fixtures_green": {
|
|
1234
|
+
"type": "boolean"
|
|
1235
|
+
},
|
|
1236
|
+
"db_probe_green": {
|
|
1237
|
+
"type": "boolean",
|
|
1238
|
+
"description": "true when no probe declared (null probe never counts as failure)."
|
|
1239
|
+
},
|
|
1240
|
+
"seesaw_green": {
|
|
1241
|
+
"type": "boolean"
|
|
1242
|
+
},
|
|
1243
|
+
"overall": {
|
|
1244
|
+
"type": "string",
|
|
1245
|
+
"enum": [
|
|
1246
|
+
"green",
|
|
1247
|
+
"red"
|
|
1248
|
+
]
|
|
1249
|
+
},
|
|
1250
|
+
"regression": {
|
|
1251
|
+
"type": "boolean",
|
|
1252
|
+
"description": "fixtures+db green but seesaw red — the rollback+retry case."
|
|
1253
|
+
},
|
|
1254
|
+
"score": {
|
|
1255
|
+
"$ref": "#/$defs/T0Score",
|
|
1256
|
+
"description": "schema_version 2+: the comparable outcome vector better() ranks. A reduce over fixtures[] — no new measurement."
|
|
1257
|
+
},
|
|
1258
|
+
"discovered_tasks": {
|
|
1259
|
+
"type": "array",
|
|
1260
|
+
"items": {
|
|
1261
|
+
"$ref": "#/$defs/AegisTriple"
|
|
1262
|
+
},
|
|
1263
|
+
"description": "Populated only on red; feeds the next order."
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
},
|
|
1267
|
+
"T0Score": {
|
|
1268
|
+
"description": "The comparable T0 outcome — a VECTOR, not a float, because the three arms are not fungible. Ranked by t0-verify's better(): regressions dominate, then fixtures_passed, then db_probe; a tie is NOT better (a tie counted as an improvement makes a sawtooth look like a ratchet), and a different fixtures_total is INCOMPARABLE rather than worse (a scope split changes the denominator).",
|
|
1269
|
+
"x-tier": "EMBEDDED",
|
|
1270
|
+
"type": "object",
|
|
1271
|
+
"properties": {
|
|
1272
|
+
"regressions": {
|
|
1273
|
+
"type": "integer",
|
|
1274
|
+
"minimum": 0,
|
|
1275
|
+
"description": "Previously-FINISHED scopes now failing (seesaw). Dominates: breaking a shipped scope is never an improvement."
|
|
1276
|
+
},
|
|
1277
|
+
"fixtures_passed": {
|
|
1278
|
+
"type": "integer",
|
|
1279
|
+
"minimum": 0
|
|
1280
|
+
},
|
|
1281
|
+
"fixtures_total": {
|
|
1282
|
+
"type": "integer",
|
|
1283
|
+
"minimum": 0,
|
|
1284
|
+
"description": "The denominator. A change here makes two scores incomparable — better() returns null and the ratchet re-baselines."
|
|
1285
|
+
},
|
|
1286
|
+
"db_probe": {
|
|
1287
|
+
"type": [
|
|
1288
|
+
"integer",
|
|
1289
|
+
"null"
|
|
1290
|
+
],
|
|
1291
|
+
"enum": [
|
|
1292
|
+
0,
|
|
1293
|
+
1,
|
|
1294
|
+
null
|
|
1295
|
+
],
|
|
1296
|
+
"description": "null = no probe declared, which is an absence and never a failure."
|
|
1297
|
+
}
|
|
1298
|
+
},
|
|
1299
|
+
"required": [
|
|
1300
|
+
"regressions",
|
|
1301
|
+
"fixtures_passed",
|
|
1302
|
+
"fixtures_total"
|
|
1303
|
+
]
|
|
1304
|
+
},
|
|
1305
|
+
"TrialRow": {
|
|
1306
|
+
"description": "One row per T0 run — the ratchet's history, and the artifact that makes 'is attempt N+1 better than attempt N?' answerable. Append-only (I4: every superseded object remains addressable). baseline_trial is the parent link: that single field IS the experiment DAG (lineage, PARENT_OF, and a genuine SUPERSEDES edge) delivered without a graph store. Written by t0-verify, NOT ingest-result: a trial row is a mechanical fact produced by running commands, in the same class as the verdict artifact t0-verify already owns, and carries no worker claim to apply.",
|
|
1307
|
+
"x-tier": "LOCAL",
|
|
1308
|
+
"x-location": ".shapeup/<slug>/t0/trials.jsonl",
|
|
1309
|
+
"x-writer": "t0-verify.mjs (append-only)",
|
|
1310
|
+
"x-readers": "compile-order.mjs (payload.trial_history — the paper's inspect()), stats.mjs --ratchet (improvement_rate, monotone_rate, sawtooth_count)",
|
|
1311
|
+
"type": "object",
|
|
1312
|
+
"properties": {
|
|
1313
|
+
"schema_version": {
|
|
1314
|
+
"type": "integer",
|
|
1315
|
+
"enum": [
|
|
1316
|
+
1
|
|
1317
|
+
]
|
|
1318
|
+
},
|
|
1319
|
+
"trial": {
|
|
1320
|
+
"type": "integer",
|
|
1321
|
+
"minimum": 1,
|
|
1322
|
+
"description": "Monotone ordinal across the run's whole ledger — what baseline_trial points at."
|
|
1323
|
+
},
|
|
1324
|
+
"round": {
|
|
1325
|
+
"type": "integer"
|
|
1326
|
+
},
|
|
1327
|
+
"attempt": {
|
|
1328
|
+
"type": "integer"
|
|
1329
|
+
},
|
|
1330
|
+
"scope_id": {
|
|
1331
|
+
"type": "string"
|
|
1332
|
+
},
|
|
1333
|
+
"at": {
|
|
1334
|
+
"type": "string",
|
|
1335
|
+
"description": "ISO timestamp."
|
|
1336
|
+
},
|
|
1337
|
+
"artifact": {
|
|
1338
|
+
"type": "string",
|
|
1339
|
+
"description": "Path to the T0Artifact this row records, relative to the run root."
|
|
1340
|
+
},
|
|
1341
|
+
"sha256": {
|
|
1342
|
+
"type": "string",
|
|
1343
|
+
"description": "The artifact's content hash — the same bytes spec-evaluator re-hashes."
|
|
1344
|
+
},
|
|
1345
|
+
"score": {
|
|
1346
|
+
"$ref": "#/$defs/T0Score"
|
|
1347
|
+
},
|
|
1348
|
+
"status": {
|
|
1349
|
+
"type": "string",
|
|
1350
|
+
"enum": [
|
|
1351
|
+
"kept",
|
|
1352
|
+
"reverted",
|
|
1353
|
+
"rebased",
|
|
1354
|
+
"crash"
|
|
1355
|
+
],
|
|
1356
|
+
"description": "The one rule that replaced the protocol's two red branches. kept = strictly better (INCLUDING red-but-improved: 2/5 → 4/5 fixtures is kept, and that is the whole ratchet) · reverted = not better, tree restored · rebased = incomparable, baseline reset · crash = a command failed to spawn or timed out, tree restored."
|
|
1357
|
+
},
|
|
1358
|
+
"baseline_trial": {
|
|
1359
|
+
"type": [
|
|
1360
|
+
"integer",
|
|
1361
|
+
"null"
|
|
1362
|
+
],
|
|
1363
|
+
"description": "The trial this one was compared against — the parent edge. null on the first trial of a scope."
|
|
1364
|
+
},
|
|
1365
|
+
"delta": {
|
|
1366
|
+
"type": "string",
|
|
1367
|
+
"description": "Human-readable score change, e.g. \"+2 fixtures\"."
|
|
1368
|
+
},
|
|
1369
|
+
"tree_ref": {
|
|
1370
|
+
"type": [
|
|
1371
|
+
"string",
|
|
1372
|
+
"null"
|
|
1373
|
+
],
|
|
1374
|
+
"description": "refs/shapeup/<scope_id>/kept — a SHADOW ref, so the harness keeps its convention of never writing commits to the branch under test."
|
|
1375
|
+
},
|
|
1376
|
+
"digest": {
|
|
1377
|
+
"type": "array",
|
|
1378
|
+
"items": {
|
|
1379
|
+
"$ref": "#/$defs/AegisTriple"
|
|
1380
|
+
},
|
|
1381
|
+
"description": "This trial's failures, carried forward as the next order's digested_errors."
|
|
1382
|
+
}
|
|
1383
|
+
},
|
|
1384
|
+
"required": [
|
|
1385
|
+
"schema_version",
|
|
1386
|
+
"trial",
|
|
1387
|
+
"scope_id",
|
|
1388
|
+
"score",
|
|
1389
|
+
"status"
|
|
1390
|
+
]
|
|
1391
|
+
},
|
|
1392
|
+
"SeesawRegistry": {
|
|
1393
|
+
"description": "The fixture registry of every FINISHED scope — what seesawCheck re-runs on each later attempt so a new scope cannot silently break a shipped one (PA5).",
|
|
1394
|
+
"x-tier": "LOCAL",
|
|
1395
|
+
"x-location": ".shapeup/<slug>/seesaw/registry.json",
|
|
1396
|
+
"x-writer": "tech-lead (when a scope reaches FINISHED)",
|
|
1397
|
+
"x-readers": "t0-verify.mjs",
|
|
1398
|
+
"type": "object",
|
|
1399
|
+
"properties": {
|
|
1400
|
+
"scopes": {
|
|
1401
|
+
"type": "array",
|
|
1402
|
+
"items": {
|
|
1403
|
+
"type": "object",
|
|
1404
|
+
"properties": {
|
|
1405
|
+
"scope_id": {
|
|
1406
|
+
"type": "string"
|
|
1407
|
+
},
|
|
1408
|
+
"fixtures": {
|
|
1409
|
+
"type": "array",
|
|
1410
|
+
"items": {
|
|
1411
|
+
"type": "string"
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
},
|
|
1419
|
+
"VerdictLedgerLine": {
|
|
1420
|
+
"description": "One appended line of judge history (JSONL). Never rewritten — flips across runs are detected here and force confidence low. run auto-increments per append batch.",
|
|
1421
|
+
"x-tier": "LOCAL",
|
|
1422
|
+
"x-location": ".shapeup/<slug>/evaluation/.verdicts-<target>.jsonl",
|
|
1423
|
+
"x-writer": "ingest-result.mjs (from Verdict.criteria[])",
|
|
1424
|
+
"x-readers": "spec-evaluator (read-only flip detection), verdict-ledger.mjs",
|
|
1425
|
+
"type": "object",
|
|
1426
|
+
"properties": {
|
|
1427
|
+
"run": {
|
|
1428
|
+
"type": "integer"
|
|
1429
|
+
},
|
|
1430
|
+
"dimension": {
|
|
1431
|
+
"type": "string"
|
|
1432
|
+
},
|
|
1433
|
+
"criterion": {
|
|
1434
|
+
"type": "string"
|
|
1435
|
+
},
|
|
1436
|
+
"verdict": {
|
|
1437
|
+
"type": "string",
|
|
1438
|
+
"enum": [
|
|
1439
|
+
"PASS",
|
|
1440
|
+
"FAIL"
|
|
1441
|
+
]
|
|
1442
|
+
},
|
|
1443
|
+
"confidence": {
|
|
1444
|
+
"type": "string",
|
|
1445
|
+
"enum": [
|
|
1446
|
+
"high",
|
|
1447
|
+
"medium",
|
|
1448
|
+
"low"
|
|
1449
|
+
]
|
|
1450
|
+
},
|
|
1451
|
+
"reprobed": {
|
|
1452
|
+
"type": "boolean"
|
|
1453
|
+
},
|
|
1454
|
+
"evidence": {
|
|
1455
|
+
"type": "string"
|
|
1456
|
+
},
|
|
1457
|
+
"at": {
|
|
1458
|
+
"type": "string"
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
},
|
|
1462
|
+
"HillShard": {
|
|
1463
|
+
"description": "One scope's hill position — DERIVED, never self-reported (DD-10): UPHILL_UNKNOWN (open unknowns > 0) → UPHILL_SOLVED (unknowns 0, no T0-green yet) → DOWNHILL_EXECUTION (≥1 T0-green; T1/seesaw pending) → FINISHED (T1 PASS ∧ seesaw green ∧ merged). Single-writer = whoever holds that scope's branch. Progress is reported by hill position, never task counts.",
|
|
1464
|
+
"x-tier": "SHARED",
|
|
1465
|
+
"x-location": "shapeup/<slug>/hill/<scope-id>.yml",
|
|
1466
|
+
"x-writer": "tech-lead (GATE L2.4 derivation)",
|
|
1467
|
+
"x-readers": "tech-lead (GATE L3 hill report), scope-hammer (census), GATE L1b sequencing",
|
|
1468
|
+
"type": "object",
|
|
1469
|
+
"properties": {
|
|
1470
|
+
"scope_id": {
|
|
1471
|
+
"type": "string"
|
|
1472
|
+
},
|
|
1473
|
+
"phase": {
|
|
1474
|
+
"type": "string",
|
|
1475
|
+
"enum": [
|
|
1476
|
+
"UPHILL_UNKNOWN",
|
|
1477
|
+
"UPHILL_SOLVED",
|
|
1478
|
+
"DOWNHILL_EXECUTION",
|
|
1479
|
+
"FINISHED"
|
|
1480
|
+
]
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
},
|
|
1484
|
+
"MetricsRow": {
|
|
1485
|
+
"description": "One SHIP-time harvest row (facts only — copied from structured output that already exists; never a newly computed verdict/score, which would be a second judge behind spec-evaluator). Sharded per machine so concurrent runs never merge-conflict.",
|
|
1486
|
+
"x-tier": "SHARED",
|
|
1487
|
+
"x-location": ".shapeup/metrics/<machine-id>.jsonl",
|
|
1488
|
+
"x-writer": "tech-lead (SHIP S.6)",
|
|
1489
|
+
"x-readers": "tier-3 e2e benchmark tooling, stats.mjs (read-only projection)",
|
|
1490
|
+
"type": "object",
|
|
1491
|
+
"properties": {
|
|
1492
|
+
"schema_version": {
|
|
1493
|
+
"type": "integer",
|
|
1494
|
+
"enum": [
|
|
1495
|
+
1
|
|
1496
|
+
]
|
|
1497
|
+
},
|
|
1498
|
+
"at": {
|
|
1499
|
+
"type": "string",
|
|
1500
|
+
"description": "OPTIONAL (v1.2) — ISO harvest timestamp; enables real trend-over-time in stats.mjs. Older rows lack it and fall back to shard append order."
|
|
1501
|
+
},
|
|
1502
|
+
"feature_slug": {
|
|
1503
|
+
"type": "string"
|
|
1504
|
+
},
|
|
1505
|
+
"terminal_state": {
|
|
1506
|
+
"type": "string",
|
|
1507
|
+
"description": "shipped | built-verified-deploy-pending | escalated | …"
|
|
1508
|
+
},
|
|
1509
|
+
"round_count": {
|
|
1510
|
+
"type": "integer"
|
|
1511
|
+
},
|
|
1512
|
+
"final_audit_score": {
|
|
1513
|
+
"type": "string",
|
|
1514
|
+
"description": "COPIED from the final EVAL report, never re-graded."
|
|
1515
|
+
},
|
|
1516
|
+
"surprise_count": {
|
|
1517
|
+
"type": "integer",
|
|
1518
|
+
"description": "Discovery-ledger entries — shaping-quality / scope-drift signal."
|
|
1519
|
+
},
|
|
1520
|
+
"spike_unresolved_count": {
|
|
1521
|
+
"type": "integer"
|
|
1522
|
+
},
|
|
1523
|
+
"scope_cut_count": {
|
|
1524
|
+
"type": "integer"
|
|
1525
|
+
},
|
|
1526
|
+
"attempt_exhaustions": {
|
|
1527
|
+
"type": "integer",
|
|
1528
|
+
"description": "OPTIONAL (v1.2) — scopes whose inner attempt_budget tripped this run, COPIED at SHIP S.6 from the queued GATE H hammer proposals (a fact registered at the source; stats.mjs must never re-derive it)."
|
|
1529
|
+
},
|
|
1530
|
+
"qa_findings": {
|
|
1531
|
+
"type": "object",
|
|
1532
|
+
"properties": {
|
|
1533
|
+
"total": {
|
|
1534
|
+
"type": "integer"
|
|
1535
|
+
},
|
|
1536
|
+
"promoted": {
|
|
1537
|
+
"type": "integer"
|
|
1538
|
+
},
|
|
1539
|
+
"held": {
|
|
1540
|
+
"type": "integer"
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
},
|
|
1544
|
+
"slice_count": {
|
|
1545
|
+
"type": "integer",
|
|
1546
|
+
"description": "From breadboard B5 — the normalizer/denominator (round_count=4 on a 2-slice feature is alarming; on a 9-slice one it isn't)."
|
|
1547
|
+
},
|
|
1548
|
+
"ratchet": {
|
|
1549
|
+
"type": "object",
|
|
1550
|
+
"description": "OPTIONAL (v1.5) — the DAY-1 exit measurement, COPIED from `stats.mjs --ratchet` over this run's t0/trials.jsonl before the LOCAL trace is wiped. This is the only place the ratchet numbers survive the run, and the only reason they can be compared across machines: `.shapeup/` is gitignored, so a measurement left there answers the question exactly once and then deletes itself. Facts only — every field is a count or a ratio over recorded trial rows, never a grade.",
|
|
1551
|
+
"properties": {
|
|
1552
|
+
"trials": {
|
|
1553
|
+
"type": "integer"
|
|
1554
|
+
},
|
|
1555
|
+
"scopes_multi_trial": {
|
|
1556
|
+
"type": "integer",
|
|
1557
|
+
"description": "Scopes with ≥2 trials — the denominator that makes the other numbers meaningful. Zero means this run never asked the Day-1 question."
|
|
1558
|
+
},
|
|
1559
|
+
"improvement_rate": {
|
|
1560
|
+
"type": "number",
|
|
1561
|
+
"description": "kept ÷ trials after the first. The first trial is the baseline by construction and is excluded."
|
|
1562
|
+
},
|
|
1563
|
+
"monotone_rate": {
|
|
1564
|
+
"type": "number",
|
|
1565
|
+
"description": "Scopes whose score never decreased ÷ scopes with ≥2 trials. A monotone series is a ratchet working; a sawtooth says the loop is still a budgeted retry loop."
|
|
1566
|
+
},
|
|
1567
|
+
"sawtooth_count": {
|
|
1568
|
+
"type": "integer",
|
|
1569
|
+
"description": "Reverts immediately following a keep."
|
|
1570
|
+
},
|
|
1571
|
+
"mean_trials_to_green": {
|
|
1572
|
+
"type": [
|
|
1573
|
+
"number",
|
|
1574
|
+
"null"
|
|
1575
|
+
]
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
},
|
|
1579
|
+
"hooks": {
|
|
1580
|
+
"type": "object",
|
|
1581
|
+
"description": "OPTIONAL (v1.5) — the DAY-2 exit measurement, COPIED from `stats.mjs --hooks` over .shapeup/decisions.jsonl. Makes 'never had to fire' and 'never ran' separable across runs: before the decision ledger both produced exit 0 and empty stdout, which is why several enforcement tools were unscoreable.",
|
|
1582
|
+
"properties": {
|
|
1583
|
+
"evaluations": {
|
|
1584
|
+
"type": "integer"
|
|
1585
|
+
},
|
|
1586
|
+
"denials": {
|
|
1587
|
+
"type": "integer"
|
|
1588
|
+
},
|
|
1589
|
+
"errors": {
|
|
1590
|
+
"type": "integer"
|
|
1591
|
+
},
|
|
1592
|
+
"per_hook": {
|
|
1593
|
+
"type": "object",
|
|
1594
|
+
"description": "hook name → {evaluations, deny, error}."
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
},
|
|
1598
|
+
"sources": {
|
|
1599
|
+
"type": "array",
|
|
1600
|
+
"items": {
|
|
1601
|
+
"type": "string"
|
|
1602
|
+
},
|
|
1603
|
+
"description": "Paths of the SHARED source artifacts harvested from — SHARED tier ONLY. LOCAL .shapeup/ paths are read at harvest time but never recorded: this row is committed and the run-trace is gitignored/wiped, so a LOCAL path would dangle on every clone (tier-direction rule)."
|
|
1604
|
+
}
|
|
1605
|
+
}
|
|
1606
|
+
},
|
|
1607
|
+
"ActiveScopePointer": {
|
|
1608
|
+
"description": "What the sandbox hook reads to enforce the active scope's substrate on every Edit/Write this round. Written at branch checkout; NOT writable by any worker (a worker must never widen its own sandbox).",
|
|
1609
|
+
"x-tier": "LOCAL",
|
|
1610
|
+
"x-location": ".shapeup/active-scope",
|
|
1611
|
+
"x-writer": "tech-lead (BUILD step 0)",
|
|
1612
|
+
"x-readers": "sandbox-guard hook",
|
|
1613
|
+
"type": "object",
|
|
1614
|
+
"properties": {
|
|
1615
|
+
"slug": {
|
|
1616
|
+
"type": "string"
|
|
1617
|
+
},
|
|
1618
|
+
"scope_id": {
|
|
1619
|
+
"type": "string"
|
|
1620
|
+
}
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
"SafetyOverrides": {
|
|
1624
|
+
"description": "Escape hatch for the safety-spine hook — a command or secret path matching an entry is exempted from denial (the exemption itself is logged as a SAFETY-OVERRIDE pathology row: overrides stay visible, propose-never-dispose). Malformed file = treated as ABSENT: the override channel fails closed so a parse error can never disable the spine.",
|
|
1625
|
+
"x-tier": "LOCAL",
|
|
1626
|
+
"x-location": ".shapeup/safety-overrides.json",
|
|
1627
|
+
"x-writer": "human PO only — hand-authored. Deliberately placed at the .shapeup/ root, OUTSIDE the active slug's run-trace carve-out, so sandbox-guard denies any worker write to it during a scoped round; safety-spine additionally self-protects the file in every mode.",
|
|
1628
|
+
"x-readers": "safety-spine hook",
|
|
1629
|
+
"type": "object",
|
|
1630
|
+
"required": [
|
|
1631
|
+
"schema_version"
|
|
1632
|
+
],
|
|
1633
|
+
"properties": {
|
|
1634
|
+
"schema_version": {
|
|
1635
|
+
"type": "integer",
|
|
1636
|
+
"enum": [
|
|
1637
|
+
1
|
|
1638
|
+
]
|
|
1639
|
+
},
|
|
1640
|
+
"allow_commands": {
|
|
1641
|
+
"type": "array",
|
|
1642
|
+
"items": {
|
|
1643
|
+
"type": "string"
|
|
1644
|
+
},
|
|
1645
|
+
"description": "Regex sources; a Bash command matching any is exempted from the spine's deny rules."
|
|
1646
|
+
},
|
|
1647
|
+
"allow_secret_paths": {
|
|
1648
|
+
"type": "array",
|
|
1649
|
+
"items": {
|
|
1650
|
+
"type": "string"
|
|
1651
|
+
},
|
|
1652
|
+
"description": "Globs; a path matching any is exempted from the secret-read deny (Bash readers and the Read tool alike)."
|
|
1653
|
+
},
|
|
1654
|
+
"note": {
|
|
1655
|
+
"type": "string",
|
|
1656
|
+
"description": "Why the override exists — the audit trail a bare env var could never carry."
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1659
|
+
},
|
|
1660
|
+
"RunSnapshot": {
|
|
1661
|
+
"description": "Mechanical mid-run state digest, derived ONLY from files (active-scope pointer, harness-run.md frontmatter, board frontmatter, t0/verdicts filenames, orders/ vs results/) — never from conversation memory. The compaction-resilience reflex: persisted by the PreCompact hook as an audit anchor, re-derived fresh and injected as additionalContext by the SessionStart(startup|compact|resume|clear) hook so the orchestrator re-reads the files instead of trusting a lossy summary — or, on a cold startup, instead of re-opening a run that is already open.",
|
|
1662
|
+
"x-tier": "LOCAL",
|
|
1663
|
+
"x-location": ".shapeup/<slug>/run-snapshot.json (persisted by the compact-snapshot hook; also emitted ephemerally on stdout by run-snapshot.mjs)",
|
|
1664
|
+
"x-writer": "run-snapshot.mjs --write (invoked by the PreCompact hook — never a worker; this is LOCAL derived cache, ingest-result.mjs remains the sole writer of SHARED state)",
|
|
1665
|
+
"x-readers": "session-rehydrate hook, tech-lead (--from resume aid), human",
|
|
1666
|
+
"type": "object",
|
|
1667
|
+
"required": [
|
|
1668
|
+
"schema_version",
|
|
1669
|
+
"at",
|
|
1670
|
+
"slug"
|
|
1671
|
+
],
|
|
1672
|
+
"properties": {
|
|
1673
|
+
"schema_version": {
|
|
1674
|
+
"type": "integer",
|
|
1675
|
+
"enum": [
|
|
1676
|
+
1
|
|
1677
|
+
]
|
|
1678
|
+
},
|
|
1679
|
+
"at": {
|
|
1680
|
+
"type": "string",
|
|
1681
|
+
"description": "ISO timestamp of derivation."
|
|
1682
|
+
},
|
|
1683
|
+
"slug": {
|
|
1684
|
+
"type": "string"
|
|
1685
|
+
},
|
|
1686
|
+
"scope_id": {
|
|
1687
|
+
"type": "string",
|
|
1688
|
+
"description": "Present only while a scope is checked out (active-scope pointer exists)."
|
|
1689
|
+
},
|
|
1690
|
+
"status": {
|
|
1691
|
+
"type": "string",
|
|
1692
|
+
"enum": [
|
|
1693
|
+
"orienting",
|
|
1694
|
+
"mapping",
|
|
1695
|
+
"building",
|
|
1696
|
+
"evaluating",
|
|
1697
|
+
"shipped",
|
|
1698
|
+
"escalated"
|
|
1699
|
+
],
|
|
1700
|
+
"description": "Mirrors harness-run.md frontmatter status."
|
|
1701
|
+
},
|
|
1702
|
+
"round": {
|
|
1703
|
+
"type": "integer",
|
|
1704
|
+
"description": "From the latest t0/verdicts/r<N>-a<M>.json filename; falls back to rounds_used."
|
|
1705
|
+
},
|
|
1706
|
+
"attempt": {
|
|
1707
|
+
"type": "integer",
|
|
1708
|
+
"description": "From the latest t0/verdicts/r<N>-a<M>.json filename."
|
|
1709
|
+
},
|
|
1710
|
+
"rounds_used": {
|
|
1711
|
+
"type": "integer"
|
|
1712
|
+
},
|
|
1713
|
+
"max_rounds": {
|
|
1714
|
+
"type": "integer"
|
|
1715
|
+
},
|
|
1716
|
+
"auto_level": {
|
|
1717
|
+
"type": "string"
|
|
1718
|
+
},
|
|
1719
|
+
"latest_t0": {
|
|
1720
|
+
"type": "object",
|
|
1721
|
+
"properties": {
|
|
1722
|
+
"path": {
|
|
1723
|
+
"type": "string"
|
|
1724
|
+
},
|
|
1725
|
+
"overall": {
|
|
1726
|
+
"type": "string",
|
|
1727
|
+
"enum": [
|
|
1728
|
+
"green",
|
|
1729
|
+
"red"
|
|
1730
|
+
]
|
|
1731
|
+
},
|
|
1732
|
+
"round": {
|
|
1733
|
+
"type": "integer"
|
|
1734
|
+
},
|
|
1735
|
+
"attempt": {
|
|
1736
|
+
"type": "integer"
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1739
|
+
},
|
|
1740
|
+
"board": {
|
|
1741
|
+
"type": "object",
|
|
1742
|
+
"properties": {
|
|
1743
|
+
"total": {
|
|
1744
|
+
"type": "integer"
|
|
1745
|
+
},
|
|
1746
|
+
"done": {
|
|
1747
|
+
"type": "integer"
|
|
1748
|
+
},
|
|
1749
|
+
"unfinished": {
|
|
1750
|
+
"type": "array",
|
|
1751
|
+
"items": {
|
|
1752
|
+
"type": "string"
|
|
1753
|
+
},
|
|
1754
|
+
"description": "Task ids not yet done — capped at 10."
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
},
|
|
1758
|
+
"open_escalates": {
|
|
1759
|
+
"type": "integer"
|
|
1760
|
+
},
|
|
1761
|
+
"pending_orders": {
|
|
1762
|
+
"type": "array",
|
|
1763
|
+
"items": {
|
|
1764
|
+
"type": "string"
|
|
1765
|
+
},
|
|
1766
|
+
"description": "orders/ files with no same-name file in results/ — dispatched but not ingested; re-dispatching one of these is the exact post-compaction mistake this record exists to prevent."
|
|
1767
|
+
},
|
|
1768
|
+
"spec_folder": {
|
|
1769
|
+
"type": "string"
|
|
1770
|
+
},
|
|
1771
|
+
"rehydrate_hint": {
|
|
1772
|
+
"type": "string",
|
|
1773
|
+
"description": "The composed one-paragraph instruction injected after compaction: re-read run-state, trust the files, not the summary."
|
|
1774
|
+
}
|
|
1775
|
+
}
|
|
1776
|
+
},
|
|
1777
|
+
"StatsReport": {
|
|
1778
|
+
"description": "The telemetry read-plane's output — an aggregate projection over the MetricsRow shards. Aggregates COPIED facts only (counts, rates, trends over already-recorded fields); it never grades, so it can never become a second judge. Malformed rows are skipped fail-open and counted; pathology rows (sandbox-guard/safety-spine denials share the shards) are partitioned, not errors.",
|
|
1779
|
+
"x-tier": "EMBEDDED (ephemeral projection — printed to stdout, never persisted; the metrics JSONL stays the only source of truth)",
|
|
1780
|
+
"x-writer": "stats.mjs (read-only over metrics/ — writes nothing)",
|
|
1781
|
+
"x-readers": "human / CLI / CI",
|
|
1782
|
+
"type": "object",
|
|
1783
|
+
"required": [
|
|
1784
|
+
"schema_version",
|
|
1785
|
+
"generated_at",
|
|
1786
|
+
"rows_total",
|
|
1787
|
+
"per_slug"
|
|
1788
|
+
],
|
|
1789
|
+
"properties": {
|
|
1790
|
+
"schema_version": {
|
|
1791
|
+
"type": "integer",
|
|
1792
|
+
"enum": [
|
|
1793
|
+
1
|
|
1794
|
+
]
|
|
1795
|
+
},
|
|
1796
|
+
"generated_at": {
|
|
1797
|
+
"type": "string"
|
|
1798
|
+
},
|
|
1799
|
+
"metrics_dir": {
|
|
1800
|
+
"type": "string"
|
|
1801
|
+
},
|
|
1802
|
+
"sources": {
|
|
1803
|
+
"type": "array",
|
|
1804
|
+
"items": {
|
|
1805
|
+
"type": "string"
|
|
1806
|
+
},
|
|
1807
|
+
"description": "Shard filenames read."
|
|
1808
|
+
},
|
|
1809
|
+
"rows_total": {
|
|
1810
|
+
"type": "integer",
|
|
1811
|
+
"description": "Valid harvest rows aggregated."
|
|
1812
|
+
},
|
|
1813
|
+
"rows_malformed": {
|
|
1814
|
+
"type": "integer",
|
|
1815
|
+
"description": "Lines skipped fail-open (unparseable, or missing feature_slug/terminal_state)."
|
|
1816
|
+
},
|
|
1817
|
+
"rows_pathology": {
|
|
1818
|
+
"type": "integer",
|
|
1819
|
+
"description": "kind:\"pathology\" rows (hook denials) — partitioned into the histogram, not aggregated as runs."
|
|
1820
|
+
},
|
|
1821
|
+
"pathologies": {
|
|
1822
|
+
"type": "object",
|
|
1823
|
+
"description": "Histogram keyed by pathology code, e.g. {\"PA3\": 2, \"SAFETY\": 1}."
|
|
1824
|
+
},
|
|
1825
|
+
"per_slug": {
|
|
1826
|
+
"type": "array",
|
|
1827
|
+
"items": {
|
|
1828
|
+
"type": "object",
|
|
1829
|
+
"required": [
|
|
1830
|
+
"feature_slug",
|
|
1831
|
+
"runs"
|
|
1832
|
+
],
|
|
1833
|
+
"properties": {
|
|
1834
|
+
"feature_slug": {
|
|
1835
|
+
"type": "string"
|
|
1836
|
+
},
|
|
1837
|
+
"runs": {
|
|
1838
|
+
"type": "integer"
|
|
1839
|
+
},
|
|
1840
|
+
"rounds": {
|
|
1841
|
+
"type": "object",
|
|
1842
|
+
"properties": {
|
|
1843
|
+
"min": {
|
|
1844
|
+
"type": "integer"
|
|
1845
|
+
},
|
|
1846
|
+
"max": {
|
|
1847
|
+
"type": "integer"
|
|
1848
|
+
},
|
|
1849
|
+
"avg": {
|
|
1850
|
+
"type": "number"
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
},
|
|
1854
|
+
"terminal_states": {
|
|
1855
|
+
"type": "object",
|
|
1856
|
+
"description": "Histogram of terminal_state values."
|
|
1857
|
+
},
|
|
1858
|
+
"hammer_cut_rate": {
|
|
1859
|
+
"type": "number",
|
|
1860
|
+
"description": "Share of runs with scope_cut_count > 0."
|
|
1861
|
+
},
|
|
1862
|
+
"scope_cuts_total": {
|
|
1863
|
+
"type": "integer"
|
|
1864
|
+
},
|
|
1865
|
+
"attempt_exhaustions": {
|
|
1866
|
+
"type": "integer",
|
|
1867
|
+
"description": "Summed only where the optional MetricsRow field exists — never re-derived."
|
|
1868
|
+
},
|
|
1869
|
+
"qa": {
|
|
1870
|
+
"type": "object",
|
|
1871
|
+
"properties": {
|
|
1872
|
+
"total": {
|
|
1873
|
+
"type": "integer"
|
|
1874
|
+
},
|
|
1875
|
+
"promoted": {
|
|
1876
|
+
"type": "integer"
|
|
1877
|
+
},
|
|
1878
|
+
"held": {
|
|
1879
|
+
"type": "integer"
|
|
1880
|
+
},
|
|
1881
|
+
"promotion_rate": {
|
|
1882
|
+
"type": "number"
|
|
1883
|
+
}
|
|
1884
|
+
}
|
|
1885
|
+
},
|
|
1886
|
+
"surprise_avg": {
|
|
1887
|
+
"type": "number"
|
|
1888
|
+
},
|
|
1889
|
+
"rounds_per_slice_avg": {
|
|
1890
|
+
"type": "number",
|
|
1891
|
+
"description": "round_count/slice_count averaged over rows where slice_count > 0 — the normalized effort signal."
|
|
1892
|
+
}
|
|
1893
|
+
}
|
|
1894
|
+
}
|
|
1895
|
+
},
|
|
1896
|
+
"trend": {
|
|
1897
|
+
"type": "array",
|
|
1898
|
+
"items": {
|
|
1899
|
+
"type": "object",
|
|
1900
|
+
"required": [
|
|
1901
|
+
"feature_slug",
|
|
1902
|
+
"seq",
|
|
1903
|
+
"round_count"
|
|
1904
|
+
],
|
|
1905
|
+
"properties": {
|
|
1906
|
+
"feature_slug": {
|
|
1907
|
+
"type": "string"
|
|
1908
|
+
},
|
|
1909
|
+
"seq": {
|
|
1910
|
+
"type": "integer",
|
|
1911
|
+
"description": "Append order within the shard — the fallback ordering for rows without `at`."
|
|
1912
|
+
},
|
|
1913
|
+
"at": {
|
|
1914
|
+
"type": "string"
|
|
1915
|
+
},
|
|
1916
|
+
"round_count": {
|
|
1917
|
+
"type": "integer"
|
|
1918
|
+
}
|
|
1919
|
+
}
|
|
1920
|
+
},
|
|
1921
|
+
"description": "round_count over time — the 'is the KB flywheel working' chart."
|
|
1922
|
+
}
|
|
1923
|
+
}
|
|
1924
|
+
},
|
|
1925
|
+
"Lane": {
|
|
1926
|
+
"description": "v1.2 DESIGN DRAFT — reserves the name and makes the policy reviewable; no envelope references it yet and no runtime reads it. See docs/design/04-functional-design.md §4.7. When implemented, the lane is pipeline knowledge: the orchestrator compiles it away into existing registered knobs (payload.lens, payload.dimensions, interaction gate policy) — it NEVER rides in WorkOrderPayload, so workers stay pipeline-blind.",
|
|
1927
|
+
"x-tier": "EMBEDDED (when implemented: recorded in harness-run.md frontmatter `lane:` — never a WorkOrderPayload field)",
|
|
1928
|
+
"x-writer": "tech-lead (GATE L0 lane selection)",
|
|
1929
|
+
"x-readers": "tech-lead only",
|
|
1930
|
+
"x-lane-policy": {
|
|
1931
|
+
"tiny": {
|
|
1932
|
+
"selection": "one-scope pitch AND appetite <= 2 weeks AND no third-party integration AND <= 3 user-facing actions — the same predicate ba-pitch-analyzer uses to judge lens: lite",
|
|
1933
|
+
"skips": [
|
|
1934
|
+
"orient",
|
|
1935
|
+
"gate-l1a",
|
|
1936
|
+
"full board ceremony at L1b (auto-generated lens:lite board, one merged confirmation gate)"
|
|
1937
|
+
],
|
|
1938
|
+
"defaults": {
|
|
1939
|
+
"qa": "--no-qa",
|
|
1940
|
+
"round_budget": 2
|
|
1941
|
+
},
|
|
1942
|
+
"never_skips": [
|
|
1943
|
+
"EVAL (single judge)",
|
|
1944
|
+
"T0",
|
|
1945
|
+
"hooks"
|
|
1946
|
+
]
|
|
1947
|
+
},
|
|
1948
|
+
"normal": {
|
|
1949
|
+
"selection": "everything else — today's behavior, unchanged",
|
|
1950
|
+
"skips": [],
|
|
1951
|
+
"defaults": {
|
|
1952
|
+
"round_budget": 3
|
|
1953
|
+
}
|
|
1954
|
+
},
|
|
1955
|
+
"full": {
|
|
1956
|
+
"selection": "cross-context lens OR appetite >= 6 weeks",
|
|
1957
|
+
"skips": [],
|
|
1958
|
+
"defaults": {
|
|
1959
|
+
"lens": "cross-context",
|
|
1960
|
+
"qa": "mandatory",
|
|
1961
|
+
"round_budget": 4
|
|
1962
|
+
}
|
|
1963
|
+
}
|
|
1964
|
+
},
|
|
1965
|
+
"type": "string",
|
|
1966
|
+
"enum": [
|
|
1967
|
+
"tiny",
|
|
1968
|
+
"normal",
|
|
1969
|
+
"full"
|
|
1970
|
+
]
|
|
1971
|
+
},
|
|
1972
|
+
"RequirementClause": {
|
|
1973
|
+
"description": "One atomic customer requirement, frozen with a STABLE id — the covers-closure input truth (spine v1.3). Extracted from the REQ source (Open Decision A: pitch / customer-requirements doc / use-case bodies) by ba-pitch-analyzer's `coverage` operation; extraction is judgment (LLM), but ids are assigned ONCE and never renumber (they behave like scope_id, not TASK-NNN — every covers: link would rot otherwise). Supersede-never-delete: a dropped clause is marked CUT (PO-approved), never removed, so the registry stays auditable on a fresh clone. The original REQ source is never edited — the registry is a separate derived, committed file.",
|
|
1974
|
+
"x-tier": "SHARED",
|
|
1975
|
+
"x-location": "shapeup/<slug>/requirements.md",
|
|
1976
|
+
"x-writer": "ba-pitch-analyzer (operation: coverage) — extraction only; CUT status is a PO governance edit (same class as a round-ledger Decision)",
|
|
1977
|
+
"x-readers": "trace-lint.mjs (covers-closure oracle), tech-lead, human (coverage/cut audit)",
|
|
1978
|
+
"type": "object",
|
|
1979
|
+
"required": [
|
|
1980
|
+
"id",
|
|
1981
|
+
"clause",
|
|
1982
|
+
"status"
|
|
1983
|
+
],
|
|
1984
|
+
"properties": {
|
|
1985
|
+
"id": {
|
|
1986
|
+
"type": "string",
|
|
1987
|
+
"pattern": "^REQ-[0-9]+$",
|
|
1988
|
+
"description": "REQ-N — assigned once, frozen; the stable cross-machine key every covers[] / traces_to[] link resolves against."
|
|
1989
|
+
},
|
|
1990
|
+
"clause": {
|
|
1991
|
+
"type": "string",
|
|
1992
|
+
"description": "The requirement text, VERBATIM from the source — the deletion this closure catches is a clause that no AC covers."
|
|
1993
|
+
},
|
|
1994
|
+
"source": {
|
|
1995
|
+
"type": "string",
|
|
1996
|
+
"description": "Where the clause came from (e.g. \"pitch §2.2\", \"req-doc.md#L14\", \"UC-04 body\") — the provenance an auditor traces back."
|
|
1997
|
+
},
|
|
1998
|
+
"status": {
|
|
1999
|
+
"type": "string",
|
|
2000
|
+
"enum": [
|
|
2001
|
+
"covered",
|
|
2002
|
+
"CUT (PO-approved)"
|
|
2003
|
+
],
|
|
2004
|
+
"description": "covered = must be named by ≥1 AC's covers[] or trace-lint goes red; CUT (PO-approved) = a Betting-Table decision to drop it, kept for audit (never deleted)."
|
|
2005
|
+
},
|
|
2006
|
+
"note": {
|
|
2007
|
+
"type": "string",
|
|
2008
|
+
"description": "Optional rationale — required in spirit for a CUT (why the clause was dropped)."
|
|
2009
|
+
}
|
|
2010
|
+
}
|
|
2011
|
+
},
|
|
2012
|
+
"WiringEntry": {
|
|
2013
|
+
"description": "One use-case's reachability chain inside a WiringMap: engine → wiring seam → entry-point call site → player-visible affordance. The declaration front-loads the integration seam scope-architect needs at slicing time (the missing input behind the round-1 main.js substrate-expansion escalations).",
|
|
2014
|
+
"x-tier": "EMBEDDED (inside WiringMap.entries)",
|
|
2015
|
+
"type": "object",
|
|
2016
|
+
"required": [
|
|
2017
|
+
"use_case",
|
|
2018
|
+
"engine"
|
|
2019
|
+
],
|
|
2020
|
+
"properties": {
|
|
2021
|
+
"use_case": {
|
|
2022
|
+
"type": "string",
|
|
2023
|
+
"description": "UC id this chain realizes (e.g. UC-04) — resolves against the committed usecases/ tree."
|
|
2024
|
+
},
|
|
2025
|
+
"engine": {
|
|
2026
|
+
"type": "string",
|
|
2027
|
+
"description": "Repo-relative path of the module implementing the UC's core logic — the file reachability BFS must reach from the entry point (a dead module with 0 import sites is red)."
|
|
2028
|
+
},
|
|
2029
|
+
"wiring_seam": {
|
|
2030
|
+
"type": "string",
|
|
2031
|
+
"description": "How the engine is meant to attach (event handler, route registration, init hook) — prose the slicer reads."
|
|
2032
|
+
},
|
|
2033
|
+
"entry_call_site": {
|
|
2034
|
+
"type": "string",
|
|
2035
|
+
"description": "DESIGN INTENT (spine v1.3): the composition-root attachment this engine registers into, named from ProjectProfile.entry_point + the mechanism — e.g. 'src/server.ts — POST /checkout route', 'main.js — game-loop init hook'. Symbolic, authored at L1a.5 before the code exists; NEVER an invented file:line. The concrete coordinate is a build-time fact; the reachability oracle proves the seam via the import graph (engine reached from entry_point) and does not parse this field."
|
|
2036
|
+
},
|
|
2037
|
+
"affordance": {
|
|
2038
|
+
"type": "string",
|
|
2039
|
+
"description": "The player-visible affordance this UC exposes when wired — the human-facing end of the chain."
|
|
2040
|
+
}
|
|
2041
|
+
}
|
|
2042
|
+
},
|
|
2043
|
+
"WiringMap": {
|
|
2044
|
+
"description": "The reachability map — per UC, the chain from engine to a player-visible affordance (spine v1.3). Written DIRECTLY by solution-architect at gate L1a.5 (precedent: ScopeContract is written directly by scope-architect, bypassing ingest-result). Its purpose: no engine ships orphaned from the running application. trace-lint folds reachability into its covers-closure pass — a UC whose engine does not reach ProjectProfile.entry_point via the import graph is red. A Mermaid view is auto-rendered from this map (a view of a checked graph, so it cannot drift). ON-DISK FORMAT IS MARKDOWN (ADR-0001): frontmatter carries the scalars and [a, b] lists, a markdown table carries the one array-of-objects field, and prose carries the rationale a reviewer reads. THIS SCHEMA DESCRIBES THE PARSED OBJECT — the wire form embedded in the WorkOrder envelope — not the file. `skills/tech-lead/scripts/lib/contract-md.mjs` is the only reader/writer of the file form; everything downstream of that parse sees exactly this shape.",
|
|
2045
|
+
"x-tier": "SHARED",
|
|
2046
|
+
"x-location": "shapeup/<slug>/wiring-map.md",
|
|
2047
|
+
"x-writer": "solution-architect (SOLE writer, direct — like scope-architect writes scopes/*.md)",
|
|
2048
|
+
"x-readers": "trace-lint.mjs (reachability oracle), scope-architect (integration seam at slicing time), tech-lead",
|
|
2049
|
+
"type": "object",
|
|
2050
|
+
"required": [
|
|
2051
|
+
"schema_version",
|
|
2052
|
+
"feature",
|
|
2053
|
+
"entries"
|
|
2054
|
+
],
|
|
2055
|
+
"properties": {
|
|
2056
|
+
"schema_version": {
|
|
2057
|
+
"type": "integer",
|
|
2058
|
+
"enum": [
|
|
2059
|
+
1
|
|
2060
|
+
]
|
|
2061
|
+
},
|
|
2062
|
+
"feature": {
|
|
2063
|
+
"type": "string",
|
|
2064
|
+
"description": "The feature slug."
|
|
2065
|
+
},
|
|
2066
|
+
"entry_point": {
|
|
2067
|
+
"type": "string",
|
|
2068
|
+
"description": "OPTIONAL echo of ProjectProfile.entry_point at authoring time (informational — the profile stays the source of truth reachability resolves against)."
|
|
2069
|
+
},
|
|
2070
|
+
"entries": {
|
|
2071
|
+
"type": "array",
|
|
2072
|
+
"items": {
|
|
2073
|
+
"$ref": "#/$defs/WiringEntry"
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
}
|
|
2077
|
+
},
|
|
2078
|
+
"ProjectProfile": {
|
|
2079
|
+
"description": "The archetype + entry-point declaration reachability depends on (spine v1.3). Exists for ONE load-bearing reason: reachability must know the entry point, and that is archetype-specific (main.js for a client-only game is not the seam for a web-service). SHARED — a declaration that must survive `rm -rf .shapeup/` + clone cannot live in the gitignored run-trace. Role-gating (skip SysRS/Auth/CI-CD) is explicitly OUT of scope — those roles are not workers; the profile is introduced only as the entry-point/archetype declaration. ON-DISK FORMAT IS MARKDOWN (ADR-0001): frontmatter carries the scalars and [a, b] lists, a markdown table carries the one array-of-objects field, and prose carries the rationale a reviewer reads. THIS SCHEMA DESCRIBES THE PARSED OBJECT — the wire form embedded in the WorkOrder envelope — not the file. `skills/tech-lead/scripts/lib/contract-md.mjs` is the only reader/writer of the file form; everything downstream of that parse sees exactly this shape.",
|
|
2080
|
+
"x-tier": "SHARED",
|
|
2081
|
+
"x-location": "shapeup/<slug>/project-profile.md",
|
|
2082
|
+
"x-writer": "tech-lead (GATE L0 — not compile-order.mjs, which stays pipeline-blind)",
|
|
2083
|
+
"x-readers": "trace-lint.mjs (reachability entry_point), solution-architect (wire), tech-lead",
|
|
2084
|
+
"type": "object",
|
|
2085
|
+
"required": [
|
|
2086
|
+
"schema_version",
|
|
2087
|
+
"archetype",
|
|
2088
|
+
"entry_point"
|
|
2089
|
+
],
|
|
2090
|
+
"properties": {
|
|
2091
|
+
"schema_version": {
|
|
2092
|
+
"type": "integer",
|
|
2093
|
+
"enum": [
|
|
2094
|
+
1
|
|
2095
|
+
]
|
|
2096
|
+
},
|
|
2097
|
+
"archetype": {
|
|
2098
|
+
"type": "string",
|
|
2099
|
+
"enum": [
|
|
2100
|
+
"client-only-game",
|
|
2101
|
+
"web-service",
|
|
2102
|
+
"mobile",
|
|
2103
|
+
"library",
|
|
2104
|
+
"data-pipeline"
|
|
2105
|
+
],
|
|
2106
|
+
"description": "Validated against the enum — a typo must FAIL, never silently disable reachability."
|
|
2107
|
+
},
|
|
2108
|
+
"entry_point": {
|
|
2109
|
+
"type": "string",
|
|
2110
|
+
"description": "The repo-relative seam trace-lint reachability resolves engines against (e.g. main.js, src/server.ts). Not hardcoded — archetype-specific."
|
|
2111
|
+
},
|
|
2112
|
+
"note": {
|
|
2113
|
+
"type": "string",
|
|
2114
|
+
"description": "Optional context on the archetype/entry-point choice."
|
|
2115
|
+
}
|
|
2116
|
+
}
|
|
2117
|
+
},
|
|
2118
|
+
"WorkOrderPayload": {
|
|
2119
|
+
"description": "The union of every worker-specific input field a WorkOrder payload may carry. Which fields a given worker relies on is registered in x-payload-by-worker at the schema root — a worker treats anything absent from its order as unknown, and a NEW cross-boundary field must be added HERE first (with an x-payload-by-worker entry), never invented ad hoc in a skill.",
|
|
2120
|
+
"x-tier": "EMBEDDED",
|
|
2121
|
+
"type": "object",
|
|
2122
|
+
"properties": {
|
|
2123
|
+
"scope_contract": {
|
|
2124
|
+
"$ref": "#/$defs/ScopeContract",
|
|
2125
|
+
"description": "task-executor: the active scope, verbatim from scopes/<id>.md."
|
|
2126
|
+
},
|
|
2127
|
+
"tasks": {
|
|
2128
|
+
"type": "array",
|
|
2129
|
+
"items": {
|
|
2130
|
+
"$ref": "#/$defs/TaskRef"
|
|
2131
|
+
},
|
|
2132
|
+
"description": "task-executor: what to implement · scope-architect: the slicing input · spec-evaluator: traceability ONLY (never a grading source)."
|
|
2133
|
+
},
|
|
2134
|
+
"decisions": {
|
|
2135
|
+
"type": "array",
|
|
2136
|
+
"items": {
|
|
2137
|
+
"$ref": "#/$defs/Decision"
|
|
2138
|
+
},
|
|
2139
|
+
"description": "task-executor: binding precedent from prior escalations."
|
|
2140
|
+
},
|
|
2141
|
+
"digested_errors": {
|
|
2142
|
+
"type": "array",
|
|
2143
|
+
"items": {
|
|
2144
|
+
"$ref": "#/$defs/AegisTriple"
|
|
2145
|
+
},
|
|
2146
|
+
"description": "task-executor: the previous attempt's failures — the starting bug list."
|
|
2147
|
+
},
|
|
2148
|
+
"trial_history": {
|
|
2149
|
+
"type": "array",
|
|
2150
|
+
"items": {
|
|
2151
|
+
"$ref": "#/$defs/TrialRow"
|
|
2152
|
+
},
|
|
2153
|
+
"maxItems": 8,
|
|
2154
|
+
"description": "task-executor: the paper's inspect() — this scope's recent trials, CROSSING the round boundary (this round and the one before it), each with its score, kept/reverted status and top-3 digest. Absent when no trials.jsonl exists, which is the non-regression path. Token-bounded at 8 rows (~600 tokens) against an attempt_budget of 5 — cheaper than one re-proposed failed change."
|
|
2155
|
+
},
|
|
2156
|
+
"kb_rules_path": {
|
|
2157
|
+
"type": "string",
|
|
2158
|
+
"description": "Coachable workers (task-executor, ba-pitch-analyzer, qa-edge-hunter): shapeup/knowledge-base/<skill>.md — steering, never spec; conflict → the AC wins, noted in deviations."
|
|
2159
|
+
},
|
|
2160
|
+
"verify": {
|
|
2161
|
+
"$ref": "#/$defs/VerifySpec",
|
|
2162
|
+
"description": "task-executor: the verification command."
|
|
2163
|
+
},
|
|
2164
|
+
"constraints": {
|
|
2165
|
+
"$ref": "#/$defs/Constraints",
|
|
2166
|
+
"description": "task-executor: Non-Go items and freezes."
|
|
2167
|
+
},
|
|
2168
|
+
"bugs": {
|
|
2169
|
+
"type": "array",
|
|
2170
|
+
"description": "task-executor (operation: fix): the EVAL report's bug entries for this task — touch nothing else."
|
|
2171
|
+
},
|
|
2172
|
+
"spec_folder": {
|
|
2173
|
+
"type": "string",
|
|
2174
|
+
"description": "Planner/judge/QA/architect/orient: the committed spec tree (shapeup/<slug>/spec/). The judge's grading truth."
|
|
2175
|
+
},
|
|
2176
|
+
"feature": {
|
|
2177
|
+
"type": "string",
|
|
2178
|
+
"description": "The feature slug — the aggregate-root key of every path."
|
|
2179
|
+
},
|
|
2180
|
+
"pitch": {
|
|
2181
|
+
"type": "string",
|
|
2182
|
+
"description": "ba-pitch-analyzer (analyze) / orient: the kicked-off pitch path (shaped + bet; frontmatter appetite/status/bet)."
|
|
2183
|
+
},
|
|
2184
|
+
"lens": {
|
|
2185
|
+
"type": "string",
|
|
2186
|
+
"enum": [
|
|
2187
|
+
"lite",
|
|
2188
|
+
"standard",
|
|
2189
|
+
"cross-context"
|
|
2190
|
+
],
|
|
2191
|
+
"description": "ba-pitch-analyzer: analysis depth. Absent → the planner judges it and records the choice in assumptions[]."
|
|
2192
|
+
},
|
|
2193
|
+
"orient_dir": {
|
|
2194
|
+
"type": "string",
|
|
2195
|
+
"description": "ba-pitch-analyzer: the Scout's artifact dir — code-surface.md IS the codebase map (do not re-scan)."
|
|
2196
|
+
},
|
|
2197
|
+
"stack": {
|
|
2198
|
+
"type": "string",
|
|
2199
|
+
"description": "orient: stack hint aiming the code-surface sweeps (e.g. \"pnpm, Next 16 web :3000\")."
|
|
2200
|
+
},
|
|
2201
|
+
"discovered_ledger": {
|
|
2202
|
+
"type": "string",
|
|
2203
|
+
"description": "ba-pitch-analyzer (reconcile) / scope-architect (remap): the discovery ledger path whose raw [+]/~ lines get folded in."
|
|
2204
|
+
},
|
|
2205
|
+
"requirements": {
|
|
2206
|
+
"type": "string",
|
|
2207
|
+
"description": "ba-pitch-analyzer (operation: coverage): the REQ source to extract atomic clauses from (Open Decision A — pitch / customer-requirements doc / use-case bodies). Absent → the planner defaults to the pitch and records the choice in assumptions[]. The written registry lands at shapeup/<slug>/requirements.md (RequirementClause rows)."
|
|
2208
|
+
},
|
|
2209
|
+
"project_profile": {
|
|
2210
|
+
"type": "string",
|
|
2211
|
+
"description": "solution-architect (operation: wire): path to the SHARED project-profile.md (archetype + entry_point) — the reachability seam the wiring map is authored against. Absent orchestrated → ESCALATE, never guess the entry point."
|
|
2212
|
+
},
|
|
2213
|
+
"scope_id": {
|
|
2214
|
+
"type": "string",
|
|
2215
|
+
"description": "scope-architect (split-scope): the stuck scope · scope-hammer (--breaker inner): the exhausted scope · advisor-protocol: budget scope."
|
|
2216
|
+
},
|
|
2217
|
+
"dimensions": {
|
|
2218
|
+
"type": "array",
|
|
2219
|
+
"items": {
|
|
2220
|
+
"type": "string"
|
|
2221
|
+
},
|
|
2222
|
+
"description": "spec-evaluator: the active dimension set (caller-resolved precedence). Absent → [spec-conformance] + auto-enable rules."
|
|
2223
|
+
},
|
|
2224
|
+
"run_cmd": {
|
|
2225
|
+
"type": "string",
|
|
2226
|
+
"description": "spec-evaluator: how to start the running app. Absent orchestrated → ESCALATE, never guess."
|
|
2227
|
+
},
|
|
2228
|
+
"t0_artifacts": {
|
|
2229
|
+
"type": "array",
|
|
2230
|
+
"items": {
|
|
2231
|
+
"type": "string"
|
|
2232
|
+
},
|
|
2233
|
+
"description": "spec-evaluator: per-scope T0 verdict paths for this round. Listed-but-missing/red, or a scoped spec with none → status: failed (structural precondition, not a criterion)."
|
|
2234
|
+
},
|
|
2235
|
+
"browser": {
|
|
2236
|
+
"type": "string",
|
|
2237
|
+
"enum": [
|
|
2238
|
+
"cli",
|
|
2239
|
+
"mcp",
|
|
2240
|
+
"none"
|
|
2241
|
+
],
|
|
2242
|
+
"description": "spec-evaluator: probe driver (cli default, ~4x cheaper)."
|
|
2243
|
+
},
|
|
2244
|
+
"eval_report": {
|
|
2245
|
+
"type": "string",
|
|
2246
|
+
"description": "qa-edge-hunter: the PASS EVAL report — negative-space input; its covered territory is subtracted from charters."
|
|
2247
|
+
},
|
|
2248
|
+
"app_url": {
|
|
2249
|
+
"type": "string",
|
|
2250
|
+
"description": "qa-edge-hunter: the running app to hunt (one real request at Q0, not a ping)."
|
|
2251
|
+
},
|
|
2252
|
+
"ledger": {
|
|
2253
|
+
"type": "string",
|
|
2254
|
+
"description": "qa-edge-hunter: discovery ledger path (READ-ONLY context) · advisor-protocol: the committed round-ledger.md decisions persist to."
|
|
2255
|
+
},
|
|
2256
|
+
"escalate": {
|
|
2257
|
+
"$ref": "#/$defs/EscalateBlock",
|
|
2258
|
+
"description": "advisor-protocol: the worker's ESCALATE block to adjudicate."
|
|
2259
|
+
},
|
|
2260
|
+
"round": {
|
|
2261
|
+
"type": "integer",
|
|
2262
|
+
"description": "advisor-protocol: the round the budget/decision is counted against."
|
|
2263
|
+
},
|
|
2264
|
+
"baseline": {
|
|
2265
|
+
"type": "string",
|
|
2266
|
+
"description": "scope-hammer: shaping/baseline.md — comparison anchor (absent → the pitch's problem statement, flagged approximate)."
|
|
2267
|
+
},
|
|
2268
|
+
"breaker": {
|
|
2269
|
+
"type": "string",
|
|
2270
|
+
"enum": [
|
|
2271
|
+
"outer",
|
|
2272
|
+
"inner"
|
|
2273
|
+
],
|
|
2274
|
+
"description": "scope-hammer: which circuit breaker fired (absent = normal stop, all scopes FINISHED)."
|
|
2275
|
+
},
|
|
2276
|
+
"feedback": {
|
|
2277
|
+
"type": "string",
|
|
2278
|
+
"description": "coach: the PO's raw L4 feedback to distill and categorize at GATE COACH-1."
|
|
2279
|
+
},
|
|
2280
|
+
"intake": {
|
|
2281
|
+
"type": "array",
|
|
2282
|
+
"items": {
|
|
2283
|
+
"type": "string"
|
|
2284
|
+
},
|
|
2285
|
+
"description": "translator: source docs to normalize to English (originals never overwritten)."
|
|
2286
|
+
},
|
|
2287
|
+
"glossary": {
|
|
2288
|
+
"type": "string",
|
|
2289
|
+
"description": "translator: existing glossary.md to reuse as the base term map."
|
|
2290
|
+
}
|
|
2291
|
+
}
|
|
2292
|
+
}
|
|
2293
|
+
}
|
|
2294
|
+
}
|