@smartmemory/compose 0.3.7 → 0.3.8
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/.compose-deps.json +1 -13
- package/README.md +72 -5
- package/bin/compose.js +470 -351
- package/bin/judgment-migrate.js +387 -0
- package/contracts/comp-obs-contract.schema.json +9 -3
- package/contracts/fluid-record.schema.json +209 -0
- package/contracts/lifecycle-backfill.schema.json +322 -0
- package/dist/assets/App-Z4MU-H_F.js +916 -0
- package/dist/assets/{_baseUniq-Bo837sRJ.js → _baseUniq-ClWoCPFl.js} +1 -1
- package/dist/assets/{arc-BafGpyqE.js → arc-DY26UIVo.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-BOBfUsqL.js → architectureDiagram-Q4EWVU46-6Ggq4DqJ.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-Dwodev1a.js → blockDiagram-DXYQGD6D-CH3Ked0l.js} +1 -1
- package/dist/assets/{browser-1ntj1-x_.js → browser-BWkrenen.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-CU_bhYag.js → c4Diagram-AHTNJAMY-Bk8dYilu.js} +1 -1
- package/dist/assets/channel-SnZzzh7k.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-p8WsDwnO.js → chunk-4BX2VUAB-BMR0XaAQ.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-B8h7-eR0.js → chunk-4TB4RGXK-JytR14a9.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-DxeEr98s.js → chunk-55IACEB6-B4Q97BCP.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-BYt8F151.js → chunk-EDXVE4YY-R_qarkSf.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-DGSOVeie.js → chunk-FMBD7UC4-C9s7KR9m.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-B-QdgYR2.js → chunk-OYMX7WX6-BySQzVxc.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-Du5UAZLs.js → chunk-QZHKN3VN-DdpSYZsW.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-C8JbNBSk.js → chunk-YZCP3GAM-iE_tzriw.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-CBu92dSH.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-CBu92dSH.js +1 -0
- package/dist/assets/clone-DgklGjHm.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-O1ESaqge.js → cose-bilkent-S5V4N54A-BdlU6ZX_.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-CPTmFPHw.js → dagre-KV5264BT-Cp3F5KTn.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-B3PNrWs5.js → diagram-5BDNPKRD-DiR6_2q_.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-Cscfr6vc.js → diagram-G4DWMVQ6-w0i-p5HX.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-CSfqZ-TM.js → diagram-MMDJMWI5-tIHhwUv3.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-Cg4aYS7W.js → diagram-TYMM5635-BAeY3B19.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-_ZqwG5pl.js → erDiagram-SMLLAGMA-Ckx_Knko.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-C83boxFT.js → flowDiagram-DWJPFMVM-DeoNka6J.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-CWnIjuEi.js → ganttDiagram-T4ZO3ILL-BmGnFbEg.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-DrMdxZfH.js → gitGraphDiagram-UUTBAWPF-Dk48IHsx.js} +1 -1
- package/dist/assets/{graph-RE4I7Ty7.js → graph-BNzKGvoy.js} +1 -1
- package/dist/assets/{graph-Bi99_6Yf.js → graph-CI_1htl0.js} +1 -1
- package/dist/assets/{index-Rm2RE-c0.js → index-BEfrNBp8.js} +3 -3
- package/dist/assets/index-yyrA5OZd.css +1 -0
- package/dist/assets/{infoDiagram-42DDH7IO-BLmP4Epr.js → infoDiagram-42DDH7IO-BRf827i0.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-yuWWshKN.js → ishikawaDiagram-UXIWVN3A-0kCZaeCM.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-BOfhaJov.js → journeyDiagram-VCZTEJTY-rvU7ayRt.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-Bbolde15.js → kanban-definition-6JOO6SKY-DpQwX1C5.js} +1 -1
- package/dist/assets/{layout-BSf33zm8.js → layout-BI8cXFPI.js} +1 -1
- package/dist/assets/{linear-AvSTWMqx.js → linear-a0glcDiw.js} +1 -1
- package/dist/assets/{min-QBM8H4xN.js → min-vPHfnXcC.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-BuvgtqIc.js → mindmap-definition-QFDTVHPH-D14eF-7C.js} +1 -1
- package/dist/assets/mobile-B7m9EO9D.js +17 -0
- package/dist/assets/{pieDiagram-DEJITSTG-DIzF16vh.js → pieDiagram-DEJITSTG-Cno-gETh.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-D-mbUIjS.js → quadrantDiagram-34T5L4WZ-BUQM1Hfm.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-CEs4kCLd.js → requirementDiagram-MS252O5E-pOXlN2-q.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6-DFsnCr9n.js → sankeyDiagram-XADWPNL6-Crynd3_b.js} +1 -1
- package/dist/assets/{sequenceDiagram-FGHM5R23-BEJYdTjQ.js → sequenceDiagram-FGHM5R23-D9fZdCM8.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-BBXs57uY.js → stateDiagram-FHFEXIEX-CW9qVec8.js} +1 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-DkVLzHbY.js +1 -0
- package/dist/assets/{timeline-definition-GMOUNBTQ-BGvLoVAY.js → timeline-definition-GMOUNBTQ-BcHzhm_8.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-9LaBTMe0.js → vennDiagram-DHZGUBPP-BfytJcWk.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-P4MEqMTP.js → wardley-RL74JXVD-DLj-IjyB.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-o-tmxnlC.js → wardleyDiagram-NUSXRM2D-Ds0Ue68c.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-Dpn7V6qk.js → xychartDiagram-5P7HB3ND-vjWDXFL6.js} +1 -1
- package/dist/index.html +3 -3
- package/lib/agent-string.js +7 -5
- package/lib/append-integrity.js +81 -0
- package/lib/backfill-evidence.js +109 -0
- package/lib/bug-escalation.js +9 -0
- package/lib/build-stream-schema.js +3 -1
- package/lib/build-stream-writer.js +25 -0
- package/lib/build.js +874 -170
- package/lib/canon-guard.js +28 -6
- package/lib/canon-override.js +196 -0
- package/lib/canon-registry.js +104 -0
- package/lib/cli-commands.js +144 -0
- package/lib/codex-preflight.js +26 -13
- package/lib/colleague/context.js +215 -0
- package/lib/colleague/writeback.js +95 -0
- package/lib/completion-gate.js +1421 -0
- package/lib/completion-writer.js +47 -47
- package/lib/consumer-fanout.js +105 -11
- package/lib/coverage-gate.js +200 -0
- package/lib/dir-lock.js +170 -0
- package/lib/dispatch-ledger.js +3 -3
- package/lib/feature-json.js +1 -1
- package/lib/feature-reconciler.js +8 -0
- package/lib/feature-validator.js +64 -1
- package/lib/feature-writer.js +57 -2
- package/lib/fluid/factory.js +167 -0
- package/lib/fluid/ideabox-dates.js +73 -0
- package/lib/fluid/ideabox-migrate.js +154 -0
- package/lib/fluid/ideabox-ops.js +585 -0
- package/lib/fluid/ideabox-view.js +146 -0
- package/lib/fluid/import-ideabox.js +186 -0
- package/lib/fluid/local-provider.js +606 -0
- package/lib/fluid/provider.js +684 -0
- package/lib/fluid/record-shape.js +214 -0
- package/lib/fluid/record-store.js +328 -0
- package/lib/fluid/render-ideabox.js +261 -0
- package/lib/fluid/schema.js +40 -0
- package/lib/fluid/smartmemory-provider.js +1695 -0
- package/lib/gsd.js +63 -23
- package/lib/guard-cli.js +175 -0
- package/lib/guard-custody.js +141 -0
- package/lib/guard-descriptors.js +530 -0
- package/lib/guard-enrol.js +254 -0
- package/lib/health-score.js +1 -1
- package/lib/ideabox-cli.js +315 -0
- package/lib/ideabox.js +121 -21
- package/lib/judgment/store/index.js +9 -1
- package/lib/judgment/store/records.js +1 -1
- package/lib/judgment/trace.js +380 -0
- package/lib/judgment-decision-write.js +277 -0
- package/lib/judgment-decisions.js +466 -0
- package/lib/judgment-gen.js +5 -1
- package/lib/judgment-writer.js +56 -2
- package/lib/lifecycle-modes.js +4 -4
- package/lib/lineage.js +400 -0
- package/lib/local-claude-connector.js +52 -1
- package/lib/maya-client.js +302 -0
- package/lib/maya-config.js +53 -0
- package/lib/maya-identity.js +283 -0
- package/lib/migrate-anon.js +5 -0
- package/lib/migrate-roadmap.js +15 -0
- package/lib/new.js +13 -1
- package/lib/pipeline-compat.js +104 -0
- package/lib/policy-catalog.js +295 -0
- package/lib/policy-check.js +0 -0
- package/lib/process-termination.js +98 -0
- package/lib/resolve-workspace.js +5 -1
- package/lib/result-normalizer.js +396 -199
- package/lib/roadmap-errors.js +65 -0
- package/lib/roadmap-preservers.js +24 -4
- package/lib/roadmap-residue.js +299 -0
- package/lib/smartmemory-client.js +614 -78
- package/lib/smartmemory-config.js +54 -0
- package/lib/smartmemory-ingest.js +19 -2
- package/lib/step-prompt.js +7 -6
- package/lib/stratum-engine.js +53 -4
- package/lib/stratum-mcp-client.js +271 -36
- package/lib/test-bootstrap.js +31 -0
- package/lib/tool-inventory.js +122 -0
- package/lib/version-check.js +91 -19
- package/lib/vision-writer.js +88 -1
- package/package.json +7 -6
- package/pipelines/bug-fix.stratum.yaml +205 -211
- package/pipelines/build-quick.profiles.json +12 -0
- package/pipelines/build-quick.stratum.yaml +263 -350
- package/pipelines/content.stratum.yaml +81 -77
- package/pipelines/coverage-sweep.stratum.yaml +49 -30
- package/pipelines/plan.stratum.yaml +76 -86
- package/pipelines/refactor.stratum.yaml +125 -125
- package/pipelines/research.stratum.yaml +56 -58
- package/pipelines/review-fix.profiles.json +6 -0
- package/pipelines/review-fix.stratum.yaml +110 -83
- package/presets/team-feature.profiles.json +6 -0
- package/presets/team-feature.stratum.yaml +93 -66
- package/presets/team-research.profiles.json +6 -0
- package/presets/team-research.stratum.yaml +89 -80
- package/presets/team-review.profiles.json +8 -0
- package/presets/team-review.stratum.yaml +98 -80
- package/scripts/cost-census.mjs +70 -0
- package/scripts/guard-sign/compose-guard-sign.sh +62 -0
- package/server/agent-health.js +22 -0
- package/server/agent-hooks.js +14 -1
- package/server/agent-server.js +5 -248
- package/server/agent-spawn.js +3 -4
- package/server/agent-workspace.js +294 -0
- package/server/build-routes.js +6 -5
- package/server/build-stream-bridge.js +53 -0
- package/server/cc-session-watcher.js +4 -1
- package/server/coalescing-buffer.js +7 -1
- package/server/completion-projection.js +228 -0
- package/server/compose-mcp-tools.js +109 -23
- package/server/compose-mcp.js +88 -882
- package/server/decision-event-emit.js +41 -2
- package/server/decision-event-id.js +17 -0
- package/server/decision-events-snapshot.js +3 -0
- package/server/design-routes.js +14 -8
- package/server/feature-scan.js +76 -2
- package/server/file-watcher.js +170 -21
- package/server/ideabox-routes.js +166 -224
- package/server/index.js +70 -100
- package/server/lifecycle-guard.js +240 -10
- package/server/lifecycle-phase-history.js +276 -0
- package/server/maya-routes.js +507 -0
- package/server/mcp-tool-defs.js +940 -0
- package/server/mcp-tool-policy.js +34 -2
- package/server/model-tiers.js +22 -5
- package/server/pipeline-routes.js +21 -11
- package/server/project-root.js +58 -19
- package/server/remote-utils.js +3 -1
- package/server/schema-validator.js +7 -1
- package/server/session-manager.js +5 -6
- package/server/session-routes.js +3 -1
- package/server/stratum-client.js +57 -10
- package/server/stratum-sync.js +6 -3
- package/server/summarizer.js +3 -4
- package/server/supervisor.js +0 -1
- package/server/vision-routes.js +208 -98
- package/server/vision-server.js +86 -23
- package/server/vision-store.js +60 -6
- package/server/vision-utils.js +3 -4
- package/server/workspace-activity.js +18 -0
- package/server/workspace-middleware.js +2 -2
- package/server/workspace-runtime.js +243 -0
- package/server/worktree-gc.js +1 -0
- package/dist/assets/App-PkZzHeMj.js +0 -894
- package/dist/assets/channel-qVK_qn4E.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-B8UcfC1q.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-B8UcfC1q.js +0 -1
- package/dist/assets/clone-Pu3RyLUh.js +0 -1
- package/dist/assets/index-LIwREYgH.css +0 -1
- package/dist/assets/mobile-BnXEOE3U.js +0 -17
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-BqKuX4rj.js +0 -1
- package/lib/staleness.js +0 -87
- package/server/ideabox-cache.js +0 -77
|
@@ -3,419 +3,332 @@
|
|
|
3
3
|
# label: "Quick Feature Build"
|
|
4
4
|
# description: "Trimmed build lifecycle for small additive work — design → implement → ship, single gate, Phase-7 enforcement preserved"
|
|
5
5
|
# category: development
|
|
6
|
-
# steps:
|
|
6
|
+
# steps: 16
|
|
7
7
|
# estimated_minutes: 45
|
|
8
8
|
#
|
|
9
9
|
# COMP-BUILD-QUICK: a trimmed variant of build.stratum.yaml. Symmetric to fix
|
|
10
10
|
# mode's Quick path. Collapses the full lifecycle to design → implement → ship:
|
|
11
|
-
# prd, architecture, blueprint, verification, plan, plan_gate
|
|
11
|
+
# prd, architecture, blueprint, verification, plan, plan_gate and report are
|
|
12
12
|
# OMITTED (not self-skipping). Phase-7 enforcement (parallel + codex review,
|
|
13
|
-
# coverage sweep, test review) is preserved
|
|
14
|
-
# shrinks.
|
|
13
|
+
# coverage sweep, generated-test review, TDD) is preserved — only phase
|
|
14
|
+
# ceremony shrinks.
|
|
15
15
|
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
# COMP-PIPELINE-QUARANTINE: re-authored from v0.3 to TS v1, which is what makes
|
|
17
|
+
# `compose build --quick` runnable again. It was NOT hand-converted: it is
|
|
18
|
+
# DERIVED from the already-migrated build.stratum.yaml by dropping exactly the
|
|
19
|
+
# seven steps above, which is precisely how the two differed in v0.3 (verified by
|
|
20
|
+
# diffing their v0.3 ancestors — the step lists were otherwise identical).
|
|
21
|
+
# Deriving from the migrated sibling means the fanout, subflow and gate-revise
|
|
22
|
+
# constructs are the reviewed ones from that conversion rather than a second,
|
|
23
|
+
# independently-guessed translation of the same v0.3 source.
|
|
24
|
+
#
|
|
25
|
+
# Three edges had to be rewired after the trim, each matching the choice the v0.3
|
|
26
|
+
# quick spec had already made:
|
|
27
|
+
# - design_gate approves straight to decompose (there is no plan_gate).
|
|
28
|
+
# - decompose reads the design doc, since there is no plan artifact. Its
|
|
29
|
+
# quick-path guardrail (stop and recommend the full build if the work turns
|
|
30
|
+
# out to be cross-cutting) is carried over verbatim.
|
|
31
|
+
# - docs follows test_review, since report is gone; the codex_review and
|
|
32
|
+
# coverage subflows take the design doc for `blueprint` and the feature
|
|
33
|
+
# description for `plan`.
|
|
34
|
+
#
|
|
35
|
+
# The quick path's escalation guardrail ("stop and recommend the full build if
|
|
36
|
+
# this turns out to be cross-cutting") is required in BOTH explore_design and
|
|
37
|
+
# decompose per COMP-BUILD-QUICK's blueprint. Deriving from `build` dropped the
|
|
38
|
+
# explore_design one, since `build` has no such guardrail; restored after review.
|
|
39
|
+
#
|
|
40
|
+
# Attempt budgets are inherited from build.stratum.yaml deliberately: build-quick
|
|
41
|
+
# IS build with phases removed, so a step that survives the trim should retry
|
|
42
|
+
# exactly as often as its counterpart in the pipeline it was cut from. That means
|
|
43
|
+
# they do NOT follow the `retries + 1` rule used when converting a spec from its
|
|
44
|
+
# own v0.x ancestor — there is no ancestor step here, only a sibling.
|
|
21
45
|
|
|
22
|
-
|
|
23
|
-
name: build
|
|
24
|
-
description: "Quick feature build — design → implement → ship (single design gate, Phase-7 enforcement preserved)"
|
|
25
|
-
input:
|
|
26
|
-
featureCode:
|
|
27
|
-
type: string
|
|
28
|
-
required: true
|
|
29
|
-
description:
|
|
30
|
-
type: string
|
|
31
|
-
required: true
|
|
32
|
-
pre_merge_gate:
|
|
33
|
-
type: array
|
|
34
|
-
required: false # COMP-PAR-MERGE-QUEUE-CONSUMER-RETRY: default-OFF per-task gate (lint+build), omitted unless capabilities.preMergeGate
|
|
46
|
+
version: 1
|
|
35
47
|
|
|
36
48
|
contracts:
|
|
37
49
|
PhaseResult:
|
|
38
|
-
phase:
|
|
39
|
-
artifact:
|
|
40
|
-
outcome:
|
|
41
|
-
summary:
|
|
50
|
+
phase: string
|
|
51
|
+
artifact: string
|
|
52
|
+
outcome: complete|skipped|failed
|
|
53
|
+
summary: string
|
|
54
|
+
plan_items: array?
|
|
55
|
+
files_changed: string[]?
|
|
56
|
+
commit_hash: string?
|
|
42
57
|
|
|
43
|
-
# Canonical review output — produced by both review_check (Codex) and parallel_review (Claude).
|
|
44
|
-
# Schema source: compose/contracts/review-result.json (_roadmap: STRAT-CLAUDE-EFFORT-PARITY)
|
|
45
58
|
ReviewResult:
|
|
46
|
-
clean:
|
|
47
|
-
summary:
|
|
48
|
-
findings:
|
|
49
|
-
meta:
|
|
50
|
-
lenses_run:
|
|
51
|
-
auto_fixes:
|
|
52
|
-
asks:
|
|
59
|
+
clean: boolean
|
|
60
|
+
summary: string
|
|
61
|
+
findings: array
|
|
62
|
+
meta: object
|
|
63
|
+
lenses_run: string[]
|
|
64
|
+
auto_fixes: array
|
|
65
|
+
asks: array
|
|
53
66
|
|
|
54
67
|
TestResult:
|
|
55
|
-
passing:
|
|
56
|
-
summary:
|
|
57
|
-
failures:
|
|
68
|
+
passing: boolean
|
|
69
|
+
summary: string
|
|
70
|
+
failures: string[]
|
|
58
71
|
|
|
59
72
|
TaskGraph:
|
|
60
|
-
tasks:
|
|
73
|
+
tasks: object[]
|
|
61
74
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
confidence_gate: {type: number}
|
|
67
|
-
exclusions: {type: string}
|
|
75
|
+
TaskResult:
|
|
76
|
+
outcome: string
|
|
77
|
+
summary: string
|
|
78
|
+
files_changed: string[]?
|
|
68
79
|
|
|
69
80
|
TriageResult:
|
|
70
|
-
tasks:
|
|
71
|
-
|
|
72
|
-
functions:
|
|
73
|
-
design_gate:
|
|
74
|
-
mode: gate
|
|
75
|
-
timeout: 3600
|
|
76
|
-
|
|
77
|
-
ship_gate:
|
|
78
|
-
mode: gate
|
|
79
|
-
timeout: 1800
|
|
81
|
+
tasks: object[]
|
|
80
82
|
|
|
81
83
|
flows:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
#
|
|
85
|
-
# fires with a recovery_agent configured on the parent flow step.
|
|
84
|
+
entry: build
|
|
85
|
+
|
|
86
|
+
# Task-only subflow: cross-model implementation review.
|
|
86
87
|
review_check:
|
|
87
88
|
input:
|
|
88
|
-
task:
|
|
89
|
-
blueprint:
|
|
90
|
-
|
|
89
|
+
task: string
|
|
90
|
+
blueprint: string
|
|
91
|
+
reviewer_agent: string
|
|
92
|
+
output:
|
|
93
|
+
from: "${review.output}"
|
|
94
|
+
contract: ReviewResult
|
|
91
95
|
steps:
|
|
92
96
|
- id: review
|
|
93
|
-
agent:
|
|
94
|
-
|
|
97
|
+
agent: "$.input.reviewer_agent"
|
|
98
|
+
do: >
|
|
95
99
|
Review the implementation against the blueprint and task.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
confidence_gate: "7"
|
|
101
|
-
output_contract: ReviewResult
|
|
100
|
+
Task: ${input.task}
|
|
101
|
+
Blueprint: ${input.blueprint}
|
|
102
|
+
Return the canonical ReviewResult shape.
|
|
103
|
+
out: ReviewResult
|
|
102
104
|
ensure:
|
|
103
|
-
- "result.clean ==
|
|
104
|
-
|
|
105
|
+
- expr: "result.clean == true"
|
|
106
|
+
attempts: 5
|
|
105
107
|
|
|
106
|
-
#
|
|
107
|
-
# Multi-lens review: triage selects lenses, parallel dispatch runs them,
|
|
108
|
-
# merge deduplicates and classifies findings. Falls back to review_check
|
|
109
|
-
# if parallel dispatch is unavailable.
|
|
110
|
-
parallel_review:
|
|
111
|
-
input:
|
|
112
|
-
task: {type: string}
|
|
113
|
-
blueprint: {type: string}
|
|
114
|
-
diff: {type: string}
|
|
115
|
-
output: ReviewResult
|
|
116
|
-
steps:
|
|
117
|
-
- id: triage
|
|
118
|
-
agent: "claude:orchestrator"
|
|
119
|
-
intent: >
|
|
120
|
-
Decide which review lenses to activate.
|
|
121
|
-
|
|
122
|
-
Always include diff-quality and contract-compliance.
|
|
123
|
-
Add security if files touch auth, crypto, SQL, HTTP handlers.
|
|
124
|
-
Add framework if detected framework files (React, Express, Next.js, etc).
|
|
125
|
-
|
|
126
|
-
Return JSON: { "tasks": LensTask[] } where each task has id, lens_name,
|
|
127
|
-
lens_focus, confidence_gate, exclusions.
|
|
128
|
-
inputs:
|
|
129
|
-
diff: "$.input.diff"
|
|
130
|
-
output_contract: TriageResult
|
|
131
|
-
|
|
132
|
-
- id: review_lenses
|
|
133
|
-
type: parallel_dispatch
|
|
134
|
-
agent: "claude:read-only-reviewer"
|
|
135
|
-
source: "$.steps.triage.output.tasks"
|
|
136
|
-
max_concurrent: 4
|
|
137
|
-
isolation: none
|
|
138
|
-
output_contract: ReviewResult
|
|
139
|
-
intent_template: >
|
|
140
|
-
Lens: {lens_name}. Focus: {lens_focus}.
|
|
141
|
-
require: all
|
|
142
|
-
|
|
143
|
-
- id: merge
|
|
144
|
-
agent: "claude:orchestrator"
|
|
145
|
-
intent: >
|
|
146
|
-
Merge ReviewResult arrays from all lens runs into a single canonical ReviewResult.
|
|
147
|
-
The input contains the parallel dispatch aggregate with tasks[].result for each lens.
|
|
148
|
-
1. Concatenate all findings arrays from completed task results.
|
|
149
|
-
Deduplicate by file+line+lens: keep finding with highest confidence;
|
|
150
|
-
carry over its applied_gate.
|
|
151
|
-
2. Recompute clean: zero must-fix AND zero should-fix findings (post-dedupe, post-gate).
|
|
152
|
-
3. lenses_run = IDs of lenses that produced any must-fix or should-fix finding.
|
|
153
|
-
4. auto_fixes = mechanical fixes (formatting, typos, simple tests).
|
|
154
|
-
5. asks = findings requiring human judgment.
|
|
155
|
-
Return canonical ReviewResult with clean, summary, findings, lenses_run,
|
|
156
|
-
auto_fixes, asks, meta.
|
|
157
|
-
inputs:
|
|
158
|
-
results: "$.steps.review_lenses.output"
|
|
159
|
-
task: "$.input.task"
|
|
160
|
-
blueprint: "$.input.blueprint"
|
|
161
|
-
reduce_mode: "true"
|
|
162
|
-
output_contract: ReviewResult
|
|
163
|
-
depends_on: [review_lenses]
|
|
164
|
-
|
|
165
|
-
# --- Sub-flow: coverage ---
|
|
166
|
-
# Single-step: claude runs tests, stratum retries via ensure_failed.
|
|
167
|
-
# Cross-agent fix is dispatched by build.js on ensure_failed.
|
|
108
|
+
# Task-only subflow: test generation and coverage sweep.
|
|
168
109
|
coverage_check:
|
|
169
110
|
input:
|
|
170
|
-
task:
|
|
171
|
-
plan:
|
|
172
|
-
output:
|
|
111
|
+
task: string
|
|
112
|
+
plan: string
|
|
113
|
+
output:
|
|
114
|
+
from: "${run_tests.output}"
|
|
115
|
+
contract: TestResult
|
|
173
116
|
steps:
|
|
174
117
|
- id: run_tests
|
|
175
|
-
agent:
|
|
176
|
-
|
|
177
|
-
Run the project test suite.
|
|
178
|
-
{
|
|
179
|
-
|
|
180
|
-
task: "$.input.task"
|
|
181
|
-
output_contract: TestResult
|
|
118
|
+
agent: claude
|
|
119
|
+
do: >
|
|
120
|
+
Run the project test suite for ${input.task}, following plan ${input.plan}.
|
|
121
|
+
Return {passing, summary, failures}.
|
|
122
|
+
out: TestResult
|
|
182
123
|
ensure:
|
|
183
|
-
- "result.passing ==
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
# --- Sub-flow: test_review (COMP-TEST-BOOTSTRAP-4-1) ---
|
|
187
|
-
# Reviews the test files the coverage step generated this build. The
|
|
188
|
-
# implementation review (review/codex_review) runs BEFORE coverage, so
|
|
189
|
-
# generated tests are never otherwise reviewed. build.js injects the exact
|
|
190
|
-
# generated-test file list into this step's intent, and skips the step
|
|
191
|
-
# entirely (synthetic clean stepDone) when coverage produced no test files.
|
|
192
|
-
# ADVISORY: no blocking ensure — findings surface to the human, never fail ship.
|
|
193
|
-
test_review:
|
|
194
|
-
input:
|
|
195
|
-
task: {type: string}
|
|
196
|
-
blueprint: {type: string}
|
|
197
|
-
output: ReviewResult
|
|
198
|
-
steps:
|
|
199
|
-
- id: review_generated_tests
|
|
200
|
-
agent: codex
|
|
201
|
-
intent: >
|
|
202
|
-
Review the auto-generated test files listed below (written by the coverage
|
|
203
|
-
step this build) and verify their assertions match intent. Read each file.
|
|
204
|
-
Flag tests that are placeholders (assert true / pass with no real assertion),
|
|
205
|
-
tautological, or assert only on mocks/stubs rather than exercising the
|
|
206
|
-
feature's behavior. For each weak test, cite file:line and state what real
|
|
207
|
-
assertion is missing. Do NOT flag hand-written tests or pure style. Output a
|
|
208
|
-
canonical ReviewResult.
|
|
209
|
-
inputs:
|
|
210
|
-
task: "$.input.task"
|
|
211
|
-
blueprint: "$.input.blueprint"
|
|
212
|
-
review_mode: "true"
|
|
213
|
-
confidence_gate: "7"
|
|
214
|
-
# ADVISORY (COMP-TEST-BOOTSTRAP-4-1): deliberately NO output_contract and NO
|
|
215
|
-
# ensure. A schema/postcondition failure here would trigger executeChildFlow's
|
|
216
|
-
# blocking fix-retry path and could block ship (report→docs→ship chain through
|
|
217
|
-
# test_review). Without either gate the step always completes; build.js captures
|
|
218
|
-
# whatever the reviewer returns and surfaces it via the test_review stream event.
|
|
124
|
+
- expr: "result.passing == true"
|
|
125
|
+
attempts: 15
|
|
219
126
|
|
|
220
|
-
# --- Main flow: quick feature lifecycle (design → implement → ship) ---
|
|
221
127
|
build:
|
|
222
128
|
input:
|
|
223
|
-
featureCode:
|
|
224
|
-
description:
|
|
225
|
-
pre_merge_gate:
|
|
226
|
-
|
|
129
|
+
featureCode: string
|
|
130
|
+
description: string
|
|
131
|
+
pre_merge_gate: string[]?
|
|
132
|
+
implementer_agent: string
|
|
133
|
+
reviewer_agent: string
|
|
134
|
+
output:
|
|
135
|
+
from: "${ship.output}"
|
|
136
|
+
contract: PhaseResult
|
|
227
137
|
max_rounds: 10
|
|
228
138
|
steps:
|
|
229
|
-
# Phase: Explore & Design
|
|
230
139
|
- id: explore_design
|
|
231
140
|
agent: claude
|
|
232
|
-
|
|
233
|
-
Explore the codebase and write a design doc for
|
|
234
|
-
Launch 2-3 explorer subagents in parallel to map architecture,
|
|
235
|
-
|
|
236
|
-
Write
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
rather than under-scoping. Note the recommendation in the design doc.
|
|
244
|
-
inputs:
|
|
245
|
-
featureCode: "$.input.featureCode"
|
|
246
|
-
description: "$.input.description"
|
|
247
|
-
output_contract: PhaseResult
|
|
141
|
+
do: >
|
|
142
|
+
Explore the codebase and write a design doc for ${input.featureCode}.
|
|
143
|
+
Launch 2-3 explorer subagents in parallel to map architecture, find similar
|
|
144
|
+
features, and analyze related implementations. Feature: ${input.description}.
|
|
145
|
+
Write docs/features/${input.featureCode}/design.md and return PhaseResult.
|
|
146
|
+
|
|
147
|
+
QUICK-PATH GUARDRAIL: if the design reveals the work is actually
|
|
148
|
+
multi-file, cross-cutting, or architecture-dependent, STOP and recommend
|
|
149
|
+
the user re-run with the full `compose build` (no `--quick`) rather than
|
|
150
|
+
under-scoping it.
|
|
151
|
+
out: PhaseResult
|
|
248
152
|
ensure:
|
|
249
|
-
- "result.outcome == 'complete'"
|
|
250
|
-
- "file_exists(result.artifact)"
|
|
251
|
-
|
|
153
|
+
- expr: "result.outcome == 'complete'"
|
|
154
|
+
- expr: "file_exists(result.artifact)"
|
|
155
|
+
attempts: 2
|
|
252
156
|
|
|
253
|
-
# Gate: Design review
|
|
254
157
|
- id: design_gate
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
158
|
+
after: [explore_design]
|
|
159
|
+
gate:
|
|
160
|
+
on_approve: decompose
|
|
161
|
+
on_revise: explore_design
|
|
162
|
+
on_kill: null
|
|
260
163
|
|
|
261
|
-
# Phase: Decompose — analyze the design and emit a task graph
|
|
262
|
-
# (Quick path: no separate plan step — decompose reads the design doc directly.)
|
|
263
164
|
- id: decompose
|
|
264
|
-
type: decompose
|
|
265
165
|
agent: claude
|
|
266
|
-
|
|
267
|
-
Read the design doc at docs/features
|
|
268
|
-
it into independent tasks. For each task
|
|
269
|
-
|
|
270
|
-
Return
|
|
271
|
-
|
|
272
|
-
QUICK-PATH GUARDRAIL: if decomposition reveals the work is actually
|
|
273
|
-
cross-cutting, or architecture-dependent, STOP and recommend the
|
|
274
|
-
with full `compose build` (no `--quick`) rather than
|
|
275
|
-
|
|
166
|
+
do: >
|
|
167
|
+
Read the design doc at docs/features/${input.featureCode}/design.md and
|
|
168
|
+
decompose it into independent tasks. For each task identify id, description,
|
|
169
|
+
files_owned, files_read, and depends_on. Reject file ownership conflicts.
|
|
170
|
+
Return {tasks}.
|
|
171
|
+
|
|
172
|
+
QUICK-PATH GUARDRAIL: if decomposition reveals the work is actually
|
|
173
|
+
multi-file, cross-cutting, or architecture-dependent, STOP and recommend the
|
|
174
|
+
user re-run with the full `compose build` (no `--quick`) rather than
|
|
175
|
+
under-scoping it.
|
|
176
|
+
out: TaskGraph
|
|
276
177
|
ensure:
|
|
277
|
-
- "
|
|
278
|
-
|
|
279
|
-
retries: 2
|
|
280
|
-
depends_on: [design_gate]
|
|
178
|
+
- expr: "len(result.tasks) >= 1"
|
|
179
|
+
attempts: 2
|
|
281
180
|
|
|
282
|
-
#
|
|
181
|
+
# v0.3 parallel_dispatch -> TS v1 consumer fanout. Compose owns worktrees,
|
|
182
|
+
# pre-merge commands, retained diffs, and the downstream merge handshake.
|
|
283
183
|
- id: execute
|
|
284
|
-
|
|
285
|
-
|
|
184
|
+
after: [decompose]
|
|
185
|
+
attempts: 2
|
|
186
|
+
fanout:
|
|
187
|
+
over: "${decompose.output.tasks}"
|
|
188
|
+
dispatch: consumer
|
|
189
|
+
concurrency: 3
|
|
190
|
+
isolation: worktree
|
|
191
|
+
require: all
|
|
192
|
+
merge: sequential
|
|
193
|
+
pre_merge: "$.input.pre_merge_gate"
|
|
194
|
+
steps:
|
|
195
|
+
- agent: "$.input.implementer_agent"
|
|
196
|
+
do: >
|
|
197
|
+
Implement the task described by ${item} using TDD. Write the test first,
|
|
198
|
+
watch it fail, implement, and watch it pass. Honor the item's id,
|
|
199
|
+
files_owned, files_read, description, and dependency fields.
|
|
200
|
+
Return {outcome, summary, files_changed}.
|
|
201
|
+
out: TaskResult
|
|
202
|
+
|
|
203
|
+
- id: execute_merge
|
|
204
|
+
after: [execute]
|
|
205
|
+
gate:
|
|
206
|
+
on_approve: review_triage
|
|
207
|
+
on_revise: execute
|
|
208
|
+
on_kill: null
|
|
209
|
+
max_rounds: 10
|
|
210
|
+
|
|
211
|
+
# The former parallel_review subflow is flattened because TS v1 permits
|
|
212
|
+
# fanout only in the entry flow.
|
|
213
|
+
- id: review_triage
|
|
286
214
|
agent: claude
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
capture_diff: true
|
|
290
|
-
defer_advance: true
|
|
291
|
-
pre_merge_verify: "$.input.pre_merge_gate" # COMP-PAR-MERGE-QUEUE-CONSUMER-RETRY: optional per-task fast gate (default-OFF)
|
|
292
|
-
require: all
|
|
293
|
-
merge: sequential_apply
|
|
294
|
-
intent_template: >
|
|
295
|
-
Implement this task using TDD. Write the test first, watch it fail,
|
|
296
|
-
implement, watch it pass.
|
|
215
|
+
do: >
|
|
216
|
+
Select review lenses for the implementation results ${execute.output}.
|
|
297
217
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
218
|
+
RETRY PATH — If .compose/prior_dirty_lenses.json exists, read its JSON array.
|
|
219
|
+
Activate all lenses listed in that array. Always also include diff-quality
|
|
220
|
+
and contract-compliance. Skip all other lenses because they already passed
|
|
221
|
+
clean.
|
|
301
222
|
|
|
302
|
-
|
|
303
|
-
|
|
223
|
+
FIRST RUN PATH — If .compose/prior_dirty_lenses.json does not exist, always
|
|
224
|
+
include diff-quality, contract-compliance, and debug-discipline. Add security
|
|
225
|
+
for auth, crypto, SQL, or HTTP-handler changes, and add framework for detected
|
|
226
|
+
framework files.
|
|
304
227
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
228
|
+
Return {tasks}; each task must include id, lens_name, lens_focus,
|
|
229
|
+
confidence_gate, and exclusions.
|
|
230
|
+
out: TriageResult
|
|
231
|
+
|
|
232
|
+
- id: review_lenses
|
|
233
|
+
after: [review_triage]
|
|
234
|
+
fanout:
|
|
235
|
+
over: "${review_triage.output.tasks}"
|
|
236
|
+
dispatch: consumer
|
|
237
|
+
concurrency: 4
|
|
238
|
+
isolation: none
|
|
239
|
+
require: all
|
|
240
|
+
merge: sequential
|
|
241
|
+
steps:
|
|
242
|
+
- agent: claude
|
|
243
|
+
do: >
|
|
244
|
+
Run the review lens described by ${item}. Honor its lens_name,
|
|
245
|
+
lens_focus, confidence_gate, and exclusions fields. Return the canonical
|
|
246
|
+
ReviewResult shape.
|
|
247
|
+
out: ReviewResult
|
|
248
|
+
|
|
249
|
+
- id: review_lenses_gate
|
|
250
|
+
after: [review_lenses]
|
|
251
|
+
gate:
|
|
252
|
+
on_approve: review_merge
|
|
253
|
+
on_revise: review_triage
|
|
254
|
+
on_kill: null
|
|
255
|
+
max_rounds: 10
|
|
256
|
+
|
|
257
|
+
- id: review_merge
|
|
258
|
+
agent: claude
|
|
259
|
+
do: >
|
|
260
|
+
Merge ${review_lenses.output} into one canonical ReviewResult. Concatenate and
|
|
261
|
+
deduplicate findings by file+line+lens, keep the highest confidence, recompute
|
|
262
|
+
clean, set lenses_run to dirty lens ids, and classify auto_fixes and asks.
|
|
263
|
+
out: ReviewResult
|
|
264
|
+
|
|
265
|
+
# I1: dirty-review recovery is engine-native. review_merge cannot converge on
|
|
266
|
+
# its own (re-running the reducer re-merges the SAME frozen lens outputs), so
|
|
267
|
+
# the cleanliness decision is a GATE. Compose resolves it by policy: a clean
|
|
268
|
+
# merge approves; a dirty merge runs the corrective fixer, persists the dirty
|
|
269
|
+
# lens ids, and REVISES — the engine reroutes to review_triage, whose RETRY
|
|
270
|
+
# PATH reads the sidecar and re-runs only the dirty lenses on the fixed code.
|
|
271
|
+
- id: review_gate
|
|
272
|
+
after: [review_merge]
|
|
273
|
+
gate:
|
|
274
|
+
on_approve: codex_review
|
|
275
|
+
on_revise: review_triage
|
|
276
|
+
on_kill: null
|
|
277
|
+
max_rounds: 10
|
|
317
278
|
|
|
318
|
-
# Sub-flow: Codex review (independent cross-model pass after Claude lenses + fixes)
|
|
319
279
|
- id: codex_review
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
depends_on: [review]
|
|
280
|
+
after: [review_gate]
|
|
281
|
+
run: review_check
|
|
282
|
+
with:
|
|
283
|
+
task: "${review_merge.output.summary}"
|
|
284
|
+
blueprint: "${explore_design.output.artifact}"
|
|
285
|
+
reviewer_agent: "${input.reviewer_agent}"
|
|
327
286
|
|
|
328
|
-
# Sub-flow: Coverage (claude runs tests)
|
|
329
287
|
- id: coverage
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
- "result.passing == True"
|
|
336
|
-
depends_on: [codex_review]
|
|
288
|
+
after: [codex_review]
|
|
289
|
+
run: coverage_check
|
|
290
|
+
with:
|
|
291
|
+
task: "${input.description}"
|
|
292
|
+
plan: "${input.description}"
|
|
337
293
|
|
|
338
|
-
#
|
|
339
|
-
# coverage step generated this build. build.js injects the generated-test
|
|
340
|
-
# file list into the intent, and reports a synthetic clean result (skip)
|
|
341
|
-
# when coverage produced no test files. Advisory — never blocks ship.
|
|
294
|
+
# Advisory by construction: no output contract and no ensure.
|
|
342
295
|
- id: test_review
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
296
|
+
after: [coverage]
|
|
297
|
+
agent: "$.input.reviewer_agent"
|
|
298
|
+
do: >
|
|
299
|
+
Review tests generated for ${input.featureCode}. Flag placeholders,
|
|
300
|
+
tautologies, and assertions that only exercise mocks. Cite file:line and the
|
|
301
|
+
missing real assertion. This is advisory and must not block ship.
|
|
348
302
|
|
|
349
|
-
# Phase: Update Docs
|
|
350
303
|
- id: docs
|
|
304
|
+
after: [test_review]
|
|
351
305
|
agent: claude
|
|
352
|
-
|
|
353
|
-
Update
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
If this completes a parent feature, update the parent header too.
|
|
359
|
-
3. README.md — Update ONLY if the feature changes user-facing setup,
|
|
360
|
-
commands, or capabilities. Skip if purely internal.
|
|
361
|
-
4. CLAUDE.md — Update ONLY if new conventions, commands, or architecture
|
|
362
|
-
patterns were introduced. Skip if no changes.
|
|
363
|
-
5. Public docs — If the feature introduces or changes any of these, update
|
|
364
|
-
the relevant file in docs/:
|
|
365
|
-
- New CLI commands or flags → docs/compose-one-pager.md
|
|
366
|
-
- New connector or agent type → docs/connectors.md
|
|
367
|
-
- New workflow or lifecycle change → docs/use-cases.md
|
|
368
|
-
- API or config changes → docs/PRODUCT-SPEC.md
|
|
369
|
-
Read each file before editing. Skip if the feature is purely internal
|
|
370
|
-
with no user-facing changes.
|
|
371
|
-
|
|
372
|
-
Read each file before editing. Do not skip CHANGELOG and ROADMAP —
|
|
373
|
-
they are always required. Commit nothing — the ship step handles commits.
|
|
374
|
-
inputs:
|
|
375
|
-
featureCode: "$.input.featureCode"
|
|
376
|
-
description: "$.input.description"
|
|
377
|
-
output_contract: PhaseResult
|
|
378
|
-
retries: 2
|
|
379
|
-
depends_on: [test_review]
|
|
306
|
+
do: >
|
|
307
|
+
Update CHANGELOG.md and ROADMAP.md for ${input.featureCode}. Update README.md,
|
|
308
|
+
CLAUDE.md, and public docs only when the feature changes their documented
|
|
309
|
+
surfaces. Commit nothing. Return PhaseResult.
|
|
310
|
+
out: PhaseResult
|
|
311
|
+
attempts: 2
|
|
380
312
|
|
|
381
|
-
# Phase: Ship
|
|
382
313
|
- id: ship
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
as plan_items: an array of objects { text, file, critical } where:
|
|
398
|
-
- text is the checkbox item text
|
|
399
|
-
- file is the backtick-quoted file path in the item (null if none)
|
|
400
|
-
- critical is true if the item mentions MUST, required, security, or tests
|
|
401
|
-
Use lib/plan-parser.js (parsePlanItems) to do this extraction.
|
|
402
|
-
8. Collect the list of files you staged as files_changed.
|
|
403
|
-
|
|
404
|
-
Include plan_items and files_changed in your result JSON.
|
|
405
|
-
Report the commit hash and files changed.
|
|
406
|
-
inputs:
|
|
407
|
-
featureCode: "$.input.featureCode"
|
|
408
|
-
description: "$.input.description"
|
|
409
|
-
output_contract: PhaseResult
|
|
410
|
-
ensure:
|
|
411
|
-
- "plan_completion(result.plan_items, result.files_changed)"
|
|
412
|
-
retries: 2
|
|
413
|
-
depends_on: [docs]
|
|
314
|
+
after: [docs]
|
|
315
|
+
agent: claude
|
|
316
|
+
do: >
|
|
317
|
+
Run the full test suite and build for ${input.featureCode}; fix failures.
|
|
318
|
+
Verify CHANGELOG.md and ROADMAP.md, stage only feature files, commit and push.
|
|
319
|
+
Parse plan acceptance criteria with lib/plan-parser.js and return PhaseResult
|
|
320
|
+
including plan_items, files_changed, and commit_hash.
|
|
321
|
+
out: PhaseResult
|
|
322
|
+
# C5: the judged ship ensure was removed — it is unevaluable from the
|
|
323
|
+
# {result, input} the judge receives (it fails closed even on evidenced
|
|
324
|
+
# results, so real TS-default builds would plausibly die at ship). Same
|
|
325
|
+
# class as the F5 vocabulary ruling. Ship stays gated by ship_gate; revisit
|
|
326
|
+
# when a deterministic/tunable judge backend exists (stratum follow-up).
|
|
327
|
+
attempts: 2
|
|
414
328
|
|
|
415
|
-
# Gate: Ship review
|
|
416
329
|
- id: ship_gate
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
330
|
+
after: [ship]
|
|
331
|
+
gate:
|
|
332
|
+
on_approve: null
|
|
333
|
+
on_revise: ship
|
|
334
|
+
on_kill: null
|