shapeup-sdlc 3.18.2 → 4.0.0
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 +2 -3
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +115 -56
- package/README.md +101 -143
- package/SECURITY.md +16 -25
- package/agents/orient.md +14 -0
- package/agents/qa-edge-hunter.md +13 -0
- package/agents/spec-evaluator.md +14 -0
- package/agents/task-executor.md +14 -0
- package/bin/init.mjs +13 -16
- package/bin/lib/grant.mjs +8 -19
- package/commands/build.md +9 -14
- package/commands/eval.md +3 -3
- package/commands/hammer.md +9 -5
- package/commands/retro.md +12 -11
- package/commands/scopes.md +1 -12
- package/commands/ship.md +45 -88
- package/commands/wire.md +1 -8
- package/hooks/dispatch-receipt.mjs +94 -8
- package/hooks/hooks.json +0 -41
- package/hooks/lib/decision.mjs +6 -9
- package/hooks/lib/tier.mjs +50 -0
- package/hooks/sandbox-guard.mjs +140 -64
- package/kernel/gate.mjs +203 -22
- package/kernel/harness.mjs +20 -67
- package/kernel/init/run.mjs +175 -523
- package/kernel/lib/contract.mjs +9 -93
- package/kernel/lib/floor.mjs +64 -0
- package/kernel/lib/paths.mjs +39 -112
- package/kernel/order.mjs +157 -0
- package/kernel/probe/digest.mjs +2 -38
- package/kernel/schemas/domain.schema.json +146 -1125
- package/kernel/schemas/work-order.schema.json +8 -4
- package/kernel/schemas/work-result.schema.json +1 -1
- package/kernel/verify/envelope.mjs +2 -2
- package/kernel/verify/skills.mjs +27 -8
- package/kernel/verify/t0.mjs +2 -2
- package/package.json +4 -2
- package/skills/building/SKILL.md +144 -0
- package/skills/building/resources/gates.md +76 -0
- package/skills/building/resources/guidance.md +23 -0
- package/skills/{translator/references/preservation-rules.md → building/resources/intake-preservation.md} +1 -1
- package/skills/building/resources/intake.md +157 -0
- package/skills/building/resources/orders.md +69 -0
- package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/doc-schemas.md +1 -1
- package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/task-generation.md +13 -13
- package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/test-surface.md +6 -7
- package/skills/building/resources/plan-scopes.md +95 -0
- package/skills/building/resources/plan-spec.md +102 -0
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/_index.tmpl.md +1 -1
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/assess-report.tmpl.md +10 -11
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/run-state.tmpl.md +4 -4
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/scope-summary.tmpl.md +2 -2
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/synthesis.tmpl.md +4 -4
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/usecase.tmpl.md +2 -2
- package/skills/building/resources/plan-wire.md +82 -0
- package/skills/building/resources/plan.md +98 -0
- package/skills/building/resources/retro-research.md +60 -0
- package/skills/building/resources/retro-scan.md +49 -0
- package/skills/building/resources/retro.md +225 -0
- package/skills/building/resources/rounds.md +78 -0
- package/skills/building/resources/stop.md +127 -0
- package/skills/orient/SKILL.md +37 -37
- package/skills/qa-edge-hunter/SKILL.md +29 -14
- package/skills/shapeup/SKILL.md +5 -5
- package/skills/shapeup/resources/breadboarding.md +1 -1
- package/skills/shapeup/resources/context-compaction.md +5 -5
- package/skills/shapeup/resources/shaping.md +1 -1
- package/skills/spec-evaluator/SKILL.md +17 -21
- package/skills/spec-evaluator/references/dimension-contract.md +1 -1
- package/skills/spec-evaluator/references/dimensions/completeness.md +3 -3
- package/skills/spec-evaluator/references/dimensions/spec-conformance.md +1 -1
- package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +5 -5
- package/skills/task-executor/SKILL.md +11 -15
- package/commands/hill.md +0 -10
- package/hooks/gate-intake.mjs +0 -109
- package/hooks/gate-zerowork.mjs +0 -349
- package/hooks/tier-guard.mjs +0 -162
- package/kernel/compile.mjs +0 -1419
- package/kernel/init/fit.mjs +0 -199
- package/kernel/init/run-args.mjs +0 -206
- package/kernel/lib/breadboard.mjs +0 -165
- package/kernel/probe/attempts.mjs +0 -161
- package/kernel/probe/concurrency.mjs +0 -535
- package/kernel/probe/eval.mjs +0 -405
- package/kernel/probe/hunt.mjs +0 -104
- package/kernel/probe/leg.mjs +0 -229
- package/kernel/probe/owner.mjs +0 -142
- package/kernel/probe/requirements.mjs +0 -328
- package/kernel/probe/resume.mjs +0 -1110
- package/kernel/probe/rounds.mjs +0 -115
- package/kernel/probe/staged.mjs +0 -83
- package/kernel/probe/stats.mjs +0 -477
- package/kernel/probe/t0.mjs +0 -115
- package/kernel/reduce/board.mjs +0 -350
- package/kernel/reduce/graph.mjs +0 -482
- package/kernel/reduce/hill.mjs +0 -322
- package/kernel/reduce/ingest.mjs +0 -767
- package/kernel/reduce/leftovers.mjs +0 -159
- package/kernel/reduce/ship.mjs +0 -529
- package/kernel/reduce/snapshot.mjs +0 -291
- package/kernel/reduce/verdict.mjs +0 -172
- package/kernel/report/export.mjs +0 -384
- package/kernel/report/facts.mjs +0 -234
- package/kernel/verify/budget.mjs +0 -153
- package/kernel/verify/build.mjs +0 -428
- package/kernel/verify/dispatch.mjs +0 -114
- package/kernel/verify/spec.mjs +0 -975
- package/kernel/verify/trace.mjs +0 -604
- package/skills/ba-pitch-analyzer/SKILL.md +0 -204
- package/skills/coach/SKILL.md +0 -397
- package/skills/hill-chart/SKILL.md +0 -154
- package/skills/hill-chart/assets/dashboard.template.html +0 -1432
- package/skills/scope-architect/SKILL.md +0 -174
- package/skills/scope-hammer/SKILL.md +0 -231
- package/skills/solution-architect/SKILL.md +0 -158
- package/skills/tech-lead/SKILL.md +0 -151
- package/skills/tech-lead/references/gates.md +0 -605
- package/skills/tech-lead/references/protocol.md +0 -889
- package/skills/tech-lead/references/tiny-lane.md +0 -53
- package/skills/tech-lead/workflows/shapeup-run.js +0 -2187
- package/skills/translator/SKILL.md +0 -258
- /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/contract-patterns.md +0 -0
- /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/ddd-patterns.md +0 -0
- /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/integration-analysis.md +0 -0
- /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/ux-behavior-patterns.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/api-feasibility.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/contracts/be-service.contract.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/contracts/offline-storage.contract.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/contracts/third-party-api.contract.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/context-map.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/event-choreography.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/migration-plan.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/team-handoff.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/domain-model.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/feedback.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/integration.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/task-board.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/task-spike.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/task.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/ux-behavior.tmpl.md +0 -0
|
@@ -3,61 +3,18 @@
|
|
|
3
3
|
"title": "HarnessDomain",
|
|
4
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
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;
|
|
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; T0 history and branches join on it); TASK-NNN ids are machine-local and must never be joined across machines (board regeneration joins on scope, not task id).",
|
|
7
7
|
"external": {
|
|
8
8
|
"WorkOrder": "work-order.schema.json",
|
|
9
9
|
"WorkResult": "work-result.schema.json"
|
|
10
10
|
},
|
|
11
|
-
"projection": {
|
|
12
|
-
"description": "How `kernel/reduce/graph.mjs`'s node vocabulary maps onto this catalog. The projection uses short names on purpose — a graph is read by hand — so the mapping is declared rather than inferred. A `type` of null is a KNOWN GAP: the projection emits that node and this schema has never typed it. The structural suite asserts this map is TOTAL against the node types the projection actually emits, so a new node type cannot appear without either a type or an explicit gap.",
|
|
13
|
-
"nodes": {
|
|
14
|
-
"Run": {
|
|
15
|
-
"type": null,
|
|
16
|
-
"gap": "the run receipt's own record — emitted by reduce graph, never typed here"
|
|
17
|
-
},
|
|
18
|
-
"Order": {
|
|
19
|
-
"type": "WorkOrder",
|
|
20
|
-
"external": true
|
|
21
|
-
},
|
|
22
|
-
"Result": {
|
|
23
|
-
"type": "WorkResult",
|
|
24
|
-
"external": true
|
|
25
|
-
},
|
|
26
|
-
"Verdict": {
|
|
27
|
-
"type": "Verdict"
|
|
28
|
-
},
|
|
29
|
-
"Trial": {
|
|
30
|
-
"type": "TrialRow"
|
|
31
|
-
},
|
|
32
|
-
"GateDecision": {
|
|
33
|
-
"type": null,
|
|
34
|
-
"gap": "a gate decision row — emitted by reduce graph, never typed here"
|
|
35
|
-
},
|
|
36
|
-
"Leg": {
|
|
37
|
-
"type": null,
|
|
38
|
-
"gap": "a leg-completion row (reduce ingest's record that a result was applied) — emitted by reduce graph, never typed here"
|
|
39
|
-
},
|
|
40
|
-
"Scope": {
|
|
41
|
-
"type": "ScopeContract"
|
|
42
|
-
},
|
|
43
|
-
"UseCase": {
|
|
44
|
-
"type": "UseCase"
|
|
45
|
-
},
|
|
46
|
-
"Requirement": {
|
|
47
|
-
"type": "RequirementClause"
|
|
48
|
-
},
|
|
49
|
-
"Seam": {
|
|
50
|
-
"type": "Seam"
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
11
|
"relationships": [
|
|
55
12
|
{
|
|
56
13
|
"from": "WorkOrder",
|
|
57
14
|
"to": "WorkResult",
|
|
58
15
|
"cardinality": "1:1",
|
|
59
16
|
"via": "order_id",
|
|
60
|
-
"note": "the envelope port —
|
|
17
|
+
"note": "the envelope port — the loop writes, the worker answers, the loop applies"
|
|
61
18
|
},
|
|
62
19
|
{
|
|
63
20
|
"from": "WorkOrder",
|
|
@@ -71,7 +28,7 @@
|
|
|
71
28
|
"to": "TaskRef",
|
|
72
29
|
"cardinality": "1:N",
|
|
73
30
|
"via": "payload.tasks[]",
|
|
74
|
-
"note": "
|
|
31
|
+
"note": "read from the LOCAL board by the loop, never by the worker"
|
|
75
32
|
},
|
|
76
33
|
{
|
|
77
34
|
"from": "TaskRef",
|
|
@@ -85,7 +42,7 @@
|
|
|
85
42
|
"to": "RequirementClause",
|
|
86
43
|
"cardinality": "N:0..N",
|
|
87
44
|
"via": "acceptance_criteria[].covers[]",
|
|
88
|
-
"note": "the covers-closure anchor — same sanctioned LOCAL→SHARED direction as use_case_refs.
|
|
45
|
+
"note": "the covers-closure anchor — same sanctioned LOCAL→SHARED direction as use_case_refs. the planning read-back 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"
|
|
89
46
|
},
|
|
90
47
|
{
|
|
91
48
|
"from": "CriterionVerdict",
|
|
@@ -106,14 +63,14 @@
|
|
|
106
63
|
"to": "UseCase",
|
|
107
64
|
"cardinality": "1:N",
|
|
108
65
|
"via": "entries[].use_case",
|
|
109
|
-
"note": "
|
|
66
|
+
"note": "wiring map: per UC engine → wiring seam → entry-point call site → player-visible affordance, read by the scopes substep and the evaluator"
|
|
110
67
|
},
|
|
111
68
|
{
|
|
112
69
|
"from": "WiringMap",
|
|
113
70
|
"to": "ProjectProfile",
|
|
114
71
|
"cardinality": "N:1",
|
|
115
72
|
"via": "entry_point resolution",
|
|
116
|
-
"note": "
|
|
73
|
+
"note": "the wire step resolves entry_point from the profile (archetype-specific: main.js for a game is not the seam for a web-service) — never hardcoded"
|
|
117
74
|
},
|
|
118
75
|
{
|
|
119
76
|
"from": "WorkOrder",
|
|
@@ -146,14 +103,14 @@
|
|
|
146
103
|
"to": "TaskRef",
|
|
147
104
|
"cardinality": "N:1",
|
|
148
105
|
"via": "task_id",
|
|
149
|
-
"note": "
|
|
106
|
+
"note": "the loop ticks AC boxes, flips frontmatter status, appends the Execution Log"
|
|
150
107
|
},
|
|
151
108
|
{
|
|
152
109
|
"from": "WorkResult",
|
|
153
110
|
"to": "Discovery",
|
|
154
111
|
"cardinality": "1:N",
|
|
155
112
|
"via": "discoveries[]",
|
|
156
|
-
"note": "
|
|
113
|
+
"note": "the loop appends to discovery/ledger.md — three producers (executor +, QA ~, planner overflow), zero direct writers"
|
|
157
114
|
},
|
|
158
115
|
{
|
|
159
116
|
"from": "WorkResult",
|
|
@@ -167,14 +124,14 @@
|
|
|
167
124
|
"to": "CriterionVerdict",
|
|
168
125
|
"cardinality": "1:N",
|
|
169
126
|
"via": "criteria[]",
|
|
170
|
-
"note": "
|
|
127
|
+
"note": "the loop appends to evaluation/.verdicts-<target>.jsonl (append-only; flips force confidence low)"
|
|
171
128
|
},
|
|
172
129
|
{
|
|
173
130
|
"from": "Verdict",
|
|
174
131
|
"to": "RefutedAc",
|
|
175
132
|
"cardinality": "1:N",
|
|
176
133
|
"via": "refuted[]",
|
|
177
|
-
"note": "
|
|
134
|
+
"note": "the loop un-ticks the AC box and stamps eval_verdict: fail"
|
|
178
135
|
},
|
|
179
136
|
{
|
|
180
137
|
"from": "Verdict",
|
|
@@ -231,13 +188,6 @@
|
|
|
231
188
|
"cardinality": "1:N",
|
|
232
189
|
"via": "scope_id, one per attempt"
|
|
233
190
|
},
|
|
234
|
-
{
|
|
235
|
-
"from": "ScopeContract",
|
|
236
|
-
"to": "HillShard",
|
|
237
|
-
"cardinality": "1:0..1",
|
|
238
|
-
"via": "scope_id",
|
|
239
|
-
"note": "phase derived from T0/T1 facts, never authored"
|
|
240
|
-
},
|
|
241
191
|
{
|
|
242
192
|
"from": "ScopeContract",
|
|
243
193
|
"to": "ScopeContract",
|
|
@@ -285,35 +235,7 @@
|
|
|
285
235
|
"to": "Seam",
|
|
286
236
|
"cardinality": "1:N",
|
|
287
237
|
"via": "wiring-map entries[].wiring_seam",
|
|
288
|
-
"note": "
|
|
289
|
-
},
|
|
290
|
-
{
|
|
291
|
-
"from": "RoundBuildVerdict",
|
|
292
|
-
"to": "ProjectProfile",
|
|
293
|
-
"cardinality": "N:1",
|
|
294
|
-
"via": "build_probe + launch_probe",
|
|
295
|
-
"note": "the gate runs the probes the profile declares; run_cmd comes from the run ledger"
|
|
296
|
-
},
|
|
297
|
-
{
|
|
298
|
-
"from": "RoundBuildVerdict",
|
|
299
|
-
"to": "AegisTriple",
|
|
300
|
-
"cardinality": "1:N",
|
|
301
|
-
"via": "discovered_tasks[]",
|
|
302
|
-
"note": "a red gate's output, digested — surfaces as payload.bugs on the next round's orders"
|
|
303
|
-
},
|
|
304
|
-
{
|
|
305
|
-
"from": "WorkOrder",
|
|
306
|
-
"to": "RoundBuildVerdict",
|
|
307
|
-
"cardinality": "N:1",
|
|
308
|
-
"via": "payload.build_gate",
|
|
309
|
-
"note": "an evaluate order names this run's newest gate artifact for its round, green or red, so the judge knows the build ran and the app launched before grading a [ui] row; payload.launch_cmd carries the profile's launch_probe beside it"
|
|
310
|
-
},
|
|
311
|
-
{
|
|
312
|
-
"from": "RoundBuildVerdict",
|
|
313
|
-
"to": "HillShard",
|
|
314
|
-
"cardinality": "1:N",
|
|
315
|
-
"via": "round",
|
|
316
|
-
"note": "a red gate withholds DOWNHILL_EXECUTION from every T0-green verdict of that round"
|
|
238
|
+
"note": "a use case depends on the seam its engine attaches through: the `wiring_seam` cell of its wiring-map row"
|
|
317
239
|
}
|
|
318
240
|
]
|
|
319
241
|
},
|
|
@@ -330,31 +252,6 @@
|
|
|
330
252
|
"constraints",
|
|
331
253
|
"bugs"
|
|
332
254
|
],
|
|
333
|
-
"ba-pitch-analyzer": [
|
|
334
|
-
"pitch",
|
|
335
|
-
"breadboard",
|
|
336
|
-
"lens",
|
|
337
|
-
"orient_dir",
|
|
338
|
-
"spec_folder",
|
|
339
|
-
"feature",
|
|
340
|
-
"discovered_ledger",
|
|
341
|
-
"requirements",
|
|
342
|
-
"kb_rules_path"
|
|
343
|
-
],
|
|
344
|
-
"scope-architect": [
|
|
345
|
-
"feature",
|
|
346
|
-
"spec_folder",
|
|
347
|
-
"tasks",
|
|
348
|
-
"breadboard",
|
|
349
|
-
"kb_rules_path"
|
|
350
|
-
],
|
|
351
|
-
"solution-architect": [
|
|
352
|
-
"feature",
|
|
353
|
-
"spec_folder",
|
|
354
|
-
"project_profile",
|
|
355
|
-
"breadboard",
|
|
356
|
-
"kb_rules_path"
|
|
357
|
-
],
|
|
358
255
|
"spec-evaluator": [
|
|
359
256
|
"spec_folder",
|
|
360
257
|
"feature",
|
|
@@ -386,19 +283,12 @@
|
|
|
386
283
|
"ledger",
|
|
387
284
|
"kb_rules_path"
|
|
388
285
|
],
|
|
389
|
-
"
|
|
390
|
-
"intake",
|
|
391
|
-
"glossary"
|
|
392
|
-
],
|
|
393
|
-
"scope-hammer": [
|
|
286
|
+
"building": [
|
|
394
287
|
"feature",
|
|
395
|
-
"
|
|
396
|
-
"
|
|
397
|
-
"
|
|
398
|
-
|
|
399
|
-
"coach": [
|
|
400
|
-
"feedback",
|
|
401
|
-
"stack"
|
|
288
|
+
"spec_folder",
|
|
289
|
+
"step",
|
|
290
|
+
"mode",
|
|
291
|
+
"kb_rules_paths"
|
|
402
292
|
]
|
|
403
293
|
},
|
|
404
294
|
"x-result-by-worker": {
|
|
@@ -418,25 +308,6 @@
|
|
|
418
308
|
"assumptions",
|
|
419
309
|
"deviations"
|
|
420
310
|
],
|
|
421
|
-
"ba-pitch-analyzer": [
|
|
422
|
-
"discoveries",
|
|
423
|
-
"files_touched",
|
|
424
|
-
"artifacts",
|
|
425
|
-
"assumptions",
|
|
426
|
-
"deviations"
|
|
427
|
-
],
|
|
428
|
-
"scope-architect": [
|
|
429
|
-
"files_touched",
|
|
430
|
-
"artifacts",
|
|
431
|
-
"assumptions",
|
|
432
|
-
"deviations"
|
|
433
|
-
],
|
|
434
|
-
"solution-architect": [
|
|
435
|
-
"files_touched",
|
|
436
|
-
"artifacts",
|
|
437
|
-
"assumptions",
|
|
438
|
-
"deviations"
|
|
439
|
-
],
|
|
440
311
|
"orient": [
|
|
441
312
|
"files_touched",
|
|
442
313
|
"artifacts",
|
|
@@ -450,69 +321,39 @@
|
|
|
450
321
|
"assumptions",
|
|
451
322
|
"deviations"
|
|
452
323
|
],
|
|
453
|
-
"
|
|
454
|
-
"files_touched",
|
|
455
|
-
"artifacts",
|
|
456
|
-
"assumptions",
|
|
457
|
-
"deviations"
|
|
458
|
-
],
|
|
459
|
-
"scope-hammer": [
|
|
460
|
-
"files_touched",
|
|
461
|
-
"artifacts",
|
|
462
|
-
"assumptions",
|
|
463
|
-
"deviations"
|
|
464
|
-
],
|
|
465
|
-
"coach": [
|
|
466
|
-
"files_touched",
|
|
324
|
+
"building": [
|
|
467
325
|
"artifacts",
|
|
468
|
-
"assumptions",
|
|
469
326
|
"deviations"
|
|
470
327
|
]
|
|
471
328
|
},
|
|
472
329
|
"$defs": {
|
|
473
330
|
"WorkerName": {
|
|
474
|
-
"description": "The complete worker roster — the only skills a
|
|
331
|
+
"description": "The complete worker roster — the only skills a dispatch may be addressed to. building (the loop) and shapeup are deliberately absent (the orchestrator and PO-personal shaping are not workers); the loop appears in an order only as the `worker` of a fence-only `plan` order, which the order schema accepts beside this roster.",
|
|
475
332
|
"type": "string",
|
|
476
333
|
"enum": [
|
|
477
334
|
"task-executor",
|
|
478
335
|
"spec-evaluator",
|
|
479
|
-
"ba-pitch-analyzer",
|
|
480
|
-
"scope-architect",
|
|
481
|
-
"solution-architect",
|
|
482
336
|
"orient",
|
|
483
|
-
"qa-edge-hunter"
|
|
484
|
-
"translator",
|
|
485
|
-
"scope-hammer",
|
|
486
|
-
"coach"
|
|
337
|
+
"qa-edge-hunter"
|
|
487
338
|
]
|
|
488
339
|
},
|
|
489
340
|
"Operation": {
|
|
490
|
-
"description": "The full operation vocabulary. Replaces lifecycle flags (--tasks-only, --from-discovered, --map-scopes …): the caller knows the pipeline position; the worker never re-derives it. Ownership: execute/fix/spike = task-executor ·
|
|
341
|
+
"description": "The full operation vocabulary. Replaces lifecycle flags (--tasks-only, --from-discovered, --map-scopes …): the caller knows the pipeline position; the worker never re-derives it. Ownership: execute/fix/spike = task-executor · plan = the loop itself, a fence-only order no sub-agent answers (one per planning substep: requirements, spec, wire, scopes) · evaluate = spec-evaluator · orient = orient · hunt = qa-edge-hunter. The stop census, the retro and the intake's language gate are the loop's own acts and carry no order at all.",
|
|
491
342
|
"type": "string",
|
|
492
343
|
"enum": [
|
|
493
344
|
"execute",
|
|
494
345
|
"fix",
|
|
495
346
|
"spike",
|
|
496
|
-
"analyze", "board",
|
|
497
|
-
"reconcile",
|
|
498
|
-
"retrofit-surface",
|
|
499
|
-
"coverage",
|
|
500
|
-
"map-scopes",
|
|
501
|
-
"wire",
|
|
502
347
|
"evaluate",
|
|
503
348
|
"orient",
|
|
504
349
|
"hunt",
|
|
505
|
-
"
|
|
506
|
-
"hammer",
|
|
507
|
-
"coach",
|
|
508
|
-
"scan",
|
|
509
|
-
"research"
|
|
350
|
+
"plan"
|
|
510
351
|
]
|
|
511
352
|
},
|
|
512
353
|
"Substrate": {
|
|
513
|
-
"description": "The write contract of one order — mode/flag differences ARE write-contract differences (one whitelist template per operation,
|
|
354
|
+
"description": "The write contract of one order — mode/flag differences ARE write-contract differences (one whitelist template per operation, the loop substrateFor()). Enforced mechanically by the sandbox hook; a worker needing a file outside it must ESCALATE (substrate-expansion), never write.",
|
|
514
355
|
"x-tier": "EMBEDDED",
|
|
515
|
-
"x-writer": "
|
|
356
|
+
"x-writer": "the loop (templates in its orders resource) / the loop's plan activity, scopes substep (per-scope globs)",
|
|
516
357
|
"type": "object",
|
|
517
358
|
"properties": {
|
|
518
359
|
"allowed": {
|
|
@@ -548,7 +389,7 @@
|
|
|
548
389
|
"items": {
|
|
549
390
|
"type": "string"
|
|
550
391
|
},
|
|
551
|
-
"description": "Paths this order may write DESPITE a broader freeze — the
|
|
392
|
+
"description": "Paths this order may write DESPITE a broader freeze — the loop's grant, derived from the order's own identity and never requested by a worker. For a build leg: its own WorkResult (no sibling's — a leg that can write another's can report work nobody did), its task files, the discovery ledger, its spikes. Checked BEFORE `frozen`, and only against the contract that declared it, so another live order's exception never licenses this write."
|
|
552
393
|
}
|
|
553
394
|
}
|
|
554
395
|
},
|
|
@@ -568,9 +409,9 @@
|
|
|
568
409
|
}
|
|
569
410
|
},
|
|
570
411
|
"TaskRef": {
|
|
571
|
-
"description": "One task as carried inside a WorkOrder — parsed from the LOCAL board file (.shapeup/<slug>/tasks/TASK-*.md frontmatter + AC checkboxes) by
|
|
412
|
+
"description": "One task as carried inside a WorkOrder — parsed from the LOCAL board file (.shapeup/<slug>/tasks/TASK-*.md frontmatter + AC checkboxes) by the loop parseTaskFile(). NOTE: task ids are machine-local (boards regenerate and renumber); never join on id across machines — the scope is the stable key.",
|
|
572
413
|
"x-tier": "EMBEDDED",
|
|
573
|
-
"x-writer": "
|
|
414
|
+
"x-writer": "the loop (from the board the plan activity generated)",
|
|
574
415
|
"type": "object",
|
|
575
416
|
"required": [
|
|
576
417
|
"id"
|
|
@@ -589,7 +430,7 @@
|
|
|
589
430
|
},
|
|
590
431
|
"acceptance_criteria": {
|
|
591
432
|
"type": "array",
|
|
592
|
-
"description": "The AC checkbox texts, verbatim —
|
|
433
|
+
"description": "The AC checkbox texts, verbatim — the loop 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 the loop's substring tick-back (AcResult.ac) is untouched; `covers[]` is the LOCAL→SHARED anchor the planning read-back reads for covers-closure. A pre-covers board keeps parsing as string[] (the ✦ non-regression invariant).",
|
|
593
434
|
"items": {
|
|
594
435
|
"anyOf": [
|
|
595
436
|
{
|
|
@@ -611,7 +452,7 @@
|
|
|
611
452
|
"type": "string",
|
|
612
453
|
"pattern": "^REQ-[0-9]+$"
|
|
613
454
|
},
|
|
614
|
-
"description": "REQ-ids this AC covers — resolved against the SHARED requirements registry by
|
|
455
|
+
"description": "REQ-ids this AC covers — resolved against the SHARED requirements registry by the planning read-back."
|
|
615
456
|
}
|
|
616
457
|
}
|
|
617
458
|
}
|
|
@@ -631,7 +472,7 @@
|
|
|
631
472
|
"items": {
|
|
632
473
|
"type": "string"
|
|
633
474
|
},
|
|
634
|
-
"description": "Explicit dependencies. The inverse (unlocks) is ALWAYS derived by
|
|
475
|
+
"description": "Explicit dependencies. The inverse (unlocks) is ALWAYS derived by the loop, never hand-authored — hand-authored inverses drift asymmetric, observed repeatedly."
|
|
635
476
|
},
|
|
636
477
|
"use_case_refs": {
|
|
637
478
|
"type": "array",
|
|
@@ -642,7 +483,7 @@
|
|
|
642
483
|
},
|
|
643
484
|
"scope_id": {
|
|
644
485
|
"type": "string",
|
|
645
|
-
"description": "OPTIONAL: the scope that builds this task. The DISAMBIGUATOR, not the primary link — dispatch normally derives a scope's tasks by intersecting the contract's use_cases[] with this task's use_case_refs[], and that is a partition only while each scope owns its own use cases. When several scopes implement one use case (a four-scope, one-UC cut is ordinary) the UC anchor cannot say who builds what and every scope claims every task;
|
|
486
|
+
"description": "OPTIONAL: the scope that builds this task. The DISAMBIGUATOR, not the primary link — dispatch normally derives a scope's tasks by intersecting the contract's use_cases[] with this task's use_case_refs[], and that is a partition only while each scope owns its own use cases. When several scopes implement one use case (a four-scope, one-UC cut is ordinary) the UC anchor cannot say who builds what and every scope claims every task; the planning read-back reds that, and this field resolves it. Same sanctioned LOCAL→SHARED direction as use_case_refs: the volatile board names the stable scope_id, never the reverse."
|
|
646
487
|
}
|
|
647
488
|
}
|
|
648
489
|
},
|
|
@@ -650,7 +491,7 @@
|
|
|
650
491
|
"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.",
|
|
651
492
|
"x-tier": "EMBEDDED (projection of the SHARED round-ledger.md Decisions row)",
|
|
652
493
|
"x-location": ".shapeup/<slug>/round-ledger.md",
|
|
653
|
-
"x-writer": "
|
|
494
|
+
"x-writer": "the operator — a PO answer to a blocked worker is filed here by hand, the instant it is given; no kernel step or loop step writes this file (the loop reads it)",
|
|
654
495
|
"type": "object",
|
|
655
496
|
"required": [
|
|
656
497
|
"id",
|
|
@@ -668,9 +509,9 @@
|
|
|
668
509
|
}
|
|
669
510
|
},
|
|
670
511
|
"AegisTriple": {
|
|
671
|
-
"description": "One digested failure —
|
|
512
|
+
"description": "One digested failure — the failure digester 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).",
|
|
672
513
|
"x-tier": "EMBEDDED",
|
|
673
|
-
"x-writer": "harness
|
|
514
|
+
"x-writer": "the failure digester, called by harness verify t0 (regex pass only)",
|
|
674
515
|
"type": "object",
|
|
675
516
|
"properties": {
|
|
676
517
|
"file": {
|
|
@@ -762,8 +603,8 @@
|
|
|
762
603
|
"description": "One use case — the STABLE anchor both tiers name, and the only identifier the scope↔task relation is re-derived through. A UC id is assigned once and frozen: it behaves like scope_id and REQ-id, never like TASK-NNN. Referenced three ways across the tree (`UC-x`, `[[UC-x]]`, `[[usecases/UC-x]]`); `kernel/lib/contract.mjs` ucId() is the single normaliser, and both sides of any join must pass through it or they disagree about a UC they both hold.",
|
|
763
604
|
"x-tier": "SHARED",
|
|
764
605
|
"x-location": "shapeup/<slug>/spec/usecases/UC-*.md",
|
|
765
|
-
"x-writer": "
|
|
766
|
-
"x-readers": "
|
|
606
|
+
"x-writer": "the loop's plan activity, spec substep (a reconcile pass MAY append, never renumber)",
|
|
607
|
+
"x-readers": "the plan activity (scopes: use_cases[]; wire: wiring-map entries), spec-evaluator (the grading criterion), the loop's planning read-back (SCOPE-ANCHOR + UC-ANCHOR)",
|
|
767
608
|
"type": "object",
|
|
768
609
|
"required": [
|
|
769
610
|
"id"
|
|
@@ -787,11 +628,11 @@
|
|
|
787
628
|
}
|
|
788
629
|
},
|
|
789
630
|
"ScopeContract": {
|
|
790
|
-
"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
|
|
631
|
+
"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: 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. `kernel/lib/contract.mjs` is the only reader/writer of the file form; everything downstream of that parse sees exactly this shape.",
|
|
791
632
|
"x-tier": "SHARED",
|
|
792
633
|
"x-location": "shapeup/<slug>/scopes/<scope-id>.md",
|
|
793
|
-
"x-writer": "
|
|
794
|
-
"x-readers": "
|
|
634
|
+
"x-writer": "the loop's plan activity, scopes substep (SOLE writer — a hand-edit anywhere else is a defect)",
|
|
635
|
+
"x-readers": "the loop, sandbox-guard hook, harness verify t0, the loop's planning read-back, spec-evaluator, the stop census, the loop",
|
|
795
636
|
"type": "object",
|
|
796
637
|
"required": [
|
|
797
638
|
"scope_id"
|
|
@@ -815,7 +656,7 @@
|
|
|
815
656
|
"items": {
|
|
816
657
|
"type": "string"
|
|
817
658
|
},
|
|
818
|
-
"description": "The COMMITTED use cases this scope implements (`UC-*`, resolving to spec/usecases/UC-*.md) — the scope's anchor into the spec and the join the scope↔task relation is re-derived through. Mirrors the board's own `use_case_refs` in the sanctioned LOCAL→SHARED direction. This REPLACES the former `tasks[]` id list: a contract is committed and a board is not, so naming task ids put a pointer into a gitignored, per-machine tier that resolved to nothing on every other clone without a single check going red.
|
|
659
|
+
"description": "The COMMITTED use cases this scope implements (`UC-*`, resolving to spec/usecases/UC-*.md) — the scope's anchor into the spec and the join the scope↔task relation is re-derived through. Mirrors the board's own `use_case_refs` in the sanctioned LOCAL→SHARED direction. This REPLACES the former `tasks[]` id list: a contract is committed and a board is not, so naming task ids put a pointer into a gitignored, per-machine tier that resolved to nothing on every other clone without a single check going red. the planning read-back reds an empty or unresolvable anchor."
|
|
819
660
|
},
|
|
820
661
|
"covers": {
|
|
821
662
|
"type": "array",
|
|
@@ -843,7 +684,7 @@
|
|
|
843
684
|
"items": {
|
|
844
685
|
"type": "string"
|
|
845
686
|
},
|
|
846
|
-
"description": "Files ≥2 scopes both touch — must be declared in BOTH scopes' lists (
|
|
687
|
+
"description": "Files ≥2 scopes both touch — must be declared in BOTH scopes' lists (the DISJOINT rule); declaring one costs concurrency, since two scopes that share a path build one at a time."
|
|
847
688
|
},
|
|
848
689
|
"affordance_manifest": {
|
|
849
690
|
"type": "array",
|
|
@@ -882,15 +723,15 @@
|
|
|
882
723
|
},
|
|
883
724
|
"business_goal": {
|
|
884
725
|
"type": "string",
|
|
885
|
-
"description": "What a user can do when this scope ships — the must-have trace
|
|
726
|
+
"description": "What a user can do when this scope ships — the must-have trace the stop census checks against."
|
|
886
727
|
}
|
|
887
728
|
}
|
|
888
729
|
},
|
|
889
730
|
"ScopeBoard": {
|
|
890
|
-
"description": "The scope board — a HUMAN-READABLE PROJECTION of the contracts, not a source. Every column restates something `scopes/*.md` already declares, so it can be regenerated from them and deleting it loses nothing. It deliberately carries no `wave` column: waves are Kahn levels of `depends_on` and
|
|
731
|
+
"description": "The scope board — a HUMAN-READABLE PROJECTION of the contracts, not a source. Every column restates something `scopes/*.md` already declares, so it can be regenerated from them and deleting it loses nothing. It deliberately carries no `wave` column: waves are Kahn levels of `depends_on` and the loop derives them, and a hand-authored copy of a derived value is the same defect as the hand-authored `unlocks` that `deriveUnlocks` exists to prevent. Nothing parses this file — that is only safe while it stays a view; the moment it holds a fact of its own it needs a reader and a lint like every other contract.",
|
|
891
732
|
"x-tier": "SHARED",
|
|
892
733
|
"x-location": "shapeup/<slug>/scope-board.md",
|
|
893
|
-
"x-writer": "
|
|
734
|
+
"x-writer": "the loop's plan activity, scopes substep (regenerated whenever the contracts change)",
|
|
894
735
|
"x-readers": "humans, in a pull request. No code reads it — by design.",
|
|
895
736
|
"type": "object",
|
|
896
737
|
"properties": {
|
|
@@ -904,7 +745,7 @@
|
|
|
904
745
|
}
|
|
905
746
|
},
|
|
906
747
|
"AcResult": {
|
|
907
|
-
"description": "One acceptance criterion's outcome with evidence. 'ac' carries the checkbox text VERBATIM —
|
|
748
|
+
"description": "One acceptance criterion's outcome with evidence. 'ac' carries the checkbox text VERBATIM — the loop ticks boxes by substring-matching it. No recorded evidence = the worker reports fail by its own hand.",
|
|
908
749
|
"x-tier": "EMBEDDED",
|
|
909
750
|
"type": "object",
|
|
910
751
|
"required": [
|
|
@@ -931,7 +772,7 @@
|
|
|
931
772
|
}
|
|
932
773
|
},
|
|
933
774
|
"TaskResult": {
|
|
934
|
-
"description": "Per-task outcome inside a WorkResult.
|
|
775
|
+
"description": "Per-task outcome inside a WorkResult. the loop 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.",
|
|
935
776
|
"x-tier": "EMBEDDED",
|
|
936
777
|
"type": "object",
|
|
937
778
|
"required": [
|
|
@@ -988,11 +829,11 @@
|
|
|
988
829
|
}
|
|
989
830
|
},
|
|
990
831
|
"Discovery": {
|
|
991
|
-
"description": "The universal currency of surprise: one raw discovered line. Producers: task-executor (marker +, P3.7), qa-edge-hunter (always ~, repro required),
|
|
832
|
+
"description": "The universal currency of surprise: one raw discovered line. Producers: task-executor (marker +, P3.7), qa-edge-hunter (always ~, repro required), the plan activity (overflow reports). NO producer writes the ledger — the loop appends every entry to discovery/ledger.md (single-writer, mechanically). Promotion ~ → must-have is always a human act at SHIP S.0/GATE H.",
|
|
992
833
|
"x-tier": "EMBEDDED (projection into the LOCAL discovery ledger)",
|
|
993
834
|
"x-location": ".shapeup/<slug>/discovery/ledger.md",
|
|
994
|
-
"x-writer": "
|
|
995
|
-
"x-readers": "
|
|
835
|
+
"x-writer": "the loop",
|
|
836
|
+
"x-readers": "the plan activity (spec reconcile mode, scopes), the stop census, qa-edge-hunter (covered-territory context)",
|
|
996
837
|
"type": "object",
|
|
997
838
|
"required": [
|
|
998
839
|
"marker",
|
|
@@ -1037,7 +878,7 @@
|
|
|
1037
878
|
"type": "string",
|
|
1038
879
|
"pattern": "^REQ-[0-9]+$"
|
|
1039
880
|
},
|
|
1040
|
-
"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;
|
|
881
|
+
"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; `verify spec` only checks the id resolves in the registry."
|
|
1041
882
|
}
|
|
1042
883
|
}
|
|
1043
884
|
},
|
|
@@ -1111,7 +952,7 @@
|
|
|
1111
952
|
"type": "string",
|
|
1112
953
|
"pattern": "^REQ-[0-9]+$"
|
|
1113
954
|
},
|
|
1114
|
-
"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;
|
|
955
|
+
"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; the planning read-back only checks each id resolves in the registry. Navigation aid, never a grading input."
|
|
1115
956
|
}
|
|
1116
957
|
}
|
|
1117
958
|
},
|
|
@@ -1152,7 +993,7 @@
|
|
|
1152
993
|
"evidence": {
|
|
1153
994
|
"type": "string",
|
|
1154
995
|
"pattern": "[\\w./\\-]+:[0-9]+",
|
|
1155
|
-
"description": "A FAIL must carry a file:line locator. The rule used to live in prose and be enforced nowhere — a correct FAIL verdict with no locator anywhere is unactionable without re-investigating (observed, not theorized). Now mechanical: the
|
|
996
|
+
"description": "A FAIL must carry a file:line locator. The rule used to live in prose and be enforced nowhere — a correct FAIL verdict with no locator anywhere is unactionable without re-investigating (observed, not theorized). Now mechanical: the loop's result check rejects it before it applies the result."
|
|
1156
997
|
},
|
|
1157
998
|
"traces_to": {
|
|
1158
999
|
"type": "array",
|
|
@@ -1160,14 +1001,14 @@
|
|
|
1160
1001
|
"type": "string",
|
|
1161
1002
|
"pattern": "^REQ-[0-9]+$"
|
|
1162
1003
|
},
|
|
1163
|
-
"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;
|
|
1004
|
+
"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; the planning read-back only checks each id resolves in the registry. Navigation aid, never a grading input."
|
|
1164
1005
|
}
|
|
1165
1006
|
}
|
|
1166
1007
|
}
|
|
1167
1008
|
]
|
|
1168
1009
|
},
|
|
1169
1010
|
"RefutedAc": {
|
|
1170
|
-
"description": "An AC box the judge's evidence disproves. Un-ticking is
|
|
1011
|
+
"description": "An AC box the judge's evidence disproves. Un-ticking is the loop's act (the judge never touches a task file): the loop un-ticks the box and stamps eval_verdict: fail + eval_at on the task frontmatter.",
|
|
1171
1012
|
"x-tier": "EMBEDDED",
|
|
1172
1013
|
"type": "object",
|
|
1173
1014
|
"required": [
|
|
@@ -1258,7 +1099,7 @@
|
|
|
1258
1099
|
"x-tier": "LOCAL",
|
|
1259
1100
|
"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)",
|
|
1260
1101
|
"x-writer": "harness verify t0",
|
|
1261
|
-
"x-readers": "
|
|
1102
|
+
"x-readers": "the loop (next attempt), spec-evaluator (citation), the stop census (stall census)",
|
|
1262
1103
|
"type": "object",
|
|
1263
1104
|
"properties": {
|
|
1264
1105
|
"schema_version": {
|
|
@@ -1374,11 +1215,11 @@
|
|
|
1374
1215
|
]
|
|
1375
1216
|
},
|
|
1376
1217
|
"TrialRow": {
|
|
1377
|
-
"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
|
|
1218
|
+
"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 the loop: 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.",
|
|
1378
1219
|
"x-tier": "LOCAL",
|
|
1379
1220
|
"x-location": ".shapeup/<slug>/t0/trials.jsonl",
|
|
1380
1221
|
"x-writer": "harness verify t0 (append-only)",
|
|
1381
|
-
"x-readers": "
|
|
1222
|
+
"x-readers": "the loop (payload.trial_history — the paper's inspect()), the loop (the ratchet block of the ship report: improvement_rate, monotone_rate, sawtooth_count)",
|
|
1382
1223
|
"type": "object",
|
|
1383
1224
|
"properties": {
|
|
1384
1225
|
"schema_version": {
|
|
@@ -1465,122 +1306,12 @@
|
|
|
1465
1306
|
"status"
|
|
1466
1307
|
]
|
|
1467
1308
|
},
|
|
1468
|
-
"RoundBuildVerdict": {
|
|
1469
|
-
"description": "The round build gate's verdict — did the FEATURE build and launch this round, measured before the judge is asked. A T0Artifact is one scope's fixtures inside its own substrate; this is the whole feature's run_cmd (from the run ledger), then the profile's build_probe and launch_probe, run in that order and stopping at the first failure. Zero LLM tokens. Two readers act on it: reduce hill withholds DOWNHILL_EXECUTION from every T0-green verdict of a round whose gate is red (a green fixture in a round the app did not compile is evidence about the fixture, not the scope), and harness compile turns each failing step into a `bug` for the next round's fix orders, addressed by the files the tool's output names. Immutable per gate run (`wx`, next ordinal); readers take the latest artifact for a round.",
|
|
1470
|
-
"x-tier": "LOCAL",
|
|
1471
|
-
"x-location": ".shapeup/<slug>/build/r<N>-t<T>.json",
|
|
1472
|
-
"x-writer": "harness verify build",
|
|
1473
|
-
"x-readers": "harness reduce hill (red rounds move no dot), harness compile (next round's payload.bugs), tech-lead (GATE L2 block: build gate state)",
|
|
1474
|
-
"type": "object",
|
|
1475
|
-
"required": [
|
|
1476
|
-
"schema_version",
|
|
1477
|
-
"round",
|
|
1478
|
-
"trial",
|
|
1479
|
-
"at",
|
|
1480
|
-
"overall",
|
|
1481
|
-
"steps"
|
|
1482
|
-
],
|
|
1483
|
-
"properties": {
|
|
1484
|
-
"schema_version": {
|
|
1485
|
-
"type": "integer",
|
|
1486
|
-
"enum": [
|
|
1487
|
-
1
|
|
1488
|
-
]
|
|
1489
|
-
},
|
|
1490
|
-
"round": {
|
|
1491
|
-
"type": "integer"
|
|
1492
|
-
},
|
|
1493
|
-
"trial": {
|
|
1494
|
-
"type": "integer",
|
|
1495
|
-
"description": "Ordinal of this gate run within the round — a re-run after a hand fix lands beside its predecessor, never over it."
|
|
1496
|
-
},
|
|
1497
|
-
"run_id": {
|
|
1498
|
-
"type": "string",
|
|
1499
|
-
"pattern": "^[a-z0-9][a-z0-9-]*-[0-9]{8}T[0-9]{6}Z-[0-9a-f]{8}$"
|
|
1500
|
-
},
|
|
1501
|
-
"at": {
|
|
1502
|
-
"type": "string",
|
|
1503
|
-
"description": "ISO timestamp."
|
|
1504
|
-
},
|
|
1505
|
-
"archetype": {
|
|
1506
|
-
"type": [
|
|
1507
|
-
"string",
|
|
1508
|
-
"null"
|
|
1509
|
-
],
|
|
1510
|
-
"description": "The profile's archetype, for the reader deciding whether a missing launch_probe matters."
|
|
1511
|
-
},
|
|
1512
|
-
"overall": {
|
|
1513
|
-
"type": "string",
|
|
1514
|
-
"enum": [
|
|
1515
|
-
"green",
|
|
1516
|
-
"red"
|
|
1517
|
-
]
|
|
1518
|
-
},
|
|
1519
|
-
"steps": {
|
|
1520
|
-
"type": "array",
|
|
1521
|
-
"items": {
|
|
1522
|
-
"type": "object",
|
|
1523
|
-
"properties": {
|
|
1524
|
-
"kind": {
|
|
1525
|
-
"type": "string",
|
|
1526
|
-
"enum": [
|
|
1527
|
-
"run_cmd",
|
|
1528
|
-
"build_probe",
|
|
1529
|
-
"launch_probe"
|
|
1530
|
-
]
|
|
1531
|
-
},
|
|
1532
|
-
"cmd": {
|
|
1533
|
-
"type": "string"
|
|
1534
|
-
},
|
|
1535
|
-
"exit": {
|
|
1536
|
-
"type": "integer"
|
|
1537
|
-
},
|
|
1538
|
-
"pass": {
|
|
1539
|
-
"type": "boolean"
|
|
1540
|
-
},
|
|
1541
|
-
"skipped": {
|
|
1542
|
-
"type": "boolean",
|
|
1543
|
-
"description": "true when an earlier step failed and this one was not run."
|
|
1544
|
-
},
|
|
1545
|
-
"stdout_tail": {
|
|
1546
|
-
"type": "string"
|
|
1547
|
-
},
|
|
1548
|
-
"stderr_tail": {
|
|
1549
|
-
"type": "string"
|
|
1550
|
-
},
|
|
1551
|
-
"error": {
|
|
1552
|
-
"type": "string",
|
|
1553
|
-
"description": "Spawn failure or timeout — the command did not run to completion, which is not the same fact as a non-zero exit."
|
|
1554
|
-
}
|
|
1555
|
-
},
|
|
1556
|
-
"required": [
|
|
1557
|
-
"kind",
|
|
1558
|
-
"cmd"
|
|
1559
|
-
]
|
|
1560
|
-
}
|
|
1561
|
-
},
|
|
1562
|
-
"warnings": {
|
|
1563
|
-
"type": "array",
|
|
1564
|
-
"items": {
|
|
1565
|
-
"type": "string"
|
|
1566
|
-
},
|
|
1567
|
-
"description": "What the gate could not check and why — a launch-required archetype with no launch_probe, a ledger with no run_cmd."
|
|
1568
|
-
},
|
|
1569
|
-
"discovered_tasks": {
|
|
1570
|
-
"type": "array",
|
|
1571
|
-
"items": {
|
|
1572
|
-
"$ref": "#/$defs/AegisTriple"
|
|
1573
|
-
},
|
|
1574
|
-
"description": "The failing steps' output digested; populated only on red."
|
|
1575
|
-
}
|
|
1576
|
-
}
|
|
1577
|
-
},
|
|
1578
1309
|
"VerdictLedgerLine": {
|
|
1579
1310
|
"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.",
|
|
1580
1311
|
"x-tier": "LOCAL",
|
|
1581
1312
|
"x-location": ".shapeup/<slug>/evaluation/.verdicts-<target>.jsonl",
|
|
1582
|
-
"x-writer": "
|
|
1583
|
-
"x-readers": "spec-evaluator (read-only flip detection)
|
|
1313
|
+
"x-writer": "the loop (from Verdict.criteria[])",
|
|
1314
|
+
"x-readers": "spec-evaluator (read-only flip detection)",
|
|
1584
1315
|
"type": "object",
|
|
1585
1316
|
"properties": {
|
|
1586
1317
|
"run": {
|
|
@@ -1618,34 +1349,12 @@
|
|
|
1618
1349
|
}
|
|
1619
1350
|
}
|
|
1620
1351
|
},
|
|
1621
|
-
"HillShard": {
|
|
1622
|
-
"description": "One scope's hill position — DERIVED, never self-reported: UPHILL_UNKNOWN (open unknowns > 0) → UPHILL_SOLVED (unknowns 0, no T0-green yet) → DOWNHILL_EXECUTION (≥1 T0-green from a round that built; T1 pending) → FINISHED (T1 PASS ∧ that T0-green). Single-writer = whoever holds that scope's branch. Progress is reported by hill position, never task counts.",
|
|
1623
|
-
"x-tier": "SHARED",
|
|
1624
|
-
"x-location": "shapeup/<slug>/hill/<scope-id>.yml",
|
|
1625
|
-
"x-writer": "tech-lead (GATE L2 derivation)",
|
|
1626
|
-
"x-readers": "tech-lead (GATE L3 hill report), scope-hammer (census), GATE L1b sequencing",
|
|
1627
|
-
"type": "object",
|
|
1628
|
-
"properties": {
|
|
1629
|
-
"scope_id": {
|
|
1630
|
-
"type": "string"
|
|
1631
|
-
},
|
|
1632
|
-
"phase": {
|
|
1633
|
-
"type": "string",
|
|
1634
|
-
"enum": [
|
|
1635
|
-
"UPHILL_UNKNOWN",
|
|
1636
|
-
"UPHILL_SOLVED",
|
|
1637
|
-
"DOWNHILL_EXECUTION",
|
|
1638
|
-
"FINISHED"
|
|
1639
|
-
]
|
|
1640
|
-
}
|
|
1641
|
-
}
|
|
1642
|
-
},
|
|
1643
1352
|
"MetricsRow": {
|
|
1644
1353
|
"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.",
|
|
1645
1354
|
"x-tier": "LOCAL",
|
|
1646
1355
|
"x-location": ".shapeup/metrics/<machine-id>.jsonl",
|
|
1647
|
-
"x-writer": "
|
|
1648
|
-
"x-readers": "
|
|
1356
|
+
"x-writer": "none — the ship-time harvest step retired with the run script's sequencing; rows an earlier release wrote under .shapeup/metrics/ keep this shape",
|
|
1357
|
+
"x-readers": "none",
|
|
1649
1358
|
"type": "object",
|
|
1650
1359
|
"properties": {
|
|
1651
1360
|
"schema_version": {
|
|
@@ -1656,7 +1365,7 @@
|
|
|
1656
1365
|
},
|
|
1657
1366
|
"at": {
|
|
1658
1367
|
"type": "string",
|
|
1659
|
-
"description": "OPTIONAL (v1.2) — ISO harvest timestamp; enables
|
|
1368
|
+
"description": "OPTIONAL (v1.2) — ISO harvest timestamp; enables a trend over time. Older rows lack it and fall back to shard append order."
|
|
1660
1369
|
},
|
|
1661
1370
|
"run_id": {
|
|
1662
1371
|
"type": "string",
|
|
@@ -1689,7 +1398,7 @@
|
|
|
1689
1398
|
},
|
|
1690
1399
|
"attempt_exhaustions": {
|
|
1691
1400
|
"type": "integer",
|
|
1692
|
-
"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;
|
|
1401
|
+
"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; no reader may re-derive it)."
|
|
1693
1402
|
},
|
|
1694
1403
|
"qa_findings": {
|
|
1695
1404
|
"type": "object",
|
|
@@ -1711,7 +1420,7 @@
|
|
|
1711
1420
|
},
|
|
1712
1421
|
"ratchet": {
|
|
1713
1422
|
"type": "object",
|
|
1714
|
-
"description": "OPTIONAL (v1.5) — the DAY-1 exit measurement, COPIED from
|
|
1423
|
+
"description": "OPTIONAL (v1.5) — the DAY-1 exit measurement, COPIED from the ratchet report 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.",
|
|
1715
1424
|
"properties": {
|
|
1716
1425
|
"trials": {
|
|
1717
1426
|
"type": "integer"
|
|
@@ -1742,7 +1451,7 @@
|
|
|
1742
1451
|
},
|
|
1743
1452
|
"hooks": {
|
|
1744
1453
|
"type": "object",
|
|
1745
|
-
"description": "OPTIONAL (v1.5) — the DAY-2 exit measurement, COPIED from
|
|
1454
|
+
"description": "OPTIONAL (v1.5) — the DAY-2 exit measurement, COPIED from the hook decision ledger, .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.",
|
|
1746
1455
|
"properties": {
|
|
1747
1456
|
"evaluations": {
|
|
1748
1457
|
"type": "integer"
|
|
@@ -1772,7 +1481,7 @@
|
|
|
1772
1481
|
"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).",
|
|
1773
1482
|
"x-tier": "LOCAL",
|
|
1774
1483
|
"x-location": ".shapeup/active-scope",
|
|
1775
|
-
"x-writer": "
|
|
1484
|
+
"x-writer": "harness init run (and init run --force when it reopens a closed run); never a worker",
|
|
1776
1485
|
"x-readers": "sandbox-guard hook",
|
|
1777
1486
|
"type": "object",
|
|
1778
1487
|
"properties": {
|
|
@@ -1821,364 +1530,49 @@
|
|
|
1821
1530
|
}
|
|
1822
1531
|
}
|
|
1823
1532
|
},
|
|
1824
|
-
"
|
|
1825
|
-
"description": "
|
|
1826
|
-
"x-tier": "
|
|
1827
|
-
"x-location": "
|
|
1828
|
-
"x-writer": "
|
|
1829
|
-
"x-readers": "
|
|
1533
|
+
"RequirementClause": {
|
|
1534
|
+
"description": "One atomic customer requirement, frozen with a STABLE id — the covers-closure input truth (spine v1.3). Extracted from the REQ source (pitch / customer-requirements doc / use-case bodies) by the planner — 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.",
|
|
1535
|
+
"x-tier": "SHARED",
|
|
1536
|
+
"x-location": "shapeup/<slug>/requirements.md",
|
|
1537
|
+
"x-writer": "the loop's plan activity, requirements substep — extraction only; CUT status is a PO governance edit (same class as a round-ledger Decision)",
|
|
1538
|
+
"x-readers": "the loop's planning read-back (covers-closure), the loop (the L1b REQ → AC table), human (coverage/cut audit)",
|
|
1830
1539
|
"type": "object",
|
|
1831
1540
|
"required": [
|
|
1832
|
-
"
|
|
1833
|
-
"
|
|
1834
|
-
"
|
|
1541
|
+
"id",
|
|
1542
|
+
"clause",
|
|
1543
|
+
"status"
|
|
1835
1544
|
],
|
|
1836
1545
|
"properties": {
|
|
1837
|
-
"
|
|
1838
|
-
"type": "integer",
|
|
1839
|
-
"enum": [
|
|
1840
|
-
1
|
|
1841
|
-
]
|
|
1842
|
-
},
|
|
1843
|
-
"at": {
|
|
1546
|
+
"id": {
|
|
1844
1547
|
"type": "string",
|
|
1845
|
-
"
|
|
1548
|
+
"pattern": "^REQ-[0-9]+$",
|
|
1549
|
+
"description": "REQ-N — assigned once, frozen; the stable cross-machine key every covers[] / traces_to[] link resolves against."
|
|
1846
1550
|
},
|
|
1847
|
-
"
|
|
1848
|
-
"type": "string"
|
|
1551
|
+
"clause": {
|
|
1552
|
+
"type": "string",
|
|
1553
|
+
"description": "The requirement text, VERBATIM from the source — the deletion this closure catches is a clause that no AC covers."
|
|
1849
1554
|
},
|
|
1850
|
-
"
|
|
1555
|
+
"source": {
|
|
1851
1556
|
"type": "string",
|
|
1852
|
-
"description": "
|
|
1557
|
+
"description": "Where the clause came from (e.g. \"pitch §2.2\", \"req-doc.md#L14\", \"UC-04 body\") — the provenance an auditor traces back."
|
|
1853
1558
|
},
|
|
1854
1559
|
"status": {
|
|
1855
1560
|
"type": "string",
|
|
1856
1561
|
"enum": [
|
|
1857
|
-
"
|
|
1858
|
-
"
|
|
1859
|
-
"building",
|
|
1860
|
-
"evaluating",
|
|
1861
|
-
"shipped",
|
|
1862
|
-
"escalated",
|
|
1863
|
-
"aborted"
|
|
1562
|
+
"covered",
|
|
1563
|
+
"CUT (PO-approved)"
|
|
1864
1564
|
],
|
|
1865
|
-
"description": "
|
|
1866
|
-
},
|
|
1867
|
-
"round": {
|
|
1868
|
-
"type": "integer",
|
|
1869
|
-
"description": "From the latest t0/verdicts/r<N>-a<M>.json filename; falls back to rounds_used."
|
|
1870
|
-
},
|
|
1871
|
-
"attempt": {
|
|
1872
|
-
"type": "integer",
|
|
1873
|
-
"description": "From the latest t0/verdicts/r<N>-a<M>.json filename."
|
|
1874
|
-
},
|
|
1875
|
-
"rounds_used": {
|
|
1876
|
-
"type": "integer",
|
|
1877
|
-
"description": "Highest round carrying any build evidence (an order, a T0 verdict, a round build-gate artifact, or an EVAL result) — kernel/probe/rounds.mjs's deriveRounds(), the same derivation the ship report and the export use. Falls back to harness-run.md's literal frontmatter value only when no such evidence exists on disk."
|
|
1878
|
-
},
|
|
1879
|
-
"rounds_judged": {
|
|
1880
|
-
"type": "integer",
|
|
1881
|
-
"description": "Highest round EVAL actually returned a verdict for (an evaluate-r<N>.json result on disk) — its own field, never folded into rounds_used: a round built is not a round judged. Omitted when no round has been judged yet."
|
|
1882
|
-
},
|
|
1883
|
-
"max_rounds": {
|
|
1884
|
-
"type": "integer"
|
|
1885
|
-
},
|
|
1886
|
-
"auto_level": {
|
|
1887
|
-
"type": "string"
|
|
1888
|
-
},
|
|
1889
|
-
"latest_t0": {
|
|
1890
|
-
"type": "object",
|
|
1891
|
-
"properties": {
|
|
1892
|
-
"path": {
|
|
1893
|
-
"type": "string"
|
|
1894
|
-
},
|
|
1895
|
-
"overall": {
|
|
1896
|
-
"type": "string",
|
|
1897
|
-
"enum": [
|
|
1898
|
-
"green",
|
|
1899
|
-
"red"
|
|
1900
|
-
]
|
|
1901
|
-
},
|
|
1902
|
-
"round": {
|
|
1903
|
-
"type": "integer"
|
|
1904
|
-
},
|
|
1905
|
-
"attempt": {
|
|
1906
|
-
"type": "integer"
|
|
1907
|
-
}
|
|
1908
|
-
}
|
|
1909
|
-
},
|
|
1910
|
-
"board": {
|
|
1911
|
-
"type": "object",
|
|
1912
|
-
"properties": {
|
|
1913
|
-
"total": {
|
|
1914
|
-
"type": "integer"
|
|
1915
|
-
},
|
|
1916
|
-
"done": {
|
|
1917
|
-
"type": "integer"
|
|
1918
|
-
},
|
|
1919
|
-
"unfinished": {
|
|
1920
|
-
"type": "array",
|
|
1921
|
-
"items": {
|
|
1922
|
-
"type": "string"
|
|
1923
|
-
},
|
|
1924
|
-
"description": "Task ids not yet done — capped at 10."
|
|
1925
|
-
}
|
|
1926
|
-
}
|
|
1927
|
-
},
|
|
1928
|
-
"pending_orders": {
|
|
1929
|
-
"type": "array",
|
|
1930
|
-
"items": {
|
|
1931
|
-
"type": "string"
|
|
1932
|
-
},
|
|
1933
|
-
"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."
|
|
1934
|
-
},
|
|
1935
|
-
"spec_folder": {
|
|
1936
|
-
"type": "string"
|
|
1565
|
+
"description": "covered = must be named by ≥1 AC's covers[] or the planning read-back finds it; CUT (PO-approved) = a Betting-Table decision to drop it, kept for audit (never deleted)."
|
|
1937
1566
|
},
|
|
1938
|
-
"
|
|
1567
|
+
"note": {
|
|
1939
1568
|
"type": "string",
|
|
1940
|
-
"description": "
|
|
1569
|
+
"description": "Optional rationale — required in spirit for a CUT (why the clause was dropped)."
|
|
1941
1570
|
}
|
|
1942
1571
|
}
|
|
1943
1572
|
},
|
|
1944
|
-
"
|
|
1945
|
-
"description": "
|
|
1946
|
-
"x-tier": "EMBEDDED (
|
|
1947
|
-
"x-writer": "harness probe stats (read-only over metrics/ — writes nothing)",
|
|
1948
|
-
"x-readers": "human / CLI / CI",
|
|
1949
|
-
"type": "object",
|
|
1950
|
-
"required": [
|
|
1951
|
-
"schema_version",
|
|
1952
|
-
"generated_at",
|
|
1953
|
-
"rows_total",
|
|
1954
|
-
"per_slug"
|
|
1955
|
-
],
|
|
1956
|
-
"properties": {
|
|
1957
|
-
"schema_version": {
|
|
1958
|
-
"type": "integer",
|
|
1959
|
-
"enum": [
|
|
1960
|
-
1
|
|
1961
|
-
]
|
|
1962
|
-
},
|
|
1963
|
-
"generated_at": {
|
|
1964
|
-
"type": "string"
|
|
1965
|
-
},
|
|
1966
|
-
"metrics_dir": {
|
|
1967
|
-
"type": "string"
|
|
1968
|
-
},
|
|
1969
|
-
"sources": {
|
|
1970
|
-
"type": "array",
|
|
1971
|
-
"items": {
|
|
1972
|
-
"type": "string"
|
|
1973
|
-
},
|
|
1974
|
-
"description": "Shard filenames read."
|
|
1975
|
-
},
|
|
1976
|
-
"rows_total": {
|
|
1977
|
-
"type": "integer",
|
|
1978
|
-
"description": "Valid harvest rows aggregated."
|
|
1979
|
-
},
|
|
1980
|
-
"rows_malformed": {
|
|
1981
|
-
"type": "integer",
|
|
1982
|
-
"description": "Lines skipped fail-open (unparseable, or missing feature_slug/terminal_state)."
|
|
1983
|
-
},
|
|
1984
|
-
"rows_pathology": {
|
|
1985
|
-
"type": "integer",
|
|
1986
|
-
"description": "kind:\"pathology\" rows (hook denials) — partitioned into the histogram, not aggregated as runs."
|
|
1987
|
-
},
|
|
1988
|
-
"pathologies": {
|
|
1989
|
-
"type": "object",
|
|
1990
|
-
"description": "Histogram keyed by pathology code, e.g. {\"PA3\": 2, \"SAFETY\": 1}."
|
|
1991
|
-
},
|
|
1992
|
-
"per_slug": {
|
|
1993
|
-
"type": "array",
|
|
1994
|
-
"items": {
|
|
1995
|
-
"type": "object",
|
|
1996
|
-
"required": [
|
|
1997
|
-
"feature_slug",
|
|
1998
|
-
"runs"
|
|
1999
|
-
],
|
|
2000
|
-
"properties": {
|
|
2001
|
-
"feature_slug": {
|
|
2002
|
-
"type": "string"
|
|
2003
|
-
},
|
|
2004
|
-
"runs": {
|
|
2005
|
-
"type": "integer"
|
|
2006
|
-
},
|
|
2007
|
-
"rounds": {
|
|
2008
|
-
"type": "object",
|
|
2009
|
-
"properties": {
|
|
2010
|
-
"min": {
|
|
2011
|
-
"type": "integer"
|
|
2012
|
-
},
|
|
2013
|
-
"max": {
|
|
2014
|
-
"type": "integer"
|
|
2015
|
-
},
|
|
2016
|
-
"avg": {
|
|
2017
|
-
"type": "number"
|
|
2018
|
-
}
|
|
2019
|
-
}
|
|
2020
|
-
},
|
|
2021
|
-
"terminal_states": {
|
|
2022
|
-
"type": "object",
|
|
2023
|
-
"description": "Histogram of terminal_state values."
|
|
2024
|
-
},
|
|
2025
|
-
"hammer_cut_rate": {
|
|
2026
|
-
"type": "number",
|
|
2027
|
-
"description": "Share of runs with scope_cut_count > 0."
|
|
2028
|
-
},
|
|
2029
|
-
"scope_cuts_total": {
|
|
2030
|
-
"type": "integer"
|
|
2031
|
-
},
|
|
2032
|
-
"attempt_exhaustions": {
|
|
2033
|
-
"type": "integer",
|
|
2034
|
-
"description": "Summed only where the optional MetricsRow field exists — never re-derived."
|
|
2035
|
-
},
|
|
2036
|
-
"qa": {
|
|
2037
|
-
"type": "object",
|
|
2038
|
-
"properties": {
|
|
2039
|
-
"total": {
|
|
2040
|
-
"type": "integer"
|
|
2041
|
-
},
|
|
2042
|
-
"promoted": {
|
|
2043
|
-
"type": "integer"
|
|
2044
|
-
},
|
|
2045
|
-
"held": {
|
|
2046
|
-
"type": "integer"
|
|
2047
|
-
},
|
|
2048
|
-
"promotion_rate": {
|
|
2049
|
-
"type": "number"
|
|
2050
|
-
}
|
|
2051
|
-
}
|
|
2052
|
-
},
|
|
2053
|
-
"surprise_avg": {
|
|
2054
|
-
"type": "number"
|
|
2055
|
-
},
|
|
2056
|
-
"rounds_per_slice_avg": {
|
|
2057
|
-
"type": "number",
|
|
2058
|
-
"description": "round_count/slice_count averaged over rows where slice_count > 0 — the normalized effort signal."
|
|
2059
|
-
}
|
|
2060
|
-
}
|
|
2061
|
-
}
|
|
2062
|
-
},
|
|
2063
|
-
"trend": {
|
|
2064
|
-
"type": "array",
|
|
2065
|
-
"items": {
|
|
2066
|
-
"type": "object",
|
|
2067
|
-
"required": [
|
|
2068
|
-
"feature_slug",
|
|
2069
|
-
"seq",
|
|
2070
|
-
"round_count"
|
|
2071
|
-
],
|
|
2072
|
-
"properties": {
|
|
2073
|
-
"feature_slug": {
|
|
2074
|
-
"type": "string"
|
|
2075
|
-
},
|
|
2076
|
-
"seq": {
|
|
2077
|
-
"type": "integer",
|
|
2078
|
-
"description": "Append order within the shard — the fallback ordering for rows without `at`."
|
|
2079
|
-
},
|
|
2080
|
-
"at": {
|
|
2081
|
-
"type": "string"
|
|
2082
|
-
},
|
|
2083
|
-
"round_count": {
|
|
2084
|
-
"type": "integer"
|
|
2085
|
-
}
|
|
2086
|
-
}
|
|
2087
|
-
},
|
|
2088
|
-
"description": "round_count over time — the 'is the KB flywheel working' chart."
|
|
2089
|
-
}
|
|
2090
|
-
}
|
|
2091
|
-
},
|
|
2092
|
-
"Lane": {
|
|
2093
|
-
"description": "The run's lane (full|tiny), computed by harness init fit at GATE L0.3 and recorded in harness-run.md frontmatter `lane:` (with its evidence, and marked overridden when --lane/--tiny outranks the recommendation); RunArgs.lane carries it to the workflow launch. The lane is pipeline knowledge: the orchestrator compiles it away into existing registered knobs (lens, budgets, gate policy) — it NEVER rides in WorkOrderPayload, so workers stay pipeline-blind.",
|
|
2094
|
-
"x-tier": "EMBEDDED (recorded in harness-run.md frontmatter `lane:` — never a WorkOrderPayload field)",
|
|
2095
|
-
"x-writer": "tech-lead (GATE L0 lane selection)",
|
|
2096
|
-
"x-readers": "tech-lead only",
|
|
2097
|
-
"x-lane-policy": {
|
|
2098
|
-
"tiny": {
|
|
2099
|
-
"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",
|
|
2100
|
-
"skips": [
|
|
2101
|
-
"orient",
|
|
2102
|
-
"gate-l1a",
|
|
2103
|
-
"full board ceremony at L1b (auto-generated lens:lite board, one merged confirmation gate)"
|
|
2104
|
-
],
|
|
2105
|
-
"defaults": {
|
|
2106
|
-
"qa": "--no-qa",
|
|
2107
|
-
"round_budget": 2
|
|
2108
|
-
},
|
|
2109
|
-
"never_skips": [
|
|
2110
|
-
"EVAL (single judge)",
|
|
2111
|
-
"T0",
|
|
2112
|
-
"hooks"
|
|
2113
|
-
]
|
|
2114
|
-
},
|
|
2115
|
-
"normal": {
|
|
2116
|
-
"selection": "everything else — today's behavior, unchanged",
|
|
2117
|
-
"skips": [],
|
|
2118
|
-
"defaults": {
|
|
2119
|
-
"round_budget": 3
|
|
2120
|
-
}
|
|
2121
|
-
},
|
|
2122
|
-
"full": {
|
|
2123
|
-
"selection": "cross-context lens OR appetite >= 6 weeks",
|
|
2124
|
-
"skips": [],
|
|
2125
|
-
"defaults": {
|
|
2126
|
-
"lens": "cross-context",
|
|
2127
|
-
"qa": "mandatory",
|
|
2128
|
-
"round_budget": 4
|
|
2129
|
-
}
|
|
2130
|
-
}
|
|
2131
|
-
},
|
|
2132
|
-
"type": "string",
|
|
2133
|
-
"enum": [
|
|
2134
|
-
"tiny",
|
|
2135
|
-
"normal",
|
|
2136
|
-
"full"
|
|
2137
|
-
]
|
|
2138
|
-
},
|
|
2139
|
-
"RequirementClause": {
|
|
2140
|
-
"description": "One atomic customer requirement, frozen with a STABLE id — the covers-closure input truth (spine v1.3). Extracted from the REQ source (pitch / customer-requirements doc / use-case bodies) by the planner — 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.",
|
|
2141
|
-
"x-tier": "SHARED",
|
|
2142
|
-
"x-location": "shapeup/<slug>/requirements.md",
|
|
2143
|
-
"x-writer": "ba-pitch-analyzer (operation: coverage) — extraction only; CUT status is a PO governance edit (same class as a round-ledger Decision)",
|
|
2144
|
-
"x-readers": "harness verify trace (covers-closure oracle), tech-lead, human (coverage/cut audit)",
|
|
2145
|
-
"type": "object",
|
|
2146
|
-
"required": [
|
|
2147
|
-
"id",
|
|
2148
|
-
"clause",
|
|
2149
|
-
"status"
|
|
2150
|
-
],
|
|
2151
|
-
"properties": {
|
|
2152
|
-
"id": {
|
|
2153
|
-
"type": "string",
|
|
2154
|
-
"pattern": "^REQ-[0-9]+$",
|
|
2155
|
-
"description": "REQ-N — assigned once, frozen; the stable cross-machine key every covers[] / traces_to[] link resolves against."
|
|
2156
|
-
},
|
|
2157
|
-
"clause": {
|
|
2158
|
-
"type": "string",
|
|
2159
|
-
"description": "The requirement text, VERBATIM from the source — the deletion this closure catches is a clause that no AC covers."
|
|
2160
|
-
},
|
|
2161
|
-
"source": {
|
|
2162
|
-
"type": "string",
|
|
2163
|
-
"description": "Where the clause came from (e.g. \"pitch §2.2\", \"req-doc.md#L14\", \"UC-04 body\") — the provenance an auditor traces back."
|
|
2164
|
-
},
|
|
2165
|
-
"status": {
|
|
2166
|
-
"type": "string",
|
|
2167
|
-
"enum": [
|
|
2168
|
-
"covered",
|
|
2169
|
-
"CUT (PO-approved)"
|
|
2170
|
-
],
|
|
2171
|
-
"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)."
|
|
2172
|
-
},
|
|
2173
|
-
"note": {
|
|
2174
|
-
"type": "string",
|
|
2175
|
-
"description": "Optional rationale — required in spirit for a CUT (why the clause was dropped)."
|
|
2176
|
-
}
|
|
2177
|
-
}
|
|
2178
|
-
},
|
|
2179
|
-
"WiringEntry": {
|
|
2180
|
-
"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).",
|
|
2181
|
-
"x-tier": "EMBEDDED (inside WiringMap.entries)",
|
|
1573
|
+
"WiringEntry": {
|
|
1574
|
+
"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 the scopes substep needs at slicing time (the missing input behind the round-1 main.js substrate-expansion escalations).",
|
|
1575
|
+
"x-tier": "EMBEDDED (inside WiringMap.entries)",
|
|
2182
1576
|
"type": "object",
|
|
2183
1577
|
"required": [
|
|
2184
1578
|
"use_case",
|
|
@@ -2191,7 +1585,7 @@
|
|
|
2191
1585
|
},
|
|
2192
1586
|
"engine": {
|
|
2193
1587
|
"type": "string",
|
|
2194
|
-
"description": "Repo-relative path of the module implementing the UC's core logic — the file
|
|
1588
|
+
"description": "Repo-relative path of the module implementing the UC's core logic — the file the use case's affordance must reach from the entry point."
|
|
2195
1589
|
},
|
|
2196
1590
|
"wiring_seam": {
|
|
2197
1591
|
"type": "string",
|
|
@@ -2199,7 +1593,7 @@
|
|
|
2199
1593
|
},
|
|
2200
1594
|
"entry_call_site": {
|
|
2201
1595
|
"type": "string",
|
|
2202
|
-
"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
|
|
1596
|
+
"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 evaluator checks it against the running app and nothing parses this field."
|
|
2203
1597
|
},
|
|
2204
1598
|
"affordance": {
|
|
2205
1599
|
"type": "string",
|
|
@@ -2208,9 +1602,9 @@
|
|
|
2208
1602
|
}
|
|
2209
1603
|
},
|
|
2210
1604
|
"Seam": {
|
|
2211
|
-
"description": "How one use case's engine attaches to the entry point — the `wiring_seam` value of a WiringEntry,
|
|
2212
|
-
"x-tier": "EMBEDDED (a WiringEntry.wiring_seam value
|
|
2213
|
-
"x-writer": "
|
|
1605
|
+
"description": "How one use case's engine attaches to the entry point — the `wiring_seam` value of a WiringEntry, Not a file: it exists only as a cell in the committed wiring map.",
|
|
1606
|
+
"x-tier": "EMBEDDED (a WiringEntry.wiring_seam value)",
|
|
1607
|
+
"x-writer": "the loop's plan activity, wire substep, inside wiring-map.md",
|
|
2214
1608
|
"type": "object",
|
|
2215
1609
|
"properties": {
|
|
2216
1610
|
"seam": {
|
|
@@ -2228,11 +1622,11 @@
|
|
|
2228
1622
|
}
|
|
2229
1623
|
},
|
|
2230
1624
|
"WiringMap": {
|
|
2231
|
-
"description": "The reachability map — per UC, the chain from engine to a player-visible affordance (spine v1.3). Written DIRECTLY by
|
|
1625
|
+
"description": "The reachability map — per UC, the chain from engine to a player-visible affordance (spine v1.3). Written DIRECTLY by the plan activity's wire substep before gate L1a.5 (precedent: ScopeContract is written directly by the scopes substep, bypassing the loop). Its purpose: no engine ships orphaned from the running application — the evaluator and the loop's build and launch check that against the built app. ON-DISK FORMAT IS MARKDOWN: 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. `kernel/lib/contract.mjs` is the only reader/writer of the file form; everything downstream of that parse sees exactly this shape.",
|
|
2232
1626
|
"x-tier": "SHARED",
|
|
2233
1627
|
"x-location": "shapeup/<slug>/wiring-map.md",
|
|
2234
|
-
"x-writer": "
|
|
2235
|
-
"x-readers": "
|
|
1628
|
+
"x-writer": "the loop's plan activity, wire substep (SOLE writer, direct — like the scopes substep writes scopes/*.md)",
|
|
1629
|
+
"x-readers": "the plan activity (scopes: integration seam at slicing time), spec-evaluator",
|
|
2236
1630
|
"type": "object",
|
|
2237
1631
|
"required": [
|
|
2238
1632
|
"schema_version",
|
|
@@ -2252,7 +1646,7 @@
|
|
|
2252
1646
|
},
|
|
2253
1647
|
"entry_point": {
|
|
2254
1648
|
"type": "string",
|
|
2255
|
-
"description": "OPTIONAL echo of ProjectProfile.entry_point at authoring time (informational — the profile stays the source of truth
|
|
1649
|
+
"description": "OPTIONAL echo of ProjectProfile.entry_point at authoring time (informational — the profile stays the source of truth)."
|
|
2256
1650
|
},
|
|
2257
1651
|
"entries": {
|
|
2258
1652
|
"type": "array",
|
|
@@ -2263,11 +1657,11 @@
|
|
|
2263
1657
|
}
|
|
2264
1658
|
},
|
|
2265
1659
|
"ProjectProfile": {
|
|
2266
|
-
"description": "The archetype + entry-point declaration
|
|
1660
|
+
"description": "The archetype + entry-point declaration the wiring map and the build probes depend on (spine v1.3). The entry point 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: 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. `kernel/lib/contract.mjs` is the only reader/writer of the file form; everything downstream of that parse sees exactly this shape.",
|
|
2267
1661
|
"x-tier": "SHARED",
|
|
2268
1662
|
"x-location": "shapeup/<slug>/project-profile.md",
|
|
2269
|
-
"x-writer": "
|
|
2270
|
-
"x-readers": "
|
|
1663
|
+
"x-writer": "the loop, at the intake gate (not the loop, which stays pipeline-blind)",
|
|
1664
|
+
"x-readers": "the loop (build_probe + launch_probe, once per round before EVAL), the plan activity (wire)",
|
|
2271
1665
|
"type": "object",
|
|
2272
1666
|
"required": [
|
|
2273
1667
|
"schema_version",
|
|
@@ -2290,28 +1684,23 @@
|
|
|
2290
1684
|
"library",
|
|
2291
1685
|
"data-pipeline"
|
|
2292
1686
|
],
|
|
2293
|
-
"description": "Validated against the enum — a typo must FAIL, never silently disable
|
|
1687
|
+
"description": "Validated against the enum — a typo must FAIL, never silently disable a check."
|
|
2294
1688
|
},
|
|
2295
1689
|
"entry_point": {
|
|
2296
1690
|
"type": "string",
|
|
2297
|
-
"description": "The repo-relative seam
|
|
1691
|
+
"description": "The repo-relative seam the wiring map resolves engines against (e.g. main.js, src/server.ts). Not hardcoded — archetype-specific."
|
|
2298
1692
|
},
|
|
2299
1693
|
"note": {
|
|
2300
1694
|
"type": "string",
|
|
2301
1695
|
"description": "Optional context on the archetype/entry-point choice."
|
|
2302
1696
|
},
|
|
2303
|
-
"source_extensions": {
|
|
2304
|
-
"type": "array",
|
|
2305
|
-
"items": { "type": "string" },
|
|
2306
|
-
"description": "OPTIONAL — the file extensions this project's modules use, for the import walk that reachability runs. Absent means the JS/TS family plus the entry point's own suffix, which is right for most stacks and wrong for any stack whose engines end in something the entry point does not. Declare it when they differ (e.g. [\".ets\"] for ArkTS, [\".vue\", \".ts\"] for a Vue app): a walk that cannot follow an edge reports itself unchecked rather than reporting every engine orphaned, so the cost of leaving this absent is a skipped arm, never a false red."
|
|
2307
|
-
},
|
|
2308
1697
|
"build_probe": {
|
|
2309
1698
|
"type": "string",
|
|
2310
|
-
"description": "OPTIONAL — a command that asserts the BUILT ARTIFACT, not the build's exit code, and exits 0 only when it holds. Exists because a green build is not proof the feature compiled: some toolchains compile only the files reachable from an entry point, so a scope's new files can sit outside the compiled set while the build stays green (measured: an app package holding 3 compiled files, 58 errors once the rest became reachable). Archetype-specific by construction — e.g. 'the compiled source map lists every file under each scope's substrate'. Run by
|
|
1699
|
+
"description": "OPTIONAL — a command that asserts the BUILT ARTIFACT, not the build's exit code, and exits 0 only when it holds. Exists because a green build is not proof the feature compiled: some toolchains compile only the files reachable from an entry point, so a scope's new files can sit outside the compiled set while the build stays green (measured: an app package holding 3 compiled files, 58 errors once the rest became reachable). Archetype-specific by construction — e.g. 'the compiled source map lists every file under each scope's substrate'. Run by the loop (build and launch) after run_cmd, once per round before EVAL; absent = no such step, never a failure."
|
|
2311
1700
|
},
|
|
2312
1701
|
"launch_probe": {
|
|
2313
1702
|
"type": "string",
|
|
2314
|
-
"description": "OPTIONAL for most archetypes, EXPECTED for `mobile` — a command that installs the built artifact, starts it, asserts the first screen (ids, text, a screenshot diff) and fails on fatal runtime log patterns. Exists because nothing else in the loop launches the app: a blank first screen survived three EVAL rounds on a run whose every T0 fixture was green. Run by
|
|
1703
|
+
"description": "OPTIONAL for most archetypes, EXPECTED for `mobile` — a command that installs the built artifact, starts it, asserts the first screen (ids, text, a screenshot diff) and fails on fatal runtime log patterns. Exists because nothing else in the loop launches the app: a blank first screen survived three EVAL rounds on a run whose every T0 fixture was green. Run by the loop (build and launch) after run_cmd and build_probe; a mobile profile without one should be called out at GATE L0, so the 'on-device install unverified' risk has a named owner. Absent = no such step."
|
|
2315
1704
|
}
|
|
2316
1705
|
}
|
|
2317
1706
|
},
|
|
@@ -2329,7 +1718,7 @@
|
|
|
2329
1718
|
"items": {
|
|
2330
1719
|
"$ref": "#/$defs/TaskRef"
|
|
2331
1720
|
},
|
|
2332
|
-
"description": "task-executor: what to implement ·
|
|
1721
|
+
"description": "task-executor: what to implement · spec-evaluator: traceability ONLY (never a grading source)."
|
|
2333
1722
|
},
|
|
2334
1723
|
"decisions": {
|
|
2335
1724
|
"type": "array",
|
|
@@ -2355,7 +1744,7 @@
|
|
|
2355
1744
|
},
|
|
2356
1745
|
"kb_rules_path": {
|
|
2357
1746
|
"type": "string",
|
|
2358
|
-
"description": "Coachable workers (task-executor,
|
|
1747
|
+
"description": "Coachable workers (task-executor, qa-edge-hunter, orient): shapeup/knowledge-base/<skill>.md — steering, never spec and never a gate; conflict → the AC, the contract or the gate wins, noted in deviations. The judge and the census are not coachable."
|
|
2359
1748
|
},
|
|
2360
1749
|
"verify": {
|
|
2361
1750
|
"$ref": "#/$defs/VerifySpec",
|
|
@@ -2367,7 +1756,7 @@
|
|
|
2367
1756
|
},
|
|
2368
1757
|
"bugs": {
|
|
2369
1758
|
"type": "array",
|
|
2370
|
-
"description": "The previous round's FAIL verdict, addressed to the scope whose substrate contains each cited file — touch nothing else. Written by `
|
|
1759
|
+
"description": "The previous round's FAIL verdict, addressed to the scope whose substrate contains each cited file — touch nothing else. Written by `the loop` from results/evaluate-r<N-1>.json, never by a caller: a build order is addressed by scope/round/attempt and carries no caller payload, and the verdict must survive the relaunch that separates two rounds. Present on any r≥2 execute order whose predecessor failed; an entry matching no scope's substrate is marked `unowned` and sent to all of them rather than dropped."
|
|
2371
1760
|
},
|
|
2372
1761
|
"spec_folder": {
|
|
2373
1762
|
"type": "string",
|
|
@@ -2379,51 +1768,37 @@
|
|
|
2379
1768
|
},
|
|
2380
1769
|
"pitch": {
|
|
2381
1770
|
"type": "string",
|
|
2382
|
-
"description": "
|
|
1771
|
+
"description": "orient: the kicked-off pitch path (shaped + bet; frontmatter appetite/status/bet)."
|
|
2383
1772
|
},
|
|
2384
1773
|
"breadboard": {
|
|
2385
1774
|
"type": "string",
|
|
2386
|
-
"description": "orient
|
|
2387
|
-
},
|
|
2388
|
-
"lens": {
|
|
2389
|
-
"type": "string",
|
|
2390
|
-
"enum": [
|
|
2391
|
-
"lite",
|
|
2392
|
-
"standard",
|
|
2393
|
-
"cross-context"
|
|
2394
|
-
],
|
|
2395
|
-
"description": "ba-pitch-analyzer: analysis depth. Absent → the planner judges it and records the choice in assumptions[]."
|
|
2396
|
-
},
|
|
2397
|
-
"orient_dir": {
|
|
2398
|
-
"type": "string",
|
|
2399
|
-
"description": "ba-pitch-analyzer: the Scout's artifact dir — code-surface.md IS the codebase map (do not re-scan)."
|
|
1775
|
+
"description": "orient: the run's staged breadboard — Places (P#), UI and code affordances (U#, N#), stores (S#), slices (V#). Absent = the pitch has no separate breadboard (it may carry one inline); never inferred from the pitch's folder."
|
|
2400
1776
|
},
|
|
2401
1777
|
"stack": {
|
|
2402
1778
|
"type": "string",
|
|
2403
|
-
"description": "orient: stack hint aiming the code-surface sweeps (e.g. \"pnpm, Next 16 web :3000\").
|
|
1779
|
+
"description": "orient: stack hint aiming the code-surface sweeps (e.g. \"pnpm, Next 16 web :3000\")."
|
|
2404
1780
|
},
|
|
2405
|
-
"
|
|
1781
|
+
"step": {
|
|
2406
1782
|
"type": "string",
|
|
2407
|
-
"
|
|
1783
|
+
"enum": ["requirements", "spec", "wire", "scopes"],
|
|
1784
|
+
"description": "building (operation: plan): which planning substep this fence order covers. The order's id is plan-<step> and its substrate is that substep's write contract, so each substep leaves its own leg row and its own fence."
|
|
2408
1785
|
},
|
|
2409
|
-
"
|
|
1786
|
+
"mode": {
|
|
2410
1787
|
"type": "string",
|
|
2411
|
-
"
|
|
1788
|
+
"enum": ["full", "board-only", "reconcile", "retrofit-surface"],
|
|
1789
|
+
"description": "building (operation: plan, step: spec): how the spec substep is scoped — full (tree + board), board-only (a committed tree is frozen; only the per-machine board is regenerated), reconcile (discovered items fold in; invariants and the Test Surface are append-only), retrofit-surface (append the Test Surface to a spec that predates it). Absent = full."
|
|
2412
1790
|
},
|
|
2413
|
-
"
|
|
2414
|
-
"type": "
|
|
2415
|
-
"
|
|
2416
|
-
|
|
2417
|
-
"scope_id": {
|
|
2418
|
-
"type": "string",
|
|
2419
|
-
"description": "scope-architect (map-scopes): the stuck scope · scope-hammer (--breaker inner): the exhausted scope."
|
|
1791
|
+
"kb_rules_paths": {
|
|
1792
|
+
"type": "array",
|
|
1793
|
+
"items": { "type": "string" },
|
|
1794
|
+
"description": "building (operation: plan): the knowledge-base files the planning activity reads — its own (`plan`) and the three it was filed under before the fold (ba-pitch-analyzer, scope-architect, solution-architect). Whether each exists is for the loop to see; steering, never spec and never a gate."
|
|
2420
1795
|
},
|
|
2421
1796
|
"dimensions": {
|
|
2422
1797
|
"type": "array",
|
|
2423
1798
|
"items": {
|
|
2424
1799
|
"type": "string"
|
|
2425
1800
|
},
|
|
2426
|
-
"description": "spec-evaluator: the active dimension set.
|
|
1801
|
+
"description": "spec-evaluator: the active dimension set. the loop fills it on every evaluate order: the run's named set, or the set resolved from the spec with the judge's auto-enable rules. Absent only on a standalone order."
|
|
2427
1802
|
},
|
|
2428
1803
|
"run_cmd": {
|
|
2429
1804
|
"type": "string",
|
|
@@ -2431,7 +1806,7 @@
|
|
|
2431
1806
|
},
|
|
2432
1807
|
"launch_cmd": {
|
|
2433
1808
|
"type": "string",
|
|
2434
|
-
"description": "spec-evaluator, qa-edge-hunter: the project profile's launch probe — installs the built artifact, starts it and asserts the first screen. Derived by `
|
|
1809
|
+
"description": "spec-evaluator, qa-edge-hunter: the project profile's launch probe — installs the built artifact, starts it and asserts the first screen. Derived by `the loop` from project-profile.md, absent when the profile declares none. Where `run_cmd` is only a build, this is how the app is brought up; a non-zero exit is a finding, not a reason to guess another way."
|
|
2435
1810
|
},
|
|
2436
1811
|
"revised_checks": {
|
|
2437
1812
|
"type": "array",
|
|
@@ -2444,16 +1819,16 @@
|
|
|
2444
1819
|
},
|
|
2445
1820
|
"required": ["id", "file"]
|
|
2446
1821
|
},
|
|
2447
|
-
"description": "spec-evaluator: rows that FAILed in one of the round's T0 trials and PASS in a later one whose own check file (named by the row id) changed in between. Derived by
|
|
1822
|
+
"description": "spec-evaluator: rows that FAILed in one of the round's T0 trials and PASS in a later one whose own check file (named by the row id) changed in between. Derived by the loop. Each must be read against its row before its PASS counts; absent when none."
|
|
2448
1823
|
},
|
|
2449
1824
|
"scopes_without_t0": {
|
|
2450
1825
|
"type": "array",
|
|
2451
1826
|
"items": { "type": "string" },
|
|
2452
|
-
"description": "spec-evaluator: scopes whose contract exists but which hold no green T0 verdict for the round, while at least one other scope does. Derived by
|
|
1827
|
+
"description": "spec-evaluator: scopes whose contract exists but which hold no green T0 verdict for the round, while at least one other scope does. Derived by the loop. The round is still gradeable: each row such a scope owns is a FAIL citing the scope contract, never a reason to refuse the round. Absent when every scope is green."
|
|
2453
1828
|
},
|
|
2454
1829
|
"build_gate": {
|
|
2455
1830
|
"type": "string",
|
|
2456
|
-
"description": "spec-evaluator, qa-edge-hunter: this run's newest round build gate artifact (build/r<N>-t<T>.json) — each step's exit code and output tail, the record that the build ran and the app launched. Derived by `
|
|
1831
|
+
"description": "spec-evaluator, qa-edge-hunter: this run's newest round build gate artifact (build/r<N>-t<T>.json) — each step's exit code and output tail, the record that the build ran and the app launched. Derived by `the loop`, absent when the gate never ran. Read it before grading a [ui] row NO EVIDENCE."
|
|
2457
1832
|
},
|
|
2458
1833
|
"t0_artifacts": {
|
|
2459
1834
|
"type": "array",
|
|
@@ -2489,38 +1864,11 @@
|
|
|
2489
1864
|
"round": {
|
|
2490
1865
|
"type": "integer",
|
|
2491
1866
|
"description": "the round this order is counted against."
|
|
2492
|
-
},
|
|
2493
|
-
"baseline": {
|
|
2494
|
-
"type": "string",
|
|
2495
|
-
"description": "scope-hammer: shaping/baseline.md — comparison anchor (absent → the pitch's problem statement, flagged approximate)."
|
|
2496
|
-
},
|
|
2497
|
-
"breaker": {
|
|
2498
|
-
"type": "string",
|
|
2499
|
-
"enum": [
|
|
2500
|
-
"outer",
|
|
2501
|
-
"inner"
|
|
2502
|
-
],
|
|
2503
|
-
"description": "scope-hammer: which circuit breaker fired (absent = normal stop, all scopes FINISHED)."
|
|
2504
|
-
},
|
|
2505
|
-
"feedback": {
|
|
2506
|
-
"type": "string",
|
|
2507
|
-
"description": "coach: the PO's raw L4 feedback to distill and categorize at GATE COACH-1."
|
|
2508
|
-
},
|
|
2509
|
-
"intake": {
|
|
2510
|
-
"type": "array",
|
|
2511
|
-
"items": {
|
|
2512
|
-
"type": "string"
|
|
2513
|
-
},
|
|
2514
|
-
"description": "translator: source docs to normalize to English (originals never overwritten)."
|
|
2515
|
-
},
|
|
2516
|
-
"glossary": {
|
|
2517
|
-
"type": "string",
|
|
2518
|
-
"description": "translator: existing glossary.md to reuse as the base term map."
|
|
2519
1867
|
}
|
|
2520
1868
|
}
|
|
2521
1869
|
},
|
|
2522
1870
|
"HammerCensus": {
|
|
2523
|
-
"description": "
|
|
1871
|
+
"description": "The stop census as data — the proposal GATE L4's resolver reads before it lets an answer set say `ship`. Written by the loop's stop step at `.shapeup/<slug>/reports/hammer-census.json` (the name is older than the step), read back against this shape by the loop before GATE H, and stopped on, when it is not this shape. A proposal, never a decision: promotion and shipping stay the PO's call, and the loop never acts on it.",
|
|
2524
1872
|
"x-tier": "LOCAL",
|
|
2525
1873
|
"x-location": ".shapeup/<slug>/reports/hammer-census.json",
|
|
2526
1874
|
"type": "object",
|
|
@@ -2535,221 +1883,13 @@
|
|
|
2535
1883
|
"baseline": { "type": ["string", "null"], "description": "The baseline the comparison ran against, or null when the pitch's problem statement stood in for it." }
|
|
2536
1884
|
}
|
|
2537
1885
|
},
|
|
2538
|
-
"ResumeState": {
|
|
2539
|
-
"description": "The fast-forward derivation: which phase a launch resumes at, derived from artifacts on disk and NEVER from stored state or conversation memory. Produced by kernel/probe/resume.mjs on stdout and consumed by shapeup-run.js's preamble on every launch, fresh or relaunch alike. Every phase predicate is an artifact test — `has_orient_artifacts` exists because the ORIENT branch was once gated on the ledger's stored `status` instead, which a silent courier failure left stale, and a completed ORIENT phase was re-dispatched on resume. `next_phase` is a convenience derived from the same booleans, which all travel too: a caller is never forced to trust a summary it cannot re-derive.",
|
|
2540
|
-
"x-tier": "EMBEDDED",
|
|
2541
|
-
"x-location": "stdout of harness probe resume — never written to disk (the run's state IS the artifacts this record reports on)",
|
|
2542
|
-
"x-writer": "harness probe resume (deriving; the same script's --set-status / --set-active-scope operations write, and report their own outcome record instead)",
|
|
2543
|
-
"x-readers": "shapeup-run.js (the fast-forward preamble, one call per launch)",
|
|
2544
|
-
"type": "object",
|
|
2545
|
-
"required": [
|
|
2546
|
-
"intake_path",
|
|
2547
|
-
"status",
|
|
2548
|
-
"has_orient_artifacts",
|
|
2549
|
-
"has_spec_tree",
|
|
2550
|
-
"has_wiring_map",
|
|
2551
|
-
"scope_files",
|
|
2552
|
-
"pending_orders",
|
|
2553
|
-
"eval_rounds_done",
|
|
2554
|
-
"next_phase"
|
|
2555
|
-
],
|
|
2556
|
-
"properties": {
|
|
2557
|
-
"intake_path": {
|
|
2558
|
-
"type": "string",
|
|
2559
|
-
"description": "Resolved path to the run's intake — the pitch a fresh ORIENT dispatch is compiled against."
|
|
2560
|
-
},
|
|
2561
|
-
"breadboard_path": {
|
|
2562
|
-
"type": [
|
|
2563
|
-
"string",
|
|
2564
|
-
"null"
|
|
2565
|
-
],
|
|
2566
|
-
"description": "Resolved path to the run's staged breadboard (`.shapeup/<slug>/breadboard.md`), the pitch's second half, handed to the four planning dispatches as payload.breadboard. Null when the pitch had no separate breadboard file."
|
|
2567
|
-
},
|
|
2568
|
-
"breadboard_source": {
|
|
2569
|
-
"type": [
|
|
2570
|
-
"string",
|
|
2571
|
-
"null"
|
|
2572
|
-
],
|
|
2573
|
-
"description": "How `init run` found the breadboard — flag | sibling | shaping-dir | shared-root | embedded — read from the receipt. Null when there was none or the receipt is unreadable."
|
|
2574
|
-
},
|
|
2575
|
-
"spec_folder": {
|
|
2576
|
-
"type": [
|
|
2577
|
-
"string",
|
|
2578
|
-
"null"
|
|
2579
|
-
],
|
|
2580
|
-
"description": "From harness-run.md frontmatter; null before the ledger names one."
|
|
2581
|
-
},
|
|
2582
|
-
"status": {
|
|
2583
|
-
"type": [
|
|
2584
|
-
"string",
|
|
2585
|
-
"null"
|
|
2586
|
-
],
|
|
2587
|
-
"description": "The ledger's stored status, reported for the readers that legitimately hold a MID_RUN set over it (harness reduce snapshot, and the ship report's census). NOT a resume predicate: no phase decision in shapeup-run.js may branch on this field."
|
|
2588
|
-
},
|
|
2589
|
-
"closed_status": {
|
|
2590
|
-
"type": [
|
|
2591
|
-
"string",
|
|
2592
|
-
"null"
|
|
2593
|
-
],
|
|
2594
|
-
"description": "The ledger's closed_status: the terminal status of a close nobody has taken back, null on a run that is open. A relaunch reads it once, to reopen the run before its first gate resolves. Not a phase predicate either."
|
|
2595
|
-
},
|
|
2596
|
-
"lens": {
|
|
2597
|
-
"type": [
|
|
2598
|
-
"string",
|
|
2599
|
-
"null"
|
|
2600
|
-
],
|
|
2601
|
-
"description": "From harness-run.md frontmatter; forwarded to the analyze dispatch. Null when the ledger names none — an unknown value is an ABSENT key in the order, never a null."
|
|
2602
|
-
},
|
|
2603
|
-
"stack": {
|
|
2604
|
-
"type": [
|
|
2605
|
-
"string",
|
|
2606
|
-
"null"
|
|
2607
|
-
],
|
|
2608
|
-
"description": "From harness-run.md frontmatter; forwarded to the orient dispatch. Null when the ledger names none."
|
|
2609
|
-
},
|
|
2610
|
-
"run_cmd": {
|
|
2611
|
-
"type": [
|
|
2612
|
-
"string",
|
|
2613
|
-
"null"
|
|
2614
|
-
],
|
|
2615
|
-
"description": "How to run the feature, from harness-run.md frontmatter; forwarded to the evaluate dispatch so the judge exercises a running thing. Null when the ledger names none."
|
|
2616
|
-
},
|
|
2617
|
-
"app_url": {
|
|
2618
|
-
"type": [
|
|
2619
|
-
"string",
|
|
2620
|
-
"null"
|
|
2621
|
-
],
|
|
2622
|
-
"description": "Where the feature answers, from harness-run.md frontmatter; forwarded to the QA hunt. Null when the ledger names none."
|
|
2623
|
-
},
|
|
2624
|
-
"eval_dimensions": {
|
|
2625
|
-
"type": "array",
|
|
2626
|
-
"items": {
|
|
2627
|
-
"type": "string"
|
|
2628
|
-
},
|
|
2629
|
-
"description": "The dimensions this run's EVAL grades, from harness-run.md frontmatter. Defaults to [\"spec-conformance\"] rather than empty, so a ledger that names none still produces a graded run — and the ship sign-off reports the complement as the dimensions the run did NOT cover."
|
|
2630
|
-
},
|
|
2631
|
-
"orient_dir": {
|
|
2632
|
-
"type": "string",
|
|
2633
|
-
"description": "The run's LOCAL orient directory, resolved for the analyze dispatch: ORIENT's spike and code-surface notes are working artifacts, not deliverables, so they live in the gitignored tier (ADR-0001)."
|
|
2634
|
-
},
|
|
2635
|
-
"has_orient_artifacts": {
|
|
2636
|
-
"type": "boolean",
|
|
2637
|
-
"description": "ORIENT finished: orient/ carries code-surface.md, discovered-seed.md, hill-signal.md and at least one spike-*.md (skills/orient/SKILL.md §Outputs). The ORIENT skip gates on THIS."
|
|
2638
|
-
},
|
|
2639
|
-
"has_spec_tree": {
|
|
2640
|
-
"type": "boolean",
|
|
2641
|
-
"description": "ANALYZE finished: the spec folder's usecases/ carries at least one use case that is not _index.md. WIRE reads these — one wiring-map entry per use case — which is why ANALYZE precedes WIRE in the phase chain: dispatched against an empty spec folder, WIRE escalates on every launch."
|
|
2642
|
-
},
|
|
2643
|
-
"has_board": { "type": "boolean", "description": "The per-machine board (tasks/TASK-*.md) holds at least one task. ANALYZE is complete only with both the committed spec tree and this; a committed tree with no board resumes at analyze, where the board-only operation regenerates it." },
|
|
2644
|
-
"staged_workflow": {
|
|
2645
|
-
"type": "object",
|
|
2646
|
-
"description": "Whether the orchestrator this launch will execute is the installed one. A run stages its own copy of the workflow scripts when it is OPENED and keeps them for its life — right for a run in flight, and silent: relaunching after an upgrade executes the OLD orchestrator, reports normally, and every observation is of the previous release. `checked: false` means the comparison could not be made (no plugin root, nothing staged), which is not the same fact as agreement. A warning, never a block: opening a new run is how an upgrade is soaked.",
|
|
2647
|
-
"properties": {
|
|
2648
|
-
"checked": { "type": "boolean" },
|
|
2649
|
-
"drift": { "type": "array", "items": { "type": "string" }, "description": "Staged scripts whose bytes differ from the installed plugin's." },
|
|
2650
|
-
"installed_version": { "type": ["string", "null"] },
|
|
2651
|
-
"run_version": { "type": ["string", "null"], "description": "The plugin version the run's receipt records — what this run actually opened under." },
|
|
2652
|
-
"warning": { "type": "string" }
|
|
2653
|
-
}
|
|
2654
|
-
},
|
|
2655
|
-
"has_requirements": {
|
|
2656
|
-
"type": "boolean",
|
|
2657
|
-
"description": "The requirements registry is on disk: shapeup/<slug>/requirements.md exists. A PLAIN FACT, not a phase — the orchestrator guards its single `coverage` dispatch on this boolean, and it is deliberately absent from kernel/probe/resume.mjs's PHASE_ARTIFACT map, which doubles as nextPhase()'s ordered list: an entry there would fast-forward every run recorded before the registry existed to the registry instead of to build."
|
|
2658
|
-
},
|
|
2659
|
-
"has_wiring_map": {
|
|
2660
|
-
"type": "boolean",
|
|
2661
|
-
"description": "WIRE finished: shapeup/<slug>/wiring-map.md exists."
|
|
2662
|
-
},
|
|
2663
|
-
"project_profile_path": {
|
|
2664
|
-
"type": "string"
|
|
2665
|
-
},
|
|
2666
|
-
"has_project_profile": {
|
|
2667
|
-
"type": "boolean",
|
|
2668
|
-
"description": "tech-lead writes project-profile.md at GATE L0, before the launch; trace-lint resolves reachability by its archetype."
|
|
2669
|
-
},
|
|
2670
|
-
"scope_files": {
|
|
2671
|
-
"type": "array",
|
|
2672
|
-
"description": "MAP SCOPES finished when non-empty. Each entry carries a RESOLVED path, never a bare filename — harness compile and harness verify t0 resolve --scope against cwd, and a bare id makes compile-order exit 2, which the attempt loop reads as the stagnation breaker.",
|
|
2673
|
-
"items": {
|
|
2674
|
-
"type": "object",
|
|
2675
|
-
"required": [
|
|
2676
|
-
"scope_id",
|
|
2677
|
-
"path"
|
|
2678
|
-
],
|
|
2679
|
-
"properties": {
|
|
2680
|
-
"scope_id": {
|
|
2681
|
-
"type": "string"
|
|
2682
|
-
},
|
|
2683
|
-
"path": {
|
|
2684
|
-
"type": "string"
|
|
2685
|
-
}
|
|
2686
|
-
}
|
|
2687
|
-
}
|
|
2688
|
-
},
|
|
2689
|
-
"scope_waves": {
|
|
2690
|
-
"type": "array",
|
|
2691
|
-
"description": "The same scopes as scope_files, grouped into dependency WAVES: no wave contains a scope that depends on one still in flight. Levelled by `probe resume` from each contract's own `depends_on` — declared in the same COMMITTED tier as the contracts it orders, so it survives the clone that a join through machine-local task ids never could. Under the edge-released scheduler this is an ORDER and a cross-check rather than a barrier: the orchestrator trusts `scope_deps` only when Kahn-levelling it reproduces this field, so an edge lost crossing the sub-agent boundary degrades to wave release instead of starting a scope early. ADDITIVE: a consumer that ignores it, or a tree where no contract declares `depends_on`, every declared id names a scope not in the run, or the relation is cyclic, gets a single wave containing everything, which is the unscheduled fixed-width fan-out this replaced.",
|
|
2692
|
-
"items": {
|
|
2693
|
-
"type": "array",
|
|
2694
|
-
"items": {
|
|
2695
|
-
"type": "string"
|
|
2696
|
-
}
|
|
2697
|
-
}
|
|
2698
|
-
},
|
|
2699
|
-
"scope_deps": {
|
|
2700
|
-
"type": "array",
|
|
2701
|
-
"description": "The dependency edges the waves were levelled from, as `[dependant, dependency]` pairs, so a scope can be released the moment ITS OWN dependencies are green rather than when its whole wave finishes. Same parse as scope_waves; the two validate each other. ADDITIVE — absent, unusable or disagreeing with scope_waves, release falls back to the wave boundary.",
|
|
2702
|
-
"items": {
|
|
2703
|
-
"type": "array",
|
|
2704
|
-
"items": {
|
|
2705
|
-
"type": "string"
|
|
2706
|
-
}
|
|
2707
|
-
}
|
|
2708
|
-
},
|
|
2709
|
-
"scope_exclusions": {
|
|
2710
|
-
"type": "array",
|
|
2711
|
-
"description": "Pairs of scopes that may not build AT THE SAME TIME because both declare a write to one path — `substrate.shared` is the sanctioned escape from the disjointness rule, so the lint passes it and the substrate wall permits that path to every live order. Measured: three concurrent writers to one entry point lost work in 20 of 20 trials, because an edit is read-modify-write and the later writer drops the earlier one silently. Unlike scope_deps these pairs are UNORDERED — neither scope waits for the other, they merely never overlap — and unlike a dependency they cost concurrency rather than buying correctness in sequence, which is why the release ceiling they imply is reported before a run spends anything.",
|
|
2712
|
-
"items": {
|
|
2713
|
-
"type": "array",
|
|
2714
|
-
"items": {
|
|
2715
|
-
"type": "string"
|
|
2716
|
-
}
|
|
2717
|
-
}
|
|
2718
|
-
},
|
|
2719
|
-
"pending_orders": {
|
|
2720
|
-
"type": "array",
|
|
2721
|
-
"items": {
|
|
2722
|
-
"type": "string"
|
|
2723
|
-
},
|
|
2724
|
-
"description": "Order files with no result beside them. Diagnostic only — build orders carry no scope id, so this set is not an audit trail of build dispatches (see harness compile's order-id note)."
|
|
2725
|
-
},
|
|
2726
|
-
"eval_rounds_done": {
|
|
2727
|
-
"type": "array",
|
|
2728
|
-
"items": {
|
|
2729
|
-
"type": "integer"
|
|
2730
|
-
},
|
|
2731
|
-
"description": "Round numbers whose evaluate-r<n>.json holds a verdict the run may act on (PASS/FAIL, citing T0 artifacts when the spec is scoped) — the resumed run's round counter starts one past the maximum. A refused or uncited round is not done: the relaunch re-enters it."
|
|
2732
|
-
},
|
|
2733
|
-
"next_phase": {
|
|
2734
|
-
"type": "string",
|
|
2735
|
-
"enum": [
|
|
2736
|
-
"orient",
|
|
2737
|
-
"analyze",
|
|
2738
|
-
"wire",
|
|
2739
|
-
"map-scopes",
|
|
2740
|
-
"build"
|
|
2741
|
-
],
|
|
2742
|
-
"description": "The first phase whose artifacts are incomplete. Derived from the booleans above, in that order. The same table (harness probe resume PHASE_ARTIFACT) answers `--require <phase>`, the post-condition shapeup-run.js checks after every phase dispatch — resume and completion are ONE predicate by construction."
|
|
2743
|
-
}
|
|
2744
|
-
}
|
|
2745
|
-
},
|
|
2746
1886
|
"RunArgs": {
|
|
2747
|
-
"description": "
|
|
2748
|
-
"x-tier": "
|
|
2749
|
-
"x-location": ".shapeup/<slug>/run-args.json — written fresh
|
|
2750
|
-
"x-writer": "harness init run
|
|
2751
|
-
"x-readers": "the
|
|
2752
|
-
"x-not-here": "Run config the LEDGER already carries does NOT get a second home in
|
|
1887
|
+
"description": "The launch record — what a run was launched with, resolved once and written to .shapeup/<slug>/run-args.json by `harness init run` in the same act as the receipt. Every switch the operator typed lands here or does nothing: the loop that drives the run reads nothing but this record and the artifacts, and the loop reads `noEval` to refuse writing a PASS report over a run launched with no evaluation. The model floor (sonnet or above for `exec` and, unless `noEval`, `eval`) is enforced when the record is written and again when the loop reads it.",
|
|
1888
|
+
"x-tier": "LOCAL",
|
|
1889
|
+
"x-location": ".shapeup/<slug>/run-args.json — written fresh when a run is opened (and again by `init run --force`); an already-open run keeps the record it has",
|
|
1890
|
+
"x-writer": "harness init run (kernel), from the same parsed argv as the receipt",
|
|
1891
|
+
"x-readers": "harness probe next (the loop's state machine), harness reduce ship (the no-evaluation guard), harness probe resume",
|
|
1892
|
+
"x-not-here": "Run config the LEDGER already carries does NOT get a second home in the record — eval_dimensions, lens, spec_folder, stack, run_cmd, app_url are read off harness-run.md frontmatter, so a copy here would be a second source that can disagree with the first. The record carries what no artifact on disk holds: identity, budgets, the model matrix, pluginRoot, startedAt, and the skip switches (noEval, noQa).",
|
|
2753
1893
|
"type": "object",
|
|
2754
1894
|
"required": [
|
|
2755
1895
|
"slug",
|
|
@@ -2766,7 +1906,7 @@
|
|
|
2766
1906
|
},
|
|
2767
1907
|
"runId": {
|
|
2768
1908
|
"type": "string",
|
|
2769
|
-
"description": "
|
|
1909
|
+
"description": "The run key, copied from the receipt `harness init run` wrote in the same act. Identity, not run config the ledger already carries; the receipt stays the source of truth.",
|
|
2770
1910
|
"pattern": "^[a-z0-9][a-z0-9-]*-[0-9]{8}T[0-9]{6}Z-[0-9a-f]{8}$"
|
|
2771
1911
|
},
|
|
2772
1912
|
"autoLevel": {
|
|
@@ -2780,11 +1920,11 @@
|
|
|
2780
1920
|
},
|
|
2781
1921
|
"answers": {
|
|
2782
1922
|
"type": "string",
|
|
2783
|
-
"description": "A gate-answers preset name (ci|guarded|interactive) or a path to a gate-answers.json file — the ONLY thing that decides whether a gate crosses, pauses, or aborts."
|
|
1923
|
+
"description": "A gate-answers preset name (ci|guarded|interactive) or a path to a gate-answers.json file (`init run --gate-answers`) — the ONLY thing that decides whether a gate crosses, pauses, or aborts. The same input the receipt's config records as gate_answers."
|
|
2784
1924
|
},
|
|
2785
1925
|
"models": {
|
|
2786
1926
|
"type": "object",
|
|
2787
|
-
"description": "The L0.8 role -> model matrix, resolved once. The model floor: sonnet or above
|
|
1927
|
+
"description": "The L0.8 role -> model matrix, resolved once: a flag, else SHAPEUP_<ROLE>_MODEL, else sonnet; qa follows exec. The model floor: `exec` and `eval` are sonnet or above, refused at `init run`; `qa` is not checked, and `eval` is not under noEval.",
|
|
2788
1928
|
"properties": {
|
|
2789
1929
|
"exec": {
|
|
2790
1930
|
"type": "string"
|
|
@@ -2799,7 +1939,7 @@
|
|
|
2799
1939
|
},
|
|
2800
1940
|
"budgets": {
|
|
2801
1941
|
"type": "object",
|
|
2802
|
-
"description": "The two
|
|
1942
|
+
"description": "The two record-level circuit breakers (AGENTS.md) — outer round_budget, inner attempt_budget. The third, opt-in DEADLINE breaker (the wall-clock budget) is NOT a record field: it is typed at `harness init run --wall-clock-budget` and lands in the run receipt's `wall_clock_budget_s`, which `harness verify budget` reads directly.",
|
|
2803
1943
|
"properties": {
|
|
2804
1944
|
"maxRounds": {
|
|
2805
1945
|
"type": "integer"
|
|
@@ -2811,15 +1951,18 @@
|
|
|
2811
1951
|
},
|
|
2812
1952
|
"pluginRoot": {
|
|
2813
1953
|
"type": "string",
|
|
2814
|
-
"description": "
|
|
1954
|
+
"description": "The plugin copy the run was opened against — the root every kernel path in an order is spelled from."
|
|
2815
1955
|
},
|
|
2816
1956
|
"startedAt": {
|
|
2817
1957
|
"type": "string",
|
|
2818
|
-
"description": "ISO timestamp
|
|
1958
|
+
"description": "ISO timestamp the run was opened at, the same instant as the receipt's started_at."
|
|
2819
1959
|
},
|
|
2820
1960
|
"lane": {
|
|
2821
|
-
"
|
|
2822
|
-
"
|
|
1961
|
+
"type": "string",
|
|
1962
|
+
"enum": [
|
|
1963
|
+
"full"
|
|
1964
|
+
],
|
|
1965
|
+
"description": "The lane the launch asked for (`init run --lane full`). Only the full lane is served; the small-change lane retired and `tiny` is refused at the launch. Never rides in WorkOrderPayload."
|
|
2823
1966
|
},
|
|
2824
1967
|
"noEval": {
|
|
2825
1968
|
"type": "boolean",
|
|
@@ -2827,7 +1970,7 @@
|
|
|
2827
1970
|
},
|
|
2828
1971
|
"noQa": {
|
|
2829
1972
|
"type": "boolean",
|
|
2830
|
-
"description": "If true, skips the QA Edge Hunt (`--no-qa`). Rides here for the same reason as noEval: no frontmatter line carries it. It is declared because the
|
|
1973
|
+
"description": "If true, skips the QA Edge Hunt (`--no-qa`). Rides here for the same reason as noEval: no frontmatter line carries it. It is declared because the loop reads it — a switch the record omits is a documented flag that does nothing."
|
|
2831
1974
|
},
|
|
2832
1975
|
"maxParallelScopes": {
|
|
2833
1976
|
"type": "integer",
|
|
@@ -2840,128 +1983,6 @@
|
|
|
2840
1983
|
"description": "If true, each FAIL finding gets one independent skeptic before it costs a whole fix round (`--adversarial-verify`). Off by default: it is a pure addition that spends one sub-agent per finding, and the single-judge invariant is unaffected — a refutation retracts a finding, it never issues a verdict."
|
|
2841
1984
|
}
|
|
2842
1985
|
}
|
|
2843
|
-
},
|
|
2844
|
-
"RunReturn": {
|
|
2845
|
-
"description": "C1 — the return half of the workflow's only conversation. The ONLY way the workflow speaks back to tech-lead, so it is a tagged union keyed on `status` — the skill branches on the tag, never on prose (the same exit-code discipline harness gate already applies to gate sign-off, extended to the orchestrator's own return value). A gate resolved 'ask' (exit 4) always returns `paused`; a gate resolved 'abort' (exit 5) always returns `aborted`; any circuit breaker tripping (outer round_budget, inner attempt_budget, or the deadline breaker) returns `gate_h`; a full run whose final EVAL passes returns `shipped`. The union is written as a superset of what one inner round can itself produce (`paused`, `aborted`, `gate_h`, or a round-complete carrying a verdict) — `shipped` belongs only to a full run. It is deliberately NOT narrowed, because the round-scoped subset is what a `workflow()` child would return if the fan-out this design anticipates ever spends that nesting level.",
|
|
2846
|
-
"x-tier": "EMBEDDED",
|
|
2847
|
-
"x-location": "in-memory only — a Workflow return value, never written to disk",
|
|
2848
|
-
"x-writer": "the workflow runtime (shapeup-run — the sole writer)",
|
|
2849
|
-
"x-readers": "tech-lead (branches on `status`, emits `block` verbatim on a pause, never re-summarizes it)",
|
|
2850
|
-
"type": "object",
|
|
2851
|
-
"required": [
|
|
2852
|
-
"status"
|
|
2853
|
-
],
|
|
2854
|
-
"properties": {
|
|
2855
|
-
"status": {
|
|
2856
|
-
"type": "string",
|
|
2857
|
-
"enum": [
|
|
2858
|
-
"shipped",
|
|
2859
|
-
"paused",
|
|
2860
|
-
"aborted",
|
|
2861
|
-
"gate_h",
|
|
2862
|
-
"ok"
|
|
2863
|
-
],
|
|
2864
|
-
"description": "shipped = the happy ending (outer run only) · paused = a gate resolved 'ask', relaunch after a recorded decision · aborted = a gate resolved 'abort', attributable stop · gate_h = a circuit breaker tripped, ship what is green · ok = one inner round completed (build+eval), not itself a ship — the outer loop decides whether to loop again."
|
|
2865
|
-
},
|
|
2866
|
-
"verdict": {
|
|
2867
|
-
"type": "string",
|
|
2868
|
-
"enum": [
|
|
2869
|
-
"pass",
|
|
2870
|
-
"fail",
|
|
2871
|
-
"not-evaluated"
|
|
2872
|
-
],
|
|
2873
|
-
"description": "shipped | ok: the round or run's EVAL verdict, lowercased from spec-evaluator's PASS|FAIL — or `not-evaluated` when a `shipped` return closed a `--no-eval` run, which reaches SHIP without ever dispatching the judge. Recorded plainly, never upgraded to `pass` (references/protocol.md)."
|
|
2874
|
-
},
|
|
2875
|
-
"rounds_used": {
|
|
2876
|
-
"type": "integer"
|
|
2877
|
-
},
|
|
2878
|
-
"dims_evaluated": {
|
|
2879
|
-
"type": "array",
|
|
2880
|
-
"items": {
|
|
2881
|
-
"type": "string"
|
|
2882
|
-
},
|
|
2883
|
-
"description": "The dimensions the last evaluate order named: the set the PO chose at L0.5, or the one resolved from the spec."
|
|
2884
|
-
},
|
|
2885
|
-
"dims_not_evaluated": {
|
|
2886
|
-
"type": "array",
|
|
2887
|
-
"items": {
|
|
2888
|
-
"type": "string"
|
|
2889
|
-
}
|
|
2890
|
-
},
|
|
2891
|
-
"qa_findings": {
|
|
2892
|
-
"type": "integer"
|
|
2893
|
-
},
|
|
2894
|
-
"qa": {
|
|
2895
|
-
"type": "string",
|
|
2896
|
-
"enum": ["run", "not-hunted", "skipped"],
|
|
2897
|
-
"description": "What QA amounted to: run (at least one charter ran), not-hunted (the hunt returned and ran no charter), skipped (--no-qa or the QA gate answered skip). qa_findings is 0 in the last two for different reasons."
|
|
2898
|
-
},
|
|
2899
|
-
"report": {
|
|
2900
|
-
"type": "string",
|
|
2901
|
-
"description": "shipped: shapeup/<slug>/REPORT.md path."
|
|
2902
|
-
},
|
|
2903
|
-
"state_warnings": {
|
|
2904
|
-
"type": "array",
|
|
2905
|
-
"items": {
|
|
2906
|
-
"type": "string"
|
|
2907
|
-
},
|
|
2908
|
-
"description": "shipped | gate_h: bookkeeping writes that did not take (a ledger status that read back wrong), carried on the ONE channel a headless launch preserves. The workflow's own log() goes to the progress narrator and `claude -p` stdout carries only the final message, so a run that returned `shipped` over a ledger still reading `evaluating` could not be told from one that warned about it. Absent when every state write took. Diagnostic, never a status: a lost bookkeeping write is a degraded digest, not a corrupted build."
|
|
2909
|
-
},
|
|
2910
|
-
"round": {
|
|
2911
|
-
"type": "integer",
|
|
2912
|
-
"description": "ok: which round this return describes."
|
|
2913
|
-
},
|
|
2914
|
-
"paused_at": {
|
|
2915
|
-
"type": "string",
|
|
2916
|
-
"description": "paused: the gate id that resolved 'ask' (e.g. L1b, L2, L3)."
|
|
2917
|
-
},
|
|
2918
|
-
"block": {
|
|
2919
|
-
"type": "string",
|
|
2920
|
-
"description": "paused: the ⏸ gate block, emitted VERBATIM by the skill — the block is the handoff contract; re-phrasing it is the paraphrase channel this design exists to close."
|
|
2921
|
-
},
|
|
2922
|
-
"valid_decisions": {
|
|
2923
|
-
"type": "array",
|
|
2924
|
-
"items": {
|
|
2925
|
-
"type": "string"
|
|
2926
|
-
},
|
|
2927
|
-
"description": "paused: the decisions VALID_BY_GATE allows at this gate (harness gate)."
|
|
2928
|
-
},
|
|
2929
|
-
"context": {
|
|
2930
|
-
"type": "object",
|
|
2931
|
-
"description": "paused: whatever facts the paused gate needs the PO to see (round, scope counts, spec_lint status, …)."
|
|
2932
|
-
},
|
|
2933
|
-
"aborted_at": {
|
|
2934
|
-
"type": "string",
|
|
2935
|
-
"description": "aborted: the gate id that resolved 'abort'."
|
|
2936
|
-
},
|
|
2937
|
-
"reason": {
|
|
2938
|
-
"type": "string",
|
|
2939
|
-
"description": "aborted: the attributable reason (harness gate's own `reason` field, carried through verbatim)."
|
|
2940
|
-
},
|
|
2941
|
-
"breaker": {
|
|
2942
|
-
"type": "string",
|
|
2943
|
-
"enum": [
|
|
2944
|
-
"outer",
|
|
2945
|
-
"inner",
|
|
2946
|
-
"deadline"
|
|
2947
|
-
],
|
|
2948
|
-
"description": "gate_h: which of the three breakers fired (AGENTS.md's three-level circuit breaker)."
|
|
2949
|
-
},
|
|
2950
|
-
"hammer_proposals": {
|
|
2951
|
-
"type": "array",
|
|
2952
|
-
"items": {
|
|
2953
|
-
"type": "string"
|
|
2954
|
-
},
|
|
2955
|
-
"description": "gate_h | ok: scope ids queued for GATE H's census (scope-hammer) — an exhausted scope never blocks the round, it proposes."
|
|
2956
|
-
},
|
|
2957
|
-
"green_scopes": {
|
|
2958
|
-
"type": "array",
|
|
2959
|
-
"items": {
|
|
2960
|
-
"type": "string"
|
|
2961
|
-
},
|
|
2962
|
-
"description": "gate_h | ok: scope ids that reached T0-green this round."
|
|
2963
|
-
}
|
|
2964
|
-
}
|
|
2965
1986
|
}
|
|
2966
1987
|
}
|
|
2967
1988
|
}
|