aw-spec-cli 0.1.23 → 0.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/assets/.appweaver/ORCH-DIALECT.md +3 -3
  2. package/assets/.appweaver/RULE-PARTITION.md +41 -28
  3. package/assets/.appweaver/orchestrator/orchestrator.py +92 -14
  4. package/assets/.appweaver/orchestrator/rev-templates/ai-rules.reference.md +3 -3
  5. package/assets/.appweaver/orchestrator/rev-templates/delta-design-template.skeleton.md +19 -12
  6. package/assets/.appweaver/orchestrator/rev-templates/design-template.skeleton.md +25 -17
  7. package/assets/.appweaver/orchestrator/rev-templates/domain-requirements.skeleton.md +2 -2
  8. package/assets/.appweaver/orchestrator/rev-templates/domain-rule-bindings.skeleton.md +10 -10
  9. package/assets/.appweaver/orchestrator/rev-templates/tech-rule-bindings.skeleton.md +28 -17
  10. package/assets/.appweaver/orchestrator/rev-templates/technical-constitution.skeleton.md +22 -24
  11. package/assets/.appweaver/orchestrator/rev-templates/technical-rule-file.skeleton.md +1 -1
  12. package/assets/.appweaver/orchestrator/rev-templates/ui-delta-design-template.skeleton.md +29 -19
  13. package/assets/.appweaver/orchestrator/rev-templates/ui-design-template.skeleton.md +27 -20
  14. package/assets/.appweaver/orchestrator/workflows/aw-spec-adopt.orch.yaml +184 -37
  15. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan-delta.orch.yaml +18 -0
  16. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-plan.orch.yaml +19 -0
  17. package/assets/.appweaver/orchestrator/workflows/aw-spec-analyze-slice-delta.orch.yaml +18 -0
  18. package/assets/.appweaver/orchestrator/workflows/aw-spec-inventory.orch.yaml +55 -29
  19. package/assets/.appweaver/orchestrator/workflows/aw-spec-onboard.orch.yaml +650 -205
  20. package/assets/.appweaver/orchestrator/workflows/aw-spec-plan.orch.yaml +19 -0
  21. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-feature.orch.yaml +5 -5
  22. package/assets/.appweaver/orchestrator/workflows/aw-spec-select-stack.orch.yaml +2 -2
  23. package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-model.orch.yaml +13 -3
  24. package/assets/.appweaver/orchestrator/workflows/aw-spec-ui-prototype.orch.yaml +40 -1
  25. package/assets/.appweaver/orchestrator/workflows/aw-spec-workflow-model.orch.yaml +2 -1
  26. package/assets/.appweaver/scripts/bash/aw-rev-constitution.sh +1 -1
  27. package/assets/.appweaver/scripts/bash/aw-spec-actions.sh +69 -7
  28. package/assets/.appweaver/scripts/powershell/aw-rev-constitution.ps1 +1 -1
  29. package/assets/.appweaver/scripts/powershell/aw-spec-actions.ps1 +58 -2
  30. package/assets/.appweaver/scripts/python/aw-inventory.py +1809 -156
  31. package/assets/.appweaver/scripts/python/aw-rev-constitution.py +106 -145
  32. package/assets/.appweaver/scripts/python/aw-stack.py +45 -1
  33. package/assets/.appweaver/scripts/python/aw-xref.py +73 -2
  34. package/assets/.appweaver/scripts/python/validate_okf.py +10 -5
  35. package/assets/.appweaver/templates/okf-concept-template.md +10 -2
  36. package/assets/.appweaver/templates/proposed-inventory-template.md +100 -48
  37. package/assets/.appweaver/templates/source-map-template.md +14 -6
  38. package/package.json +1 -1
@@ -39,13 +39,14 @@ refers to it directly, as-is.
39
39
  ## /aw-spec-specify
40
40
  <!-- MODELLING METHODOLOGY ONLY — exactly one file. HOW this codebase expresses a domain model
