@smartmemory/compose 0.1.27-beta → 0.1.29-beta
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/skills/compose/SKILL.md +5 -2
- package/.claude/skills/compose/templates/boundary-map.md +94 -0
- package/bin/compose.js +27 -0
- package/contracts/task-result.json +60 -0
- package/contracts/taskgraph-gsd.json +94 -0
- package/dist/assets/{App-Dj7XWWxC.js → App-DyRUFvbx.js} +67 -67
- package/dist/assets/{_baseUniq-tNOA7dYy.js → _baseUniq-6fxo8lI4.js} +1 -1
- package/dist/assets/{arc-BAmAJ19S.js → arc-ElMd2B94.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-BPWGVKHW.js → architectureDiagram-Q4EWVU46-CYkxf4MU.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-CVlFbWKF.js → blockDiagram-DXYQGD6D-BEbnyY6z.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-CqzLpnSp.js → c4Diagram-AHTNJAMY-Bo5yMBT9.js} +1 -1
- package/dist/assets/channel-BZuHuJYj.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-D27n9FGy.js → chunk-4BX2VUAB-BETV09jq.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-BNXf8s1x.js → chunk-4TB4RGXK-Dbuohq0Y.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-kGd4Gwx6.js → chunk-55IACEB6-CDVuU3Ew.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-Ci9gWeIv.js → chunk-EDXVE4YY-DjkbltSG.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-B-C0Qn-h.js → chunk-FMBD7UC4-Dz2qczuu.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-CosYsxuv.js → chunk-OYMX7WX6-XJH4cbpv.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-DV2v0Qii.js → chunk-QZHKN3VN-DPhBd22Q.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-BlgKQRCn.js → chunk-YZCP3GAM-C-DPngtC.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-DTItsUL2.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-DTItsUL2.js +1 -0
- package/dist/assets/clone-BM9Hd7mq.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-CSkzhGHO.js → cose-bilkent-S5V4N54A-CN-sdzRq.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-zp76534d.js → dagre-KV5264BT-HcBmaeC1.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-CAsORZBT.js → diagram-5BDNPKRD-DeMZN1_c.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-Da2z6fvR.js → diagram-G4DWMVQ6-DAVSapDS.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-R9NZEWPF.js → diagram-MMDJMWI5-WiLMNWTz.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-DXabRna8.js → diagram-TYMM5635-CjfaWKT0.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-B1zsRPqn.js → erDiagram-SMLLAGMA-DUT_laNT.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-AvlZ6pTE.js → flowDiagram-DWJPFMVM-J9uyMWkp.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-Bnj-jTcM.js → ganttDiagram-T4ZO3ILL-Cee_YjtS.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-82ysfuqG.js → gitGraphDiagram-UUTBAWPF-B1jNNoiW.js} +1 -1
- package/dist/assets/{graph-6nRhlKgL.js → graph-DV5DY72d.js} +1 -1
- package/dist/assets/{index-CF7jc-By.js → index-D5Mh04yh.js} +2 -2
- package/dist/assets/{infoDiagram-42DDH7IO-DSGEEGYr.js → infoDiagram-42DDH7IO-m1jIMAlx.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-COnZHJuM.js → ishikawaDiagram-UXIWVN3A-BC7DwQNb.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-Bsssj2jr.js → journeyDiagram-VCZTEJTY-BOCgv7m4.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-1o5Em0Ia.js → kanban-definition-6JOO6SKY-Fu0eFxr1.js} +1 -1
- package/dist/assets/{layout-C6Mitjz_.js → layout-C-R3-tDf.js} +1 -1
- package/dist/assets/{linear-DoGSpDWQ.js → linear-NOMW_E2I.js} +1 -1
- package/dist/assets/{min-BqH4I4oK.js → min-B7SuZW29.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-79V6zmXV.js → mindmap-definition-QFDTVHPH-BPwx_SxA.js} +1 -1
- package/dist/assets/{pieDiagram-DEJITSTG-nXz4HiT6.js → pieDiagram-DEJITSTG-DdBjaXTu.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-BuwKLcii.js → quadrantDiagram-34T5L4WZ-D_K_ZMnx.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-9YEiDjlT.js → requirementDiagram-MS252O5E-XlROD_VH.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6-gX8lhWn5.js → sankeyDiagram-XADWPNL6-Sl0FllYQ.js} +1 -1
- package/dist/assets/{sequenceDiagram-FGHM5R23-CkssrD67.js → sequenceDiagram-FGHM5R23-D22asQ-_.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-DPmEy2eV.js → stateDiagram-FHFEXIEX-BnCepkBg.js} +1 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-DD_YjrTQ.js +1 -0
- package/dist/assets/{timeline-definition-GMOUNBTQ-DGpUOjs3.js → timeline-definition-GMOUNBTQ-gdlx6TEB.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-CIvkd661.js → vennDiagram-DHZGUBPP-wy4YzhrG.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-BqRTpa3K.js → wardley-RL74JXVD-D0T_uQ79.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-B93hOd7R.js → wardleyDiagram-NUSXRM2D-Ds2dLjs8.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-C6hwimqo.js → xychartDiagram-5P7HB3ND-CLgTTXkj.js} +1 -1
- package/dist/index.html +1 -1
- package/lib/boundary-map.js +481 -0
- package/lib/gsd-blackboard.js +135 -0
- package/lib/gsd-decompose-enrich.js +171 -0
- package/lib/gsd-prompt.js +82 -0
- package/lib/gsd.js +364 -0
- package/package.json +1 -1
- package/pipelines/build.stratum.yaml +7 -2
- package/pipelines/gsd.stratum.yaml +141 -0
- package/dist/assets/channel-Ddcaj0fR.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-DfGxrNIN.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-DfGxrNIN.js +0 -1
- package/dist/assets/clone-DVujR_lO.js +0 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-BGZzYkLq.js +0 -1
|
@@ -182,6 +182,7 @@ Present all proposals, trade-offs, your recommendation. User picks. Write to `do
|
|
|
182
182
|
- Read every critical file, note patterns with line references
|
|
183
183
|
- Build corrections table (spec assumption vs reality)
|
|
184
184
|
- Write to `docs/features/<feature-code>/blueprint.md`
|
|
185
|
+
- **Boundary Map (when feature has 2+ work units):** append a `## Boundary Map` section per `.claude/skills/compose/templates/boundary-map.md`. Each entry must name a concrete code symbol with a kind in `{interface, type, function, class, const, hook, component}`. Endpoints, event payloads, file formats, and invariants belong in prose, not in Boundary Map entries.
|
|
185
186
|
|
|
186
187
|
**Gate:** Corrections table empty or all corrections documented.
|
|
187
188
|
|
|
@@ -194,11 +195,13 @@ For every file:line reference in the blueprint:
|
|
|
194
195
|
4. Confirm imports/exports
|
|
195
196
|
5. Flag stale references
|
|
196
197
|
|
|
198
|
+
If the blueprint contains a `## Boundary Map` section, run `validateBoundaryMap` from `lib/boundary-map.js` against the blueprint. Append every violation as a row in the Verification Table; warnings render as informational rows but do not block the gate. The four checks are: File-Plan-or-disk, symbol presence (untouched dependencies only), topology (every `from S##` references an earlier slice), producer/consumer match.
|
|
199
|
+
|
|
197
200
|
Produce a verification table, append to `blueprint.md`. If any stale/wrong, loop back to Phase 4.
|
|
198
201
|
|
|
199
|
-
**Gate:** All file:line references verified. Zero stale entries.
|
|
202
|
+
**Gate:** All file:line references verified. Zero stale entries. Zero Boundary Map violations (warnings allowed).
|
|
200
203
|
|
|
201
|
-
**Skip when:** Blueprint written in the same session immediately after reading all referenced files.
|
|
204
|
+
**Skip when:** Blueprint written in the same session immediately after reading all referenced files **and** the blueprint has no Boundary Map.
|
|
202
205
|
|
|
203
206
|
## Fix Mode Phases (F1–F3)
|
|
204
207
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Boundary Map — Authoring Template
|
|
2
|
+
|
|
3
|
+
A **Boundary Map** is an opt-in `## Boundary Map` section inside `blueprint.md` that declares, at file→symbol granularity, what each slice (sub-feature, parallel task, or work unit) **produces** and **consumes**. The Phase 5 verifier runs `validateBoundaryMap` from `lib/boundary-map.js` against any Boundary Map present.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## When to author
|
|
8
|
+
|
|
9
|
+
If your feature has **2+ work units** (slices, sub-features, or parallel tasks under STRAT-PAR), append a `## Boundary Map` section **after `## File Plan`** and **before `## Verification Table`**.
|
|
10
|
+
|
|
11
|
+
Single-unit features have no boundaries to map — skip it.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Format spec
|
|
16
|
+
|
|
17
|
+
```markdown
|
|
18
|
+
## Boundary Map
|
|
19
|
+
|
|
20
|
+
### S01: auth primitives
|
|
21
|
+
Produces:
|
|
22
|
+
src/lib/auth/types.ts → User, Session, AuthToken (interface)
|
|
23
|
+
src/lib/auth/tokens.ts → generateToken, verifyToken, refreshToken (function)
|
|
24
|
+
|
|
25
|
+
Consumes: nothing (leaf node)
|
|
26
|
+
|
|
27
|
+
### S02: HTTP layer
|
|
28
|
+
Produces:
|
|
29
|
+
src/server/api/auth/login.ts → loginHandler (function)
|
|
30
|
+
src/server/middleware/auth.ts → authMiddleware (function)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
Consumes:
|
|
35
|
+
from S01: src/lib/auth/tokens.ts → generateToken, verifyToken
|
|
36
|
+
|
|
37
|
+
### S03: client integration
|
|
38
|
+
Produces:
|
|
39
|
+
src/client/auth/useAuth.ts → useAuth (hook)
|
|
40
|
+
|
|
41
|
+
Consumes:
|
|
42
|
+
from S01: src/lib/auth/types.ts → User, Session
|
|
43
|
+
from S02: src/server/api/auth/login.ts → loginHandler
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Grammar
|
|
49
|
+
|
|
50
|
+
- **Slice headings:** `### S## [: <human name>]`. The `S##` id is mandatory and must be unique within the blueprint. Names are human guidance, not parsed.
|
|
51
|
+
- **Produces entries:** `<file-path> → <symbol>[, <symbol>...] (<kind>)`. The `(<kind>)` parenthetical is **mandatory** on every Produces line.
|
|
52
|
+
- **Consumes entries:** `from S##: <file-path> → <symbol>[, <symbol>...]`. The trailing `(<kind>)` is optional and ignored — the kind already lives on the matching upstream Produces entry.
|
|
53
|
+
- **Leaf slices** (no upstream dependencies) use the literal form `Consumes: nothing`. An optional trailing parenthetical comment such as `(leaf node)` is ignored.
|
|
54
|
+
- **Sink slices** (no downstream-visible exports — integration-only slices) use the literal form `Produces: nothing`. An optional trailing parenthetical comment such as `(integration only)` is ignored.
|
|
55
|
+
- **Arrows:** both `→` (U+2192, preferred) and ASCII `->` are accepted.
|
|
56
|
+
- **File paths** are repo-relative.
|
|
57
|
+
- **Symbols** are identifiers expected to appear (or eventually appear) in the named file.
|
|
58
|
+
|
|
59
|
+
### Kind allow-list
|
|
60
|
+
|
|
61
|
+
`<kind>` must be one of:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
interface, type, function, class, const, hook, component
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Symbol-only restriction
|
|
68
|
+
|
|
69
|
+
Boundary Map entries name **code symbols only**. Endpoints, event payloads, file formats, and invariants belong in the surrounding blueprint prose — they are not grep-checkable identifiers and are out of scope for the v1 validator.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## What the validator checks
|
|
74
|
+
|
|
75
|
+
Phase 5 runs `validateBoundaryMap({ blueprintText, blueprintPath, repoRoot })` and applies four checks in order:
|
|
76
|
+
|
|
77
|
+
1. **File-Plan-or-disk.** Every referenced file must either appear in the blueprint's File Plan with an allow-listed write action (`new`, `create`, `add`, `edit`, `modify`, `update`, `refactor`, `replace`) **or** exist on disk.
|
|
78
|
+
2. **Symbol presence.** For files **not** marked as planned writes that exist on disk, each declared symbol must appear (substring match) somewhere in the file. Files in the File Plan as planned writes are skipped — the symbol may legitimately not exist yet.
|
|
79
|
+
3. **Topology.** Every `from S##` reference must point to a slice that appears earlier in the map (backward edges only; the consumes-graph is acyclic by construction).
|
|
80
|
+
4. **Producer/consumer match.** Every consumed `(file, symbol)` must be declared as a Produces entry on the named upstream slice with a matching file and a superset of symbols.
|
|
81
|
+
|
|
82
|
+
Violations block the Phase 5 gate; warnings (`no_file_plan`, `unknown_action`) render as informational rows but do not block.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Worked example: 3-slice auth feature
|
|
87
|
+
|
|
88
|
+
The example above (S01: auth primitives → S02: HTTP layer → S03: client integration) demonstrates:
|
|
89
|
+
|
|
90
|
+
- A **leaf slice** (S01) using `Consumes: nothing (leaf node)`.
|
|
91
|
+
- **Multiple kinds** in a single slice (S01 has both `interface` and `function` Produces).
|
|
92
|
+
- **Multi-symbol** Produces and Consumes entries (S01 produces three tokens; S02 consumes two of them).
|
|
93
|
+
- **Cross-slice fan-in** (S03 consumes from both S01 and S02).
|
|
94
|
+
- **Backward-only edges** — every `from S##` references an earlier slice.
|
package/bin/compose.js
CHANGED
|
@@ -112,6 +112,7 @@ if (!cmd || cmd === '--help' || cmd === '-h') {
|
|
|
112
112
|
console.log(' feature Add a single feature (folder, design seed, ROADMAP entry)')
|
|
113
113
|
console.log(' build Run a feature through the headless lifecycle')
|
|
114
114
|
console.log(' fix Run a bug through the headless bug-fix lifecycle')
|
|
115
|
+
console.log(' gsd Per-task fresh-context dispatch from existing blueprint+Boundary Map')
|
|
115
116
|
console.log(' pipeline View and edit the build pipeline')
|
|
116
117
|
console.log(' roadmap Show roadmap status and next buildable features')
|
|
117
118
|
console.log(' roadmap generate Regenerate ROADMAP.md from feature.json files')
|
|
@@ -1913,6 +1914,32 @@ if (cmd === 'build') {
|
|
|
1913
1914
|
process.exit(1)
|
|
1914
1915
|
})
|
|
1915
1916
|
})
|
|
1917
|
+
} else if (cmd === 'gsd') {
|
|
1918
|
+
// compose gsd <feature-code> — runs the per-task fresh-context dispatch
|
|
1919
|
+
// pipeline (pipelines/gsd.stratum.yaml). Hard-requires existing
|
|
1920
|
+
// docs/features/<code>/blueprint.md with a parseable Boundary Map.
|
|
1921
|
+
const gsdCode = args.find(a => !a.startsWith('-'))
|
|
1922
|
+
if (!gsdCode) {
|
|
1923
|
+
console.error('Usage: compose gsd <feature-code>')
|
|
1924
|
+
console.error('')
|
|
1925
|
+
console.error('Runs the per-task fresh-context dispatch pipeline (COMP-GSD-2).')
|
|
1926
|
+
console.error('Hard-requires docs/features/<code>/blueprint.md with a valid Boundary Map.')
|
|
1927
|
+
console.error('')
|
|
1928
|
+
console.error('Options:')
|
|
1929
|
+
console.error(' --cwd <path> Working directory (defaults to current)')
|
|
1930
|
+
process.exit(1)
|
|
1931
|
+
}
|
|
1932
|
+
const { root: gsdCwd } = resolveCwdWithWorkspace(args)
|
|
1933
|
+
const cwdIdx = args.indexOf('--cwd')
|
|
1934
|
+
const gsdAgentCwd = cwdIdx !== -1 ? resolve(args[cwdIdx + 1]) : gsdCwd
|
|
1935
|
+
const { runGsd } = await import('../lib/gsd.js')
|
|
1936
|
+
try {
|
|
1937
|
+
const result = await runGsd(gsdCode, { cwd: gsdAgentCwd })
|
|
1938
|
+
console.log(`gsd complete: ${result.blackboardEntries} task results captured.`)
|
|
1939
|
+
} catch (err) {
|
|
1940
|
+
console.error(`gsd failed: ${err.message}`)
|
|
1941
|
+
process.exit(1)
|
|
1942
|
+
}
|
|
1916
1943
|
} else if (cmd === 'triage') {
|
|
1917
1944
|
const triageCode = args.find(a => !a.startsWith('-'))
|
|
1918
1945
|
if (!triageCode) {
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "task-result.json",
|
|
4
|
+
"_source": "docs/features/COMP-GSD-2/blueprint.md",
|
|
5
|
+
"_roadmap": "COMP-GSD-2",
|
|
6
|
+
"title": "TaskResult",
|
|
7
|
+
"description": "Per-task post-execution capture written by the task agent at .compose/gsd/<featureCode>/results/<task_id>.json and committed as part of its diff. After execute step completion, runGsd walks the merged base cwd, reads each per-task file, and writes the consolidated blackboard.json. This schema is the post-execution audit/retro substrate (consumed by GSD-7 milestone reports), NOT a runtime channel between tasks.",
|
|
8
|
+
"type": "object",
|
|
9
|
+
"required": ["status", "files_changed", "summary", "produces", "gates", "attempts"],
|
|
10
|
+
"properties": {
|
|
11
|
+
"status": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"enum": ["passed", "failed"],
|
|
14
|
+
"description": "Whether the agent considered the task complete with all gates green."
|
|
15
|
+
},
|
|
16
|
+
"files_changed": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"items": { "type": "string" },
|
|
19
|
+
"description": "Repo-relative paths the agent touched in its worktree."
|
|
20
|
+
},
|
|
21
|
+
"summary": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "One- or two-paragraph machine-readable summary of what was done."
|
|
24
|
+
},
|
|
25
|
+
"produces": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"additionalProperties": { "type": "string" },
|
|
28
|
+
"description": "Realized symbol map: { symbolName: signature-or-shape-string }. Mirrors the task's declared produces but with the actually-implemented signatures."
|
|
29
|
+
},
|
|
30
|
+
"gates": {
|
|
31
|
+
"type": "array",
|
|
32
|
+
"items": { "$ref": "#/definitions/GateRun" },
|
|
33
|
+
"description": "One entry per gate command run. Array (not lint/build/test object) so arbitrary project-configured gateCommands are supported."
|
|
34
|
+
},
|
|
35
|
+
"attempts": {
|
|
36
|
+
"type": "integer",
|
|
37
|
+
"minimum": 0,
|
|
38
|
+
"description": "Number of internal TDD-loop iterations the agent took before declaring done."
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"additionalProperties": false,
|
|
42
|
+
"definitions": {
|
|
43
|
+
"GateRun": {
|
|
44
|
+
"type": "object",
|
|
45
|
+
"required": ["command", "status", "output"],
|
|
46
|
+
"properties": {
|
|
47
|
+
"command": { "type": "string", "minLength": 1 },
|
|
48
|
+
"status": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"enum": ["pass", "fail"]
|
|
51
|
+
},
|
|
52
|
+
"output": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"description": "Truncated stdout/stderr from the gate run (e.g., last 2000 chars)."
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"additionalProperties": false
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "taskgraph-gsd.json",
|
|
4
|
+
"_source": "docs/features/COMP-GSD-2/blueprint.md",
|
|
5
|
+
"_roadmap": "COMP-GSD-2",
|
|
6
|
+
"title": "TaskGraphGsd",
|
|
7
|
+
"description": "Output of the gsd pipeline's decompose_gsd step. Extends the bare TaskGraph (from build.stratum.yaml's decompose) with required produces/consumes per task, sourced from the blueprint's Boundary Map. Each task carries a rich `description` string pre-baked with the spec context that Stratum's parallel_dispatch interpolation cannot carry on its own.",
|
|
8
|
+
"type": "object",
|
|
9
|
+
"required": ["tasks"],
|
|
10
|
+
"properties": {
|
|
11
|
+
"tasks": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"minItems": 1,
|
|
14
|
+
"items": { "$ref": "#/definitions/Task" }
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"additionalProperties": false,
|
|
18
|
+
"definitions": {
|
|
19
|
+
"Task": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"required": ["id", "files_owned", "files_read", "depends_on", "description", "produces", "consumes"],
|
|
22
|
+
"properties": {
|
|
23
|
+
"id": { "type": "string", "minLength": 1 },
|
|
24
|
+
"files_owned": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"items": { "type": "string" },
|
|
27
|
+
"description": "Files this task may write. Must not overlap with other tasks' files_owned (enforced by no_file_conflicts ensure)."
|
|
28
|
+
},
|
|
29
|
+
"files_read": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"items": { "type": "string" },
|
|
32
|
+
"description": "Files this task may read but not write."
|
|
33
|
+
},
|
|
34
|
+
"depends_on": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"items": { "type": "string" },
|
|
37
|
+
"description": "Task ids that must complete before this one."
|
|
38
|
+
},
|
|
39
|
+
"description": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"minLength": 1,
|
|
42
|
+
"description": "Rich prompt fragment containing the per-task spec context (produces/consumes/slice/upstream summary/gates). Packed at decompose time because Stratum's parallel_dispatch only interpolates a fixed set of tokens."
|
|
43
|
+
},
|
|
44
|
+
"produces": {
|
|
45
|
+
"type": "array",
|
|
46
|
+
"items": { "$ref": "#/definitions/ProducesEntry" },
|
|
47
|
+
"description": "Symbols this task lands. Sourced from the matching Boundary Map slice."
|
|
48
|
+
},
|
|
49
|
+
"consumes": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"items": { "$ref": "#/definitions/ConsumesEntry" },
|
|
52
|
+
"description": "Symbols this task may import from upstream tasks (resolved at end-of-step merge in topological order)."
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"additionalProperties": true
|
|
56
|
+
},
|
|
57
|
+
"ProducesEntry": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"required": ["file", "symbols", "kind"],
|
|
60
|
+
"properties": {
|
|
61
|
+
"file": { "type": "string", "minLength": 1 },
|
|
62
|
+
"symbols": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"minItems": 1,
|
|
65
|
+
"items": { "type": "string" }
|
|
66
|
+
},
|
|
67
|
+
"kind": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"enum": ["interface", "type", "function", "class", "const", "hook", "component"],
|
|
70
|
+
"description": "Symbol kind. Mirrors lib/boundary-map.js KIND_ALLOWLIST."
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"additionalProperties": false
|
|
74
|
+
},
|
|
75
|
+
"ConsumesEntry": {
|
|
76
|
+
"type": "object",
|
|
77
|
+
"required": ["from", "file", "symbols"],
|
|
78
|
+
"properties": {
|
|
79
|
+
"from": {
|
|
80
|
+
"type": "string",
|
|
81
|
+
"pattern": "^S\\d{2,}$",
|
|
82
|
+
"description": "Upstream slice id (S01, S02, ...)."
|
|
83
|
+
},
|
|
84
|
+
"file": { "type": "string", "minLength": 1 },
|
|
85
|
+
"symbols": {
|
|
86
|
+
"type": "array",
|
|
87
|
+
"minItems": 1,
|
|
88
|
+
"items": { "type": "string" }
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"additionalProperties": false
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|