@sabaiway/agent-workflow-engine 3.3.0 → 4.1.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/CHANGELOG.md CHANGED
@@ -4,6 +4,57 @@ All notable changes to the methodology engine. Versions are this **package's** n
4
4
  they are distinct from the **deployment-lineage** stamp written into a project's `docs/ai/`
5
5
  (which tracks the shared `agent-workflow` lineage, head `3.0.0`).
6
6
 
7
+ ## 4.1.0 — the queue is a named surface with a checker, not a prose promise
8
+
9
+ `references/planning.md` gains **`## The queue`**: `docs/plans/queue.md` NAMES work and never holds
10
+ the analysis of it — a row is one plain sentence saying what the work is and for whom, then its id,
11
+ then a short body, while measurements and `file:line` citations belong to an ADR or the record the
12
+ row points at. A row that goes terminal is DELETED in the same change that mints its closing
13
+ artifact, and where the queue is gitignored the deleted text is first written to a purge archive,
14
+ because there git history is no tombstone. Frozen work with a stated resume condition is not
15
+ terminal and stays, in its own bucket; order inside a bucket IS priority.
16
+
17
+ The canon names its own rung and the command that runs it, because a prose promise to trim later was
18
+ measured failing — 62 dead rows had accumulated by the time anybody counted.
19
+
20
+ `references/procedures.md` points at the new section by named anchor and stays the terse pointer it
21
+ is meant to be (its own test asserts it stays smaller than the canon it binds to).
22
+
23
+ ## 4.0.0 — the scenario floor, and five answers the canon now states at its own points of use (AD-117)
24
+
25
+ Slice 4 wrote the layer's first real specs and came back with six questions the canon had left for
26
+ the next reader to rediscover. Five are answered here, IN `references/specs.md`, each at the point
27
+ where it is needed — and four of the five answers are a refusal to add a mechanism.
28
+
29
+ > ### ⚠ BREAKING — a spec written to the 3.3.0 canon can be invalid under this one
30
+ >
31
+ > `## Scenarios` gains a floor: at least one scenario line, with no empty-marker escape. A document
32
+ > the 3.3.0 canon and its reader both accepted now refuses as `scenarios-empty`. Same class as
33
+ > **3.0.0**, where deleting a vocabulary from the canon was already called MAJOR. The remedy is one
34
+ > line per scenario — `- S<N> <name> :: unbound` while no test pins it.
35
+
36
+ - **(1) No empty-marker escape on `## Scenarios`.** `*(empty)*` written there refuses as
37
+ `scenario-line`; `unbound` already covers a scenario no test pins yet. An empty exclusion list is a
38
+ claim, an empty scenario list is an absence. The refusal table gains the matching `scenarios-empty`
39
+ row, in the reader's own order.
40
+ - **(2) A binding marker is an ORDINARY source line.** It counts toward the source-size practice like
41
+ any other line, and a pinning file already at its cap raises its recorded ratchet to host one. No
42
+ carve-out: the size judge counts bytes and must not learn spec vocabulary.
43
+ - **(3) There is NO sidecar binding form.** Retroactive coverage of a PUBLISHED package rides a
44
+ release train, because the marker moves that package's subtree — a cost the family already pays
45
+ deliberately, against a second place a binding could live.
46
+ - **(4) No `root` op verb.** The store root is the navigator, never an op target; it is judged as the
47
+ listing parent of its declared child. The canon says so where containment is defined.
48
+ - **(5) The promoting event of a RETROACTIVE draft is PLAN APPROVAL.** `live` lands in the SAME slice
49
+ that authors the draft, once every scenario is bound — otherwise a slice whose whole deliverable IS
50
+ the specs has no later landing row, and the store's first contracts stay permanently provisional by
51
+ the canon's own wording.
52
+ - `test/specs-canon.test.mjs` pins all five as prose assertions at their point of use, absorbs the
53
+ new rule in the rules-table deep-equal, and gains two refuse fixtures — the empty section and the
54
+ empty marker — each yielding exactly its one rule. The arm was red-proofed against the unchanged
55
+ canon.
56
+
57
+
7
58
  ## 3.3.0 — the feature-spec canon: `references/specs.md`, the `Spec-first` lens bullet, specs as plan rows (AD-112)