41
41
  (what marks an aggregate root, entity vs value object, where invariants live, the context
42
- boundary), NOT what the model is (that is the domain set's domain-driven-design.domain.md,
43
- wired via domain-rule-bindings). No technology rule may appear under this heading. -->
42
+ boundary), NOT what the model is (that is the domain set's domain-model.domain.md, wired
43
+ via domain-rule-bindings). No technology rule may appear under this heading. -->
44
44
  - guardrails/projects/[project]/service/domain-modelling.md
45
45
 
46
46
  ## /aw-spec-plan
47
- <!-- The as-built architecture / cross-cutting technical rules the design author mediates the spec
48
- against. NO domain file here — domain reaches design only as spec ids. -->
47
+ <!-- The as-built architecture / cross-cutting technical rules the SERVICE lane's plan author
48
+ mediates the spec against. NO domain file here — domain reaches plan only as spec ids and
49
+ the context's domain-model.md. -->
49
50
  - guardrails/projects/[project]/service/[as-built-architecture].md
50
51
  - guardrails/projects/[project]/service/[each generated architecture/cross-cutting rule].md
51
52
 
@@ -65,12 +66,13 @@ refers to it directly, as-is.
65
66
  - guardrails/projects/[project]/service/[as-built-architecture].md
66
67
 
67
68
  ## /aw-spec-analyze-slice
68
- <!-- The design↔code conformance gate's TECHNICAL checklist (validate, don't author). -->
69
+ <!-- The plan↔code conformance gate's TECHNICAL checklist (validate, don't author). -->
69
70
  - guardrails/projects/[project]/service/[testing/convention rule to validate against].md
70
71
 
71
72
  ## /aw-spec-adopt
72
- <!-- Brownfield reverse-engineering: the technical REFERENCE set the reversed design mediates the
73
- reversed spec ↔ existing code against — the CODE wins, these are reference only. -->
73
+ <!-- Brownfield reverse-engineering: the technical REFERENCE set the reversed BACKEND plan
74
+ mediates the reversed spec ↔ existing code against — the CODE wins, these are reference
75
+ only. A slice's reversed frontend-plan.md is authored under `## /aw-spec-plan-ui`. -->
74
76
  - guardrails/projects/[project]/service/[architecture/cross-cutting reference rule].md
75
77
 
76
78
  ## /aw-spec-constitution
@@ -89,13 +91,22 @@ refers to it directly, as-is.
89
91
  a runtime/hosting concern file. NOT data-migration (migration is the deferred later phase). -->
90
92
  - guardrails/projects/[project]/service/[runtime/hosting rule].md
91
93
 
92
- <!-- ## /aw-spec-ui-constitution — the FRONTEND LANE's heading. It is NOT written by the step
93
- that authors this map; onboard's frontend rule-set step APPENDS it here, after the technical
94
- headings and before the quick-reference table, but only where the scan found a UI in the
95
- code. It maps the generated frontend/ lane rules (frontend/ui-constitution.md first), and
96
- it is also the authoritative signal that this project HAS a frontend lane — a later
97
- /appweaver constitution reads it to decide whether to author constitution.ui.md at all.
98
- A backend-only repo simply never gets the heading.
94
+ <!-- THE FRONTEND LANE'S THREE HEADINGS. They are NOT written by the step that authors this
95
+ map; onboard's frontend rule-set step APPENDS them here, after the technical headings and
96
+ before the quick-reference table, and only where a UI lane is declared. A backend-only
97
+ repo never gets them.
98
+ ## /aw-spec-ui-constitution — the ratifiable lane standards (frontend/ui-constitution.md
99
+ first). Also the authoritative signal that this project HAS a frontend lane: a later
100
+ /appweaver constitution reads it to decide whether to author constitution.ui.md.
101
+ ## /aw-spec-plan-ui — the lane rules the FRONTEND lane of `plan` authors
102
+ frontend-plan.md against: composition, navigation, client state, interaction states,
103
+ forms, accessibility, the published-surface binding. `adopt` reverses a slice's
104
+ frontend-plan.md under the same set.
105
+ ## /aw-spec-implement-ui — the lane rules the FRONTEND lane of `implement` generates
106
+ code against, on both the master and the delta path: component conventions, state and
107
+ data fetching, styling, forms, testing.
108
+ A file carrying both a planning half and a generating half is listed under both; the lane
109
+ base file frontend/ui-constitution.md sits under ## /aw-spec-ui-constitution only.
99
110
 
100
111
  Do NOT add /aw-spec-characterize or /aw-spec-parity in the DEV flow — characterize is
101
112
  opt-on-touch and parity is deferred to the migration phase. Add any other heading later
@@ -109,11 +120,11 @@ refers to it directly, as-is.
109
120
  | Command | Technical rule files | Role |
110
121
  |---|---|---|
111
122
  | /aw-spec-specify | 1 | the as-built modelling methodology the domain model is expressed in — no technology |
112
- | /aw-spec-plan | [n] | as-built architecture the design author mediates the spec against |
123
+ | /aw-spec-plan | [n] | as-built architecture the service lane's plan author mediates the spec against |
113
124
  | /aw-spec-implement | [n] | code-generation set the service lane builds against (from backend-plan.md) |
114
125
  | /aw-spec-implement-delta | [n] | the same set for the service lane when implement is generating a change's delta plan |
115
126
  | /aw-spec-build | [n] | layering + convention rules the compile-fixer respects |
116
- | /aw-spec-analyze-slice | [n] | conformance rules the design↔code gate validates against |
117
- | /aw-spec-adopt | [n] | technical reference set for the reversed design (brownfield) |
127
+ | /aw-spec-analyze-slice | [n] | conformance rules the plan↔code gate validates against |
128
+ | /aw-spec-adopt | [n] | technical reference set for the reversed backend plan (brownfield) |
118
129
  | /aw-spec-constitution | [n] | the standards the technical constitution half is re-ratified from |
119
130
  | /aw-spec-run | [n] | runtime/execution conventions the app-run step honors (only if evidenced) |
@@ -3,10 +3,10 @@
3
3
  rev-templates/technical-constitution.skeleton.md — SHAPE-ONLY reference.
4
4
 
5
5
  This file is the FORMAT + VOCABULARY reference for the reverse-engineered
6
- TECHNICAL half (constitution.technical.md). It is loaded as a `standards:`
7
- entry for the technical-half author (include_standards:true). It carries the
8
- AppWeaver principle-heading style, the Sync-Impact-Report shape, the
9
- evidence-line pattern, and the section skeleton — and NOTHING ELSE.
6
+ TECHNICAL half (constitution.technical.md). onboard hands it to the
7
+ technical-half author in that step's context. It carries the AppWeaver
8
+ principle-heading style, the Sync-Impact-Report shape, the evidence-line
9
+ pattern, and the section skeleton — and NOTHING ELSE.
10
10
 
11
11
  IT DELIBERATELY CONTAINS NO PRINCIPLE SET. There is no fixed I–XV list to
12
12
  inherit. Every [BRACKET] token below is a slot the author fills from evidence
@@ -14,18 +14,19 @@
14
14
 
15
15
  DISCIPLINE THIS SKELETON ENFORCES (structurally — there is no project content
16
16
  here to leak):
17
- • EVIDENCE-FIRST — author a principle ONLY for a technology trait the
18
- adopted design.md files + the OKF overview/platform note actually
19
- evidence. If the code does not show it, it is not a principle.
17
+ • EVIDENCE-FIRST — author a principle ONLY for a technology trait the code
18
+ evidences: the OKF overview and platform note, and any adopted plans and
19
+ source-maps that exist. If the code does not show it, it is not a principle.
20
20
  • CITE inline — every principle ends with an `(evidence: …)` line naming a
21
- design section, a concrete type / port / persistence context / config, or
22
- an OKF stack line. A principle with no groundable evidence does not belong.
21
+ concrete type / port / persistence context / config path, a plan section,
22
+ or an OKF stack line. A principle with no groundable evidence does not
23
+ belong.
23
24
  • AS-BUILT LEVEL — state a partial / stubbed / optional trait at the level
24
25
  the code actually reaches; never the aspirational ideal.
25
26
  • OMIT pure aspiration — a trait the code shows zero of is not softened into
26
- a principle; it is left out.
27
- • ROUTE gaps — an unmet ideal / stub / inactive-optional concern goes into
28
- the "As-Built Debt → migration backlog" list below, never asserted.
27
+ a principle; it is left out, and named with the reason in the Sync Impact
28
+ Report's "deliberately omitted" list. There is no debt or backlog sink:
29
+ this is the development flow, and migration is a separate later phase.
29
30
  • VARIABLE LENGTH — number sequentially from I with no gaps and no padding
30
31
  to a fixed count. The final numeral is the domain half's continuation
31
32
  point.
@@ -40,11 +41,8 @@ Sync Impact Report
40
41
  I [PRINCIPLE_TITLE]
41
42
  II [PRINCIPLE_TITLE]
42
43
  … (only traits the code evidences — no fixed count)
43
- - Template ideals DELIBERATELY OMITTED (lack of as-built evidence):
44
- - [IDEAL] — [why the code does not evidence it]
45
- - …
46
- - As-Built Debt → migration backlog (see knowledge/migration-backlog.md; do not restate the table):
47
- - [gap / stub / inactive-optional concern] — [where it is tracked]
44
+ - Traits DELIBERATELY OMITTED (lack of as-built evidence):
45
+ - [TRAIT] — [why the code does not evidence it]
48
46
  - …
49
47
  - Dependent artifacts:
50
48
  - constitution.domain.md — ⚠ authored next; continues at [N+1]
@@ -54,9 +52,9 @@ Sync Impact Report
54
52
  -->
55
53
  # [PROJECT_NAME] Constitution — Technical Base
56
54
 
57
- > Reverse-engineered, **as-built**, domain-agnostic technical half. Authority for DESIGN and
58
- > IMPLEMENT. Domain principles live in `constitution.domain.md` (continues at **[N+1]**).
59
- > This file asserts only technology traits evidenced by the adopted designs + OKF overview/platform.
55
+ > Reverse-engineered, **as-built**, domain-agnostic technical half. Authority for the service
56
+ > lane of PLAN and IMPLEMENT. Domain principles live in `constitution.domain.md` (continues at
57
+ > **[N+1]**). This file asserts only technology traits the code evidences.
60
58
 
61
59
  ## Core Principles
62
60
 
@@ -64,9 +62,9 @@ Sync Impact Report
64
62
  Replace the bracketed text; keep the `### <numeral>. <title>` + rule + `(evidence: …)` shape. -->
65
63
 
66
64
  ### I. [PRINCIPLE TITLE] [(NON-NEGOTIABLE)?]
67
- [One declarative, testable rule the adopted designs actually evidence. State it at the level the
68
- code reaches — partial/stubbed/optional traits are stated as partial, not as the ideal.]
69
- (evidence: [design §X.Y named type / port / persistence context / config; or OKF overview Tech-stack line])
65
+ [One declarative, testable rule the code actually evidences. State it at the level the code
66
+ reaches — partial/stubbed/optional traits are stated as partial, not as the ideal.]
67
+ (evidence: [named type / port / persistence context / config path; a plan section; or an OKF overview Tech-stack line])
70
68
 
71
69
  ### II. [PRINCIPLE TITLE] [(NON-NEGOTIABLE)?]
72
70
  […]
@@ -78,7 +76,7 @@ code reaches — partial/stubbed/optional traits are stated as partial, not as t
78
76
 
79
77
  ## Mandatory Folder Structure (base)
80
78
 
81
- - [Solution projects / module layout AS INVENTORIED — from the OKF overview + designs, not an ideal.]
79
+ - [Solution projects / module layout AS INVENTORIED — from the code and the OKF overview, not an ideal.]
82
80
  - [Cross-cutting host files that stay at their template levels.]
83
81
  - Domain-specific folder additions (if any) are declared only in the domain constitution half.
84
82
 
@@ -18,7 +18,7 @@ concern: "[concern-slug]"
18
18
  root, entity vs value object, where invariants live, the context boundary). It is
19
19
  the only file wired under `## /aw-spec-specify`, and it carries NO business
20
20
  vocabulary: HOW this code models, never WHAT it models (that is the domain set's
21
- domain-driven-design.domain.md). Same shape as below — cite code coordinates.
21
+ domain-model.domain.md). Same shape as below — cite code coordinates.
22
22
 
23
23
  Every rule below MUST cite a CODE COORDINATE (a real file/folder path or named
24
24
  type) and, where it maps, the technical-constitution principle numeral it
@@ -7,7 +7,8 @@
7
7
  .appweaver/templates/overrides/ui-delta-design-template.md — the frontend lane's
8
8
  twin of delta-design-template.skeleton.md, written only where the CODE has a
9
9
  lane. It carries the classification triple, the impact and regression
10
- sections, the two ledgers and the close contract, and NOTHING ELSE.
10
+ sections, the two ledgers and what happens to the record at merge, and
11
+ NOTHING ELSE.
11
12
 
12
13
  IT NAMES NO FRAMEWORK AND NO FIXED UI TAXONOMY. The "Section" column is a
13
14
  SLOT, filled with the ACTUAL sections of the frontend plan template generated
@@ -15,11 +16,12 @@
15
16
  carry. A change is classified against the document it amends.
16
17
 
17
18
  ONE CHANGE, TWO LANES, ONE VERSION. A change request that touches both lanes
18
- produces a service delta AND this one; `finalize-delta` merges the three
19
- masters (spec.md, backend-plan.md, frontend-plan.md) and the change closes on ONE
20
- version bump. This record never opens a second plan document, and it
21
- never restates the service delta — where the change starts in the service
22
- contract, this document records only what the EXPERIENCE does with it.
19
+ produces a service delta AND this one; `finalize-delta` merges the spec and the
20
+ domain model once for both — never either plan, which `plan main` re-derives
21
+ from them — and the change closes on ONE version bump. This record never
22
+ opens a second plan document, and it never restates the service delta — where
23
+ the change starts in the service contract, this document records only what
24
+ the EXPERIENCE does with it.
23
25
 
24
26
  DISCIPLINE THIS SKELETON ENFORCES (structurally — there is no project content
25
27
  here to leak):
@@ -49,8 +51,12 @@
49
51
 
50
52
  <!--
51
53
  This delta applies to the SINGLE master plan at
52
- specs/[Context]/[Feature]/frontend-plan.md — never a new document, and never the
53
- master itself: finalize-delta merges it later in the chain. Classify every change
54
+ specs/[Context]/[Feature]/frontend-plan.md — never a new document. It does not
55
+ touch the master, and neither does finalize-delta: the master is DERIVED from
56
+ spec.md and domain-model.md, so `plan main` re-derives it rather than patching
57
+ it from this file, and a UX- item of this change reaches it through the spec's
58
+ Experience Standards. close-delta archives this document as the record of how
59
+ the change was built. Classify every change
54
60
  ADDED / MODIFIED / REMOVED against the current master, per the MASTER'S OWN
55
61
  SECTIONS, in the same technology-agnostic form: responsibilities, inputs as
56
62
  field shapes, events and states — no code. `implement`'s frontend lane
@@ -73,8 +79,8 @@ it serves.]
73
79
  ## ADDED — new UI elements
74
80
 
75
81
  <!-- New screens, components, state, interactions or contract bindings.
76
- "Section" names a section of THIS project's master UI design — the same
77
- section titles the generated UI design template carries. -->
82
+ "Section" names a section of THIS project's master frontend plan — the same
83
+ section titles the generated frontend plan template carries. -->
78
84
 
79
85
  | Section (§ in frontend-plan.md) | Element | Kind | Serves |
80
86
  |---|---|---|---|
@@ -105,8 +111,9 @@ it serves.]
105
111
 
106
112
  ## Contract impact
107
113
 
108
- [What this change needs from the service lane, taken from the change's contract
109
- projection: bindings added, changed or no longer used. Anything the experience
114
+ [What this change needs from the service lane, bound against its published surface —
115
+ the delta-spec's IC- ids and the service delta's "Contract deltas for the frontend
116
+ lane" table: bindings added, changed or no longer used. Anything the experience
110
117
  requires that the contract does not offer is raised back to the service lane —
111
118
  never worked around in the client. Or `None`.]
112
119
 
@@ -130,15 +137,18 @@ shared state container or a navigation edge changed.]
130
137
 
131
138
  ## New assumptions / deviations (from this change)
132
139
 
133
- <!-- Anything this change defers — folds into the master's DA-n / WA-n ledgers
134
- on apply. -->
140
+ <!-- Anything this change defers. It stays this document's record — the master's
141
+ DA-n / WA-n ledgers are re-derived with the rest of the master plan, not
142
+ patched from here. -->
135
143
 
136
144
  - **DA-[n]**: [assumption to clarify later] — or `None`
137
145
  - **WA-[n]**: [deviation to clear later] — or `None`
138
146
 
139
- ## On close
147
+ ## On merge
140
148
 
141
- `finalize-delta` merges this record into the master frontend-plan.md alongside the
142
- spec, service-plan and domain-model merges and leaves the change OPEN;
143
- `close-delta` bumps the ONE version both lanes share, writes the Change History
144
- rows and archives the change under `changes/archive/`.
149
+ `finalize-delta` merges the change's SPEC half into `spec.md` and its MODEL half into the
150
+ context's `domain-model.md`, in one transaction, and leaves the change OPEN. It does NOT
151
+ merge this document: the master plan is derived from those two, so `plan main` re-derives
152
+ it rather than patching it. `close-delta` archives this file with the change and bumps the
153
+ ONE version both lanes share. None of it is this document's job — it records the change,
154
+ it does not apply it.
@@ -19,8 +19,8 @@
19
19
  LANE'S OWN CODE.
20
20
 
21
21
  THIS IS A TEMPLATE OF A TEMPLATE. What onboard generates from it is the
22
- project's UI design TEMPLATE — [PLACEHOLDER] tokens and authoring comments
23
- intact — which ⌛ `ui-design` then fills once per feature into
22
+ project's frontend plan TEMPLATE — [PLACEHOLDER] tokens and authoring comments
23
+ intact — which the frontend lane of `plan` then fills once per feature into
24
24
  specs/<Context>/<Feature>/frontend-plan.md. Onboard replaces the STRUCTURE, not the content.
25
25
 
26
26
  THE SECTION LIST IS RATIFIED, NOT INVENTED. §1–§9 below are the sections
@@ -39,9 +39,12 @@
39
39
  no error states gets a section saying so, not a section quietly omitted.
40
40
 
41
41
  §5 IS THE LANE BOUNDARY. Contract binding is the only place the service lane
42
- enters: the UI design reads the WHOLE spec but only a PROJECTION of the
43
- service design (⌛ specs/<Feature>/design-contract.md). The requirement is
44
- shared and must not fork; the implementation is not shared and must not leak.
42
+ enters: the frontend plan reads the WHOLE spec but only the service's
43
+ PUBLISHED SURFACE — the spec's IC- ids and the API contracts backend-plan.md
44
+ states. (⌛ `plan` will emit that surface as a design-contract.md projection;
45
+ the rule does not change when it does, only what §5 reads.) The requirement
46
+ is shared and must not fork; the implementation is not shared and must not
47
+ leak.
45
48
 
46
49
  DISCIPLINE THIS SKELETON ENFORCES (structurally — there is no project content
47
50
  here to leak):
@@ -57,24 +60,24 @@
57
60
  ids, exactly as it reaches the service design.
58
61
  ═══════════════════════════════════════════════════════════════════════════
59
62
  -->
60
- # UI Design: [AGGREGATE]
63
+ # Frontend Plan: [FEATURE]
61
64
 
62
- **Feature**: `[Feature]`
65
+ **Feature**: `[Feature]` <!-- the capability scope the developer chose; the aggregate(s) it acts on are the spec's "Acts on aggregate(s)" line -->
63
66
 
64
67
  **Plan home**: `specs/[Context]/[Feature]/frontend-plan.md`
65
68
 
66
- **Source spec**: `specs/[Aggregate]/spec.md`
69
+ **Source spec**: `specs/[Context]/[Feature]/spec.md`
67
70
 
68
- **Contract**: `specs/[Aggregate]/design-contract.md`
71
+ **Lane**: `[lane id]` — the frontend lane declared in `.appweaver/stacks.json`
69
72
 
70
- **Version**: v1.0
73
+ **Version**: v1.0 <!-- moves in lockstep with spec.md and backend-plan.md; one change closes on ONE bump -->
71
74
 
72
75
  **Status**: Draft
73
76
 
74
77
  <!--
75
78
  WHAT THIS DOCUMENT IS
76
79
  =====================
77
- The single, living high-level UI design for ONE feature's experience — the
80
+ The single, living high-level plan for ONE feature's experience — the
78
81
  MEDIATOR between spec.md (WHAT/WHY) and the frontend code `implement`
79
82
  generates in this lane. It carries screens, navigation, state, composition, interaction
80
83
  and the service binding; it is not code and it is not a visual comp.
@@ -88,8 +91,8 @@
88
91
  reads a second authority, the context's domain-model.md, because it realises
89
92
  the aggregate's structure. This lane consumes the published surface at §5, not
90
93
  the domain, so the model is not in its context.)
91
- - THE CONTRACT IS THE ONLY SERVICE INPUT (§5). Read the design contract, never
92
- the service design.
94
+ - THE PUBLISHED SURFACE IS THE ONLY SERVICE INPUT (§5) — the spec's IC- ids and
95
+ the API contracts backend-plan.md states, never the service's internals.
93
96
 
94
97
  STRUCTURE FOLLOWS THIS LANE'S CODE
95
98
  - [GENERATED_LANE_STRUCTURE_NOTE] — form: one or two sentences naming the
@@ -215,10 +218,11 @@ does none.]
215
218
  ## 5. Contract Binding
216
219
 
217
220
  <!-- THE LANE BOUNDARY. One row per service operation this feature's UI depends
218
- on, taken from ⌛ specs/[Aggregate]/design-contract.md — the projection the
219
- service design emits. Read the contract, never the service design. Where no
220
- contract document exists yet, bind against the spec's own IC-/FR- surface
221
- and record that as a §8 assumption. -->
221
+ on, bound against the service's PUBLISHED SURFACE — the spec's IC- ids and
222
+ the API contracts backend-plan.md states — never its internals: no table,
223
+ handler or persistence assumption crosses this line. Where the surface does
224
+ not name an operation yet, bind against the spec's own IC-/FR- surface and
225
+ record that as a §8 assumption. -->
222
226
 
223
227
  | Screen / component | Operation (from the contract) | Sends (field shape) | Receives (field shape) | Failure handling | Serves |
224
228
  |---|---|---|---|---|---|
@@ -287,9 +291,12 @@ client. Or `None`.]
287
291
 
288
292
  ## Change History
289
293
 
290
- <!-- In lockstep with spec.md and backend-plan.md — a change that touches both lanes
291
- closes on ONE version bump. finalize-delta appends the row; close-delta
292
- bumps the version and stamps it into the header. Newest last. -->
294
+ <!-- A row is appended when this plan is RE-DERIVED to carry a change: the plan is
295
+ derived from spec.md (its UX- Experience Standards) and the context's
296
+ domain-model.md, and finalize-delta merges a change into those two, never
297
+ into this one (`plan main` re-derives it). close-delta bumps the ONE version
298
+ both lanes share and stamps it into the header, so a header ahead of the
299
+ newest row means the plan has not been re-derived since. Newest last. -->
293
300
 
294
301
  | Version | Date | Change | User stories | CR |
295
302
  |---------|------|--------|--------------|-----|