8
59
 
9
60
  - **`references/specs.md`** (NEW) — the canon of the feature-spec layer in the family's own
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: agent-workflow-engine
3
3
  description: Canonical home of the agent-workflow planning methodology — the capped plan shape (goal and boundary, module ledger, verification), plan lifecycle, queue.md series index, mandatory Cleanup phase, the feature-spec canon (the durable per-feature contract layer with its frozen schema and Out-of-scope discipline), the bounded methodology slot fragment, the orchestration-recipe vocabulary (Solo / Reviewed / Council / Delegated), and the activity-procedures canon (plan-authoring / plan-execution, with typed recipe slots). A published, installable npm package (available:true) that *provides* the methodology text; it mutates nothing. The composition root (agent-workflow-kit) reads this canon LIVE from the installed engine and injects the bounded slots from it — one source of truth, no bundled mirror; `npx @sabaiway/agent-workflow-kit@latest init` installs the engine.
4
4
  disable-model-invocation: true
5
5
  metadata:
6
- version: '3.3.0'
6
+ version: '4.1.0'
7
7
  ---
8
8
 
9
9
  # agent-workflow-engine
package/capability.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "schema": 1,
4
4
  "name": "agent-workflow-engine",
5
5
  "kind": "methodology-engine",
6
- "version": "3.3.0",
6
+ "version": "4.1.0",
7
7
  "available": true,
8
8
  "provides": ["plan"],
9
9
  "roles": {},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sabaiway/agent-workflow-engine",
3
- "version": "3.3.0",
3
+ "version": "4.1.0",
4
4
  "description": "Canonical home of the agent-workflow planning methodology — the capped plan shape (goal and boundary, module ledger, verification), plan lifecycle, queue.md series index, and mandatory Cleanup phase, consumed by the kit (composition root). The methodology engine of the agent-workflow family.",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -118,6 +118,20 @@ plan file, and plan paths inside committed docs, are forbidden.
118
118
  and the docs cap-validator is green. An aborted plan still runs Cleanup — partial outputs land in
119
119
  `known_issues.md`.
120
120
 
121
+ ## The queue
122
+
123
+ `docs/plans/queue.md` NAMES work; it never holds the analysis of it. A row is one plain sentence
124
+ saying what the work is and for whom, then its id, then a short body — measurements, `file:line`
125
+ citations and fix direction belong to an ADR or the record the row points at. A row that goes
126
+ terminal is DELETED in the same change that mints its closing artifact — and where the queue is
127
+ gitignored, the deleted text is first written to a purge archive beside the history docs, because
128
+ there git history is no tombstone. In a hidden deployment that archive is machine-local like the rest
129
+ of the substrate: its guarantee is the working copy, not git. Frozen work with a stated resume
130
+ condition is not terminal and stays, in its own bucket. Order inside a bucket IS priority.
131
+ A prose promise to trim later has been measured failing: a checker over the file is the rung, and it
132
+ is runnable — `node <kit>/tools/queue-audit-cli.mjs --check docs/plans/queue.md --section '<bucket
133
+ heading>' --max-rows <n> --max-row-lines <n>`, declared as a project gate once the queue has migrated.
134
+
121
135
  ## The plan must read cold
122
136
 
123
137
  The executing session sees the plan file and the repository, never the authoring conversation.
@@ -38,7 +38,7 @@ Slots: review
38
38
  a `create` row and a revision of a governed contract a `modify` row, both written here so they
39
39
  exist AT review.
40
40
  3. **Self-review** — apply *What gets cut*; fold by code (read and cite the `file:line`); update
41
- `queue.md` for a series.
41
+ `queue.md` for a series, to the shape *The queue* fixes.
42
42
  4. **review {recipe}** — Solo (self-review only) / Reviewed (one backend) / Council (both; you
43
43
  synthesize), as the resolved `review` recipe selects.
44
44
  5. **Fold + loop** — fold every finding and re-review; CLEAN is **0 blockers + 0 majors** from every
@@ -46,6 +46,9 @@ against it.
46
46
  `^[a-z0-9]+(-[a-z0-9]+)*$`. Every path segment under the store is a slug.
47
47
  - **Scenario line** — `- S<N> <name> :: <repo-relative test path> :: spec:<slug>/S<N>` or
48
48
  `- S<N> <name> :: unbound`; N runs contiguously from 1; the marker equals the line's own id.
49
+ - **`## Scenarios`** — at least one scenario line; `*(empty)*` is NOT an escape here (it refuses as
50
+ `scenario-line`), because an `unbound` line already covers a scenario no test pins yet. A contract
51
+ that pins nothing is the one shape the layer exists to refuse.
49
52
  - **`## Module`** — bullets of repo-relative paths: ONE `dir/` root OR a literal file list. `..`,
50
53
  an absolute path, a backslash, a glob, and a dir + file mix each REFUSE. A retired spec may carry
51
54
  `*(empty)*`.
@@ -99,6 +102,7 @@ refuse case per rule and an accept case per kind; a refuse fixture yields exactl
99
102
  | `scenario-number` | scenario ids not contiguous from 1 |
100
103
  | `scenario-marker` | a marker whose slug or id differs from its own line |
101
104
  | `scenario-path` | a binding's test path that is not a repo-relative file |
105
+ | `scenarios-empty` | a `## Scenarios` section carrying no scenario line |
102
106
  | `out-of-scope` | no non-blank bullet and not exactly `*(empty)*` |
103
107
  | `module-line` | a `## Module` line that is not a `- <path>` bullet |
104
108
  | `module-empty` | no module path and not exactly `*(empty)*` (a retired spec may carry the marker instead of a path) |
@@ -129,12 +133,17 @@ refuse case per rule and an accept case per kind; a refuse fixture yields exactl
129
133
  scenario on a live spec is individually `unbound` until its test lands within the same plan — the
130
134
  spec's status never regresses for an extension. The binding is literal and language-agnostic: the
131
135
  marker `spec:<slug>/S<N>` must occur exactly once in the named file. The honest claim is an
132
- advisory structural pin; runnability and greenness stay the test suite's own gate.
136
+ advisory structural pin; runnability and greenness stay the test suite's own gate. A marker is an
137
+ ORDINARY source line — it counts toward the source-size practice like any other, and a pinning file
138
+ already at its cap raises the recorded ratchet to host one. There is NO sidecar binding form:
139
+ retroactive coverage of a PUBLISHED package rides a release train, because the marker moves that
140
+ package's subtree.
133
141
  - **Containment** is lexical AND realpath on every path-bearing field (bindings, child links, module
134
142
  roots). The reader judges the lexical half; realpath and symlink escapes are the structural
135
143
  checker's duty (`spec-check`, a later slice), together with marker existence and uniqueness, link
136
144
  resolution and the global invariants (slug uniqueness, module-root overlap, tree acyclicity) that
137
- only a full-tree sweep can prove.
145
+ only a full-tree sweep can prove. The store ROOT is never an op target and needs no `root` verb: it
146
+ is the navigator, judged as the listing parent of its declared child.
138
147
 
139
148
  ## Precedence — feature spec and page spec
140
149
 
@@ -176,8 +185,11 @@ that changes a contract triggers a spec revision.
176
185
 
177
186
  The onboarding path for an existing feature: read the code, author a `draft` spec from it (the
178
187
  contract it actually keeps, the scenarios its tests already pin, the Out of scope its boundaries
179
- imply), then human review promotes it to `live` through a plan. Used to dogfood the family's own
180
- subsystems; a legacy module binds through a declared file set, never a refactor ride-along.
188
+ imply), then human review promotes it to `live` through a plan. The promoting event of a retroactive
189
+ draft is PLAN APPROVAL `live` lands in the SAME slice that authors the draft, once every scenario
190
+ is bound; a slice whose whole deliverable is the specs needs no later plan to leave them provisional.
191
+ Used to dogfood the family's own subsystems; a legacy module binds through a declared file set, never
192
+ a refactor ride-along.
181
193
 
182
194
  ## Scale
183
195