@gtrabanco/pi-agentic-workflow 0.26.0 → 0.31.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.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: init-workspace
3
3
  user-invocable: true
4
- version: 4.0.3
4
+ version: 4.2.0
5
5
  argument-hint: <target-dir>
6
6
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -26,7 +26,8 @@ raw placeholders.
26
26
  three-tier dispatch and stops with the dispatcher's `open-questions@1` block
27
27
  — against a scratch unit folder when no unit exists yet (§Consent).
28
28
  ✓ The adapted scaffold and repository-state ledger are written (or the merge/abort decision was asked) and remaining placeholders are listed
29
- ✓ Nothing was installed or overwritten without an explicit yes
29
+ ✓ Nothing was installed, registered (MCP) or overwritten — including the global
30
+ Serena config — without an explicit yes
30
31
  ✓ Artifact language: explicit user instruction > the project's declared docs language > English. The CONVERSATION language never decides — a Spanish prompt still produces English PRs/issues/commits/SPECs unless one of the first two says otherwise
31
32
  ✓ The closing `→ Next:` block is printed as the ABSOLUTE last output
32
33
  ```
@@ -77,7 +78,7 @@ Inspect the target dir (`[target-dir]`, default cwd) before touching anything:
77
78
 
78
79
  ## Progressive loading — bootstrap or upgrade, never both
79
80
 
80
- The reference allowlist is exactly the five linked paths below. Never invent or
81
+ The reference allowlist is exactly the six linked paths below. Never invent or
81
82
  read another `references/` path. Step 0 selects exactly one route:
82
83
 
83
84
  **Hard rule for an existing Claude Code, Cursor, Copilot, or OpenCode
@@ -94,6 +95,10 @@ or portability unless the runtime platform has no named adapter at all.
94
95
  only. Its additive-only rule is absolute; do not replay bootstrap.
95
96
  The upgrade route loads [SERENA language servers](references/SERENA.md)
96
97
  for the additive provisioning step.
98
+ - Provisioning Engram on a host with no pi package: read
99
+ [Engram provisioning](references/ENGRAM.md) — detect, ask, register or
100
+ instruct, report. Loaded by the bootstrap write route only (the pi package
101
+ provisions itself, feature 66).
97
102
  - No named adapter exists for the detected runtime platform: add
98
103
  [portability](references/PORTABILITY.md) only for that fallback. Claude Code,
99
104
  Cursor, Copilot, and OpenCode are named supported adapters; a missing adapter
@@ -122,12 +127,23 @@ loads exactly upgrade and skips bootstrap plus portability.
122
127
  on its own. **The urgency label seeding is additive-only the same way:**
123
128
  create a missing `urgent`/`fix-next` label, never touch one that already
124
129
  exists (name, color, or description a project already customized).
125
- - **Serena convention.** `.serena/project.yml` is committed; `project.local.yml`
126
- and `cache` stay local. Never write `.serena/` config without consent. LSP
127
- never verifies documents — false positives happen when a file type's server
128
- is not listed (markdown/yaml/json are never auto-detected), and a listed
129
- server that fails to start must be removed (one failure disables every
130
- server in the project). Document verification is a script's job.
130
+ - **Serena convention — tool and config, one consent question.** `.serena/project.yml`
131
+ is committed; `project.local.yml` and `cache` stay local. Never write
132
+ `.serena/` config, install the tool, register an MCP server or touch the
133
+ global `serena_config.yml` (`trusted_project_path_patterns`) without an
134
+ explicit yes — [SERENA](references/SERENA.md) owns the single question and
135
+ the fixed provisioning report. LSP never verifies documents — false positives
136
+ happen when a file type's server is not listed (markdown/yaml/json are never
137
+ auto-detected), a listed server that fails to start must be removed (one
138
+ failure disables every server in the project), and LSP evidence stays
139
+ TypeScript/JavaScript-only. Document verification is a script's job.
140
+ - **Engram provisioning is ask-first, never assumed (feature 66).** Detect the
141
+ `engram` binary, ask before writing any host MCP config, write the absolute
142
+ path with the exact `mcp --tools=agent` argv, and report exactly what was
143
+ written. An existing `engram` declaration is never overwritten, and an absent
144
+ binary is a recorded residual — the documented install route is
145
+ `pi install npm:gentle-engram@latest`, never the CLI's own setup subcommand,
146
+ which keeps serving whatever version ran it until it is re-run.
131
147
  - **Retrieval index scaffold and git hooks are consent-gated (AC22).** The
132
148
  index surface — the committed `.agentic-workflow/index.json` config plus the
133
149
  three freshness hooks (`post-merge`, `post-checkout`, `post-rewrite`, all
@@ -217,8 +233,11 @@ OpenCode adapter does not load this fallback.
217
233
  listed as a residual when its hook API/dependency was unavailable.
218
234
  The adaptive lane conventions (unit document, triage, catalog steps, guards,
219
235
  evidence, commit formats) are written into AGENTS.md.
220
- - The Serena project config is provisioned (or reported as a residual with the
221
- reason, and the health check ran).
236
+ - Serena is provisioned and reported: the one consent question was asked, the
237
+ project config written (or skipped with its reason), the tool installed and its
238
+ MCP server registered for the detected platform — or each refused/absent item
239
+ recorded as a residual with its reason — and the fixed provisioning report
240
+ states the health check per listed server. The run completes either way.
222
241
  - **The closing `→ Next:` block is printed** (plus the offer to install the skills):
223
242
 
224
243
  ```
@@ -69,3 +69,9 @@
69
69
  website itself.
70
70
  - **Naming conventions**, **MCP servers**, and **Serena language servers** (see
71
71
  [SERENA](SERENA.md) for the mapping), if any.
72
+ - **Serena footprint** — the platform whose MCP config is the one to register
73
+ (Claude Code, Cursor, VS Code/Copilot, Codex, JetBrains), the installers
74
+ actually present (`uv --version`, `pipx --version`), and whether the global
75
+ `serena_config.yml` already covers this project root under
76
+ `trusted_project_path_patterns`. The write step offers **one** consent
77
+ question from these three facts; it never asks a second time.
@@ -24,14 +24,23 @@
24
24
  7. **Propagate the unit doc template.** Ensure
25
25
  `docs/features/_TEMPLATE/SPEC.md` exists with all 14 sections sections.
26
26
  This is the template used when creating new unit documents.
27
- 8. **Provision the Serena project config.** Load
28
- [SERENA](SERENA.md), ask consent, then: (a) append the `.gitignore`
29
- block additively (skip when already present); (b) write `.serena/project.yml`
30
- with the `language_servers` list for every detected language (never overwrite
31
- an existing file — report it); (c) run the health check from SERENA.md and
32
- record the result. If Serena is not installed, offer install or record as a
33
- residual.
34
- 9. **Install accepted agent safety hooks.** Keep the canonical policy and
27
+ 8. **Provision Serena — one consented question, then write.** Load
28
+ [SERENA](SERENA.md) and ask its single consent question; one yes covers the
29
+ tool install, the detected platform's MCP registration and the global trust
30
+ append, and a refusal installs, registers and writes **nothing**. On yes:
31
+ (a) append the `.gitignore` block additively (skip when already present);
32
+ (b) write `.serena/project.yml` with the `language_servers` list for every
33
+ detected language (never overwrite an existing file — report it); (c) run the
34
+ health check and render the fixed provisioning report. When no installer is
35
+ available, offer only what the machine can perform and record the residual
36
+ with its reason — the run completes either way.
37
+ 9. **Offer Engram provisioning.** Load [ENGRAM](ENGRAM.md), detect the binary
38
+ and ask consent: register the `engram` MCP server (absolute path, exact
39
+ `mcp --tools=agent` argv) when the host has one, leave an existing
40
+ declaration untouched, and report exactly what was written. An absent binary
41
+ becomes a residual with the documented install route — never a failed run.
42
+ Skip this step when the pi package provisions the host itself.
43
+ 10. **Install accepted agent safety hooks.** Keep the canonical policy and
35
44
  fullauto wrapper at `.agentic-workflow/hooks/`. Seed the shipped
36
45
  path-protection policy at `.agentic-workflow/path-policy.json` and its doc
37
46
  page at `.agentic-workflow/path-protection.md`, beside the hooks — the
@@ -44,10 +53,10 @@
44
53
  an unknown payload, or an existing customized hook file becomes a residual,
45
54
  never a silent overwrite. Direct merges remain blocked; do not create a
46
55
  `.automerge` exception.
47
- 10. **Offer the workflow skills.** Propose installing them:
56
+ 11. **Offer the workflow skills.** Propose installing them:
48
57
  `npx skills add gtrabanco/agentic-workflow` (note the SSH/local-path variant if
49
58
  the source is private). Don't install without a yes.
50
- 11. **State that reviews are self-contained; offer optional extras.** The
59
+ 12. **State that reviews are self-contained; offer optional extras.** The
51
60
  workflow ships its **own internal review pack** (`review-code`,
52
61
  `review-security`, `review-verify`, `review-debt`, `review-design`,
53
62
  `review-a11y`, `review-brand`, `review-perf`, `review-seo`) — it installs
@@ -57,7 +66,7 @@
57
66
  under a short "Optional review extras" note so `review-change` and
58
67
  `product-audit` run them **in addition** — never as a dependency. Don't
59
68
  install anything without a yes.
60
- 12. **Seed the urgency labels (feature 15, injection-safe urgency).** Create the
69
+ 13. **Seed the urgency labels (feature 15, injection-safe urgency).** Create the
61
70
  two capability-gated GitHub labels `triage-issue` owns and applies
62
71
  (`skills/triage-issue/SKILL.md` is the sole owner of the name/color
63
72
  vocabulary — this step only seeds it, never redefines it):
@@ -70,7 +79,7 @@
70
79
  forge is unavailable or the user declines forge setup, skip this step and
71
80
  list the two labels as a residual for the user to create manually later
72
81
  (never fail the whole scaffold on it).
73
- 13. **Report.** List what was created, which placeholders still need human input,
82
+ 14. **Report.** List what was created, which placeholders still need human input,
74
83
  the companion skills recorded/installed, the urgency labels seeded (or
75
84
  skipped, with reason), and the next step:
76
85
  `discover-repository-state` → `/unit-lane` (or `workflow-status`) → catalog
@@ -0,0 +1,107 @@
1
+ ## Why this step exists
2
+
3
+ The workflow's units save what they learned into Engram, the cross-session
4
+ memory layer its memory protocol documents. On a host whose agent has no `pi`
5
+ package to provision it (the pi package registers the server itself, feature
6
+ 66 P4), the target project has no memory layer at all unless this step offers
7
+ one — so Engram provisioning is a **parity obligation**, not an optional extra:
8
+ feature 66's approval is that the pi path registers it and every other host is
9
+ offered the same thing ask-first.
10
+
11
+ ## What this file owns
12
+
13
+ The **non-pi** half of Engram provisioning. It owns exactly four moves —
14
+ detect, ask, provision-or-instruct, report — and nothing else. The workflow-side
15
+ protocol (when units save, the recall order, the degraded path) is **not** here;
16
+ it lives in `unit-lane`'s memory reference, which the skills that run units
17
+ already load.
18
+
19
+ ## 1. Detect
20
+
21
+ Look for the `engram` binary on `PATH` (`command -v engram`) and read its
22
+ version (`engram --version`). Two outcomes matter:
23
+
24
+ - **Present** — record the resolved path and the version fingerprint.
25
+ - **Absent** — record it as a residual, and go to step 2 with the install
26
+ guidance below rather than silently skipping the step.
27
+
28
+ Never write an MCP registration file for a binary that does not resolve: a
29
+ registered-but-unstartable server fails every session after it, which is a worse
30
+ default than an honest gap.
31
+
32
+ ## 2. Ask, then do exactly what was agreed
33
+
34
+ This is a **consent-gated install** like every other in this skill. Ask one
35
+ question — "register Engram as the project's memory layer?" — and act on the
36
+ answer:
37
+
38
+ | Answer | What you do |
39
+ |---|---|
40
+ | yes | write the MCP registration named in step 3 and report it verbatim |
41
+ | no | write nothing, record it as a residual, finish the run normally |
42
+ | not installed | offer the install route below, and provision **only** if the user then says yes |
43
+
44
+ **The install route is `pi install npm:gentle-engram@latest`.** The CLI's own
45
+ setup subcommand is **not** the documented route and must never be printed as an
46
+ instruction: it pins whatever version ran it and keeps serving that version
47
+ until it is re-run, so an updated binary can sit unused behind a stale
48
+ registration (decision D3, 2026-10-21).
49
+
50
+ ## 3. What "register" means on a non-pi host
51
+
52
+ There is no `pi.registerMcpServer` here, so the registration is a **declared
53
+ file** the host agent reads. Write the server into that host's own MCP config
54
+ (the agent's documented MCP surface), never into a file the host does not read:
55
+
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "engram": { "command": "<absolute path to engram>", "args": ["mcp", "--tools=agent"] }
60
+ }
61
+ }
62
+ ```
63
+
64
+ **Rules:**
65
+
66
+ - **Absolute path, never a bare name** — the host's `PATH` at load time is not
67
+ the shell's.
68
+ - **Args are exactly** `mcp` `--tools=agent`. A different argv changes which
69
+ tools the server exposes.
70
+ - **Never overwrite a server the user already declared** under the name
71
+ `engram` — a declared server wins over anything this step would add. Report
72
+ that you found it and left it alone.
73
+ - **Additive and idempotent** — a second run with the same content writes
74
+ nothing and says so.
75
+
76
+ ## 4. Report exactly what was written
77
+
78
+ Every outcome ends in a report the user can read back:
79
+
80
+ - **Registered** — the file path, the server name, and the exact `command` +
81
+ `args` written.
82
+ - **Declined** — that nothing was written, and that the run continued.
83
+ - **Binary missing** — that nothing was written, the install route verbatim, and
84
+ that it is recorded as a residual.
85
+ - **Already declared** — the file that already carries it, and that it was left
86
+ untouched.
87
+
88
+ "Report exactly what was written" is the same contract the Serena step follows;
89
+ a provisioning step the user cannot read back is one they cannot trust.
90
+
91
+ ## Checklist (pass only if)
92
+
93
+ - [ ] `engram` presence **and** version were detected (or absence recorded)
94
+ - [ ] Consent was asked before any file was written — never assumed
95
+ - [ ] The written server uses the absolute binary path and the exact argv
96
+ - [ ] An existing `engram` declaration was left untouched and reported
97
+ - [ ] A second run is a no-op
98
+ - [ ] The closing report states what was written — or that nothing was
99
+
100
+ ## Forbidden
101
+
102
+ - Never print the CLI's own setup subcommand as the install route
103
+ - Never write an MCP config for an unresolved binary
104
+ - Never overwrite an operator's existing `engram` declaration
105
+ - Never let a memory gap fail the run — record it as a residual and continue
106
+ - Never restate the unit-boundary save/recall protocol here; that is the lane's
107
+ memory reference
@@ -93,6 +93,12 @@ check names the offending entry. Removing a failing entry (per the startup
93
93
  rule below) is the correct remediation — never leave a dead entry in the file.
94
94
  **Never claim LSP evidence for a run whose server never started.**
95
95
 
96
+ The report's `health:` line carries one entry per listed server. When the check
97
+ cannot run at all — no tool, no installer, or a refused consent, including a
98
+ refused **trust** append (§Trust) — it says so once, on that line, with the
99
+ reason, instead of reporting a pass: an absent check is a residual, never a
100
+ silent pass.
101
+
96
102
  ### Startup rule (critical)
97
103
 
98
104
  > **A server that fails to start must not stay listed.** One failing entry
@@ -121,13 +127,93 @@ deterministic script's job regardless — LSP serves navigation and diagnostics,
121
127
  not our document grammar. `node`+`npm` are required for json/yaml; `libicu` is
122
128
  required for marksman.
123
129
 
124
- ## Tool install is a different step
130
+ ## Provisioning the tool — one consented question
131
+
132
+ This file owns the **project config** *and* the tool that reads it. The install
133
+ half (`#219`) lands here as one step, never a second interview.
134
+
135
+ **Order inside the step (fixed):**
136
+
137
+ 1. **Detect what can be performed** — `uv --version` first, then `pipx
138
+ --version`. Never offer a route the machine cannot run.
139
+ 2. **Ask ONCE**, with the whole set in the question: the tool install, the MCP
140
+ registration for **the detected platform only**, and the global trust append
141
+ when the project root is not covered. One yes covers the set the question
142
+ names; a narrower yes narrows the set.
143
+ 3. **On yes** — install, register, append trust, then report exactly what
144
+ happened (§Report).
145
+ 4. **On no** — install nothing, register nothing, write nothing. Record the
146
+ absence as a residual with its reason and finish; the run still completes.
147
+
148
+ **Install routes, in the order tried:**
149
+
150
+ | Route | Command | When |
151
+ |---|---|---|
152
+ | preferred | `uv tool install -p 3.13 serena-agent`, then `serena init` | `uv` is on PATH |
153
+ | fallback | `pipx install serena-agent`, then `serena init` | `uv` absent, `pipx` present — **MCP path only** |
154
+
155
+ `serena init` creates the global `serena_config.yml` when absent and never
156
+ rewrites an existing one. `serena -V` prints `Serena <version>`: that is the
157
+ health reader, and the only proof the tool runs.
158
+
159
+ ### MCP registration — the detected platform, its own shape
160
+
161
+ Register **one** server named `serena`, in the config file of the platform
162
+ Step 0 detected. Never write a cross-platform blob, and never write a second
163
+ platform's file "to be safe". A per-workspace file (`.vscode/mcp.json`,
164
+ `.cursor/mcp.json`) needs the same consent as the rest; a global one
165
+ (`~/.codex/config.toml`, the JetBrains `mcp.json`) is append-only — the one
166
+ entry, never another line.
167
+
168
+ | Detected | Where | Entry |
169
+ |---|---|---|
170
+ | Claude Code | `claude mcp add serena -- serena start-mcp-server --context claude-code --project "$(pwd)"` (user scope: `--scope user`, `--project-from-cwd`) | command `serena` |
171
+ | Copilot / VS Code | `.vscode/mcp.json` → `servers.serena` | `{"type":"stdio","command":"serena","args":["start-mcp-server","--context=vscode","--project","${workspaceFolder}"]}` |
172
+ | Cursor | `.cursor/mcp.json` → `mcpServers.serena` | `{"command":"serena","args":["start-mcp-server","--context=ide"]}` |
173
+ | JetBrains Copilot | the global `mcp.json` Copilot opens | `{"type":"stdio","command":"serena","args":["start-mcp-server","--context=jb-copilot-plugin"]}` |
174
+ | Codex | `~/.codex/config.toml` → `[mcp_servers.serena]` | `command = "serena"`, `args = ["start-mcp-server","--project-from-cwd","--context=codex"]` |
175
+
176
+ ### Trust — the fresh clone (global config, consent-gated)
177
+
178
+ `trusted_project_path_patterns` lives in the user's **global** `serena_config.yml`,
179
+ not the project's `.serena/project.yml`, and a fresh config defaults it to `[]`.
180
+ A project root no pattern covers starts no language server, so the health check
181
+ fails with nothing in the project to blame.
182
+
183
+ - **Detect** — read the global config, test this project root against the
184
+ patterns.
185
+ - **Offer the append inside the same consented question.** This file is shared by
186
+ every project on the machine, so it is never written implicitly.
187
+ - **On yes** — append **one pattern naming this project root**. Never rewrite,
188
+ reorder or reformat any other line; an append is the only permitted edit.
189
+ - **On no** — record the untrusted state as the health-check residual. It is a
190
+ residual, not an error, and it never blocks the run.
191
+
192
+ ### Report — exactly what happened
193
+
194
+ Close the step with this fixed block. "Installed" is never assumed and never
195
+ reported from the intent to install:
125
196
 
126
- This file owns the **project config**, not the tool. If Serena is not installed,
127
- offer the install (ask-first; `uv`/`uvx` preferred, `pipx` fallback) or record
128
- it as a residual. The install half is tracked by #219.
197
+ ```text
198
+ SERENA PROVISIONING
199
+ tool: <installed | already present | refused | no installer | failed: <reason>>
200
+ version: <serena -V output, or n/a>
201
+ mcp: <registered <platform> -> <path> | already present | refused | failed: <reason>>
202
+ trust: <appended <pattern> | already covered | refused - untrusted | n/a>
203
+ config: <written .serena/project.yml | already present | skipped: <reason>>
204
+ health: <one line per listed server, see below>
205
+ residual: <none | the reason this run is degraded>
206
+ ```
129
207
 
130
208
  ## Degraded path
131
209
 
132
- Serena unavailable → warn once, continue, and record the absence in the unit's
133
- evidence. **Never block a run on it.**
210
+ Serena unavailable — no tool, no installer (`uv`, `pipx`), or a refused consent —
211
+ → warn once, continue, and record the absence with its reason in the unit's
212
+ evidence. **Never block a run on it**, and never let a degraded run read as a
213
+ healthy one: the report says which line is missing and why.
214
+
215
+ LSP evidence itself stays confined to **TypeScript/JavaScript**: a diagnostic
216
+ from any other listed server is navigation aid, never verification evidence, and
217
+ no claim may cite it. Document verification (schema rules, required sections,
218
+ column counts) stays a **deterministic script's** job regardless — LSP serves
219
+ navigation, not our document grammar.
@@ -92,13 +92,15 @@ lacks**. Nine ordered steps:
92
92
  rule as the doc blocks; a pre-existing `urgent`/`fix-next` label the
93
93
  project recolored or redescribed is left exactly as-is).
94
94
 
95
- 8. **Provision the Serena project config, additively only (Refs #219).** Load
96
- [SERENA](SERENA.md). Append the `.gitignore` block only if the target
97
- does not already contain it. Write `.serena/project.yml` only if it is
98
- absent — never touch an existing one. Report what was skipped and why.
99
- Run the health check and record the result. If Serena is not installed,
100
- offer install or record as a residual. This step is additive-only; it
101
- never rewrites or deletes, consistent with upgrade mode's rule.
95
+ 8. **Provision Serena, additively only (Refs #219).** Load
96
+ [SERENA](SERENA.md) and ask its single consent question — the tool install,
97
+ the detected platform's MCP registration and the global trust append all ride
98
+ on that one yes, and a refusal writes nothing. Then append the `.gitignore`
99
+ block only if the target lacks it, and write `.serena/project.yml` only if it
100
+ is absent — never touch an existing one. Report what was skipped and why, run
101
+ the health check, and render the fixed provisioning report. This step is
102
+ additive-only; it never rewrites or deletes, consistent with upgrade mode's
103
+ rule.
102
104
  9. **Report + hand off.** Summarize blocks added, filled, and skipped
103
105
  (residuals), the legacy `CLAUDE.md` outcome (folded items and removed, or kept
104
106
  with the reason), the urgency labels seeded (or already present), then print the
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: log-session
3
3
  user-invocable: true
4
- version: 2.2.1
4
+ version: 2.3.0
5
5
  argument-hint: "[note to prepend to the entry]"
6
6
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -124,6 +124,22 @@ the HEAD sha and start time at session open.
124
124
  open a PR just for a log entry, and never `git add -A` here — a concurrent
125
125
  conversation's work must not be swept into a log commit.
126
126
 
127
+ ## The canonical split — this skill's half (feature 66, D2)
128
+
129
+ Two writers exist on purpose; neither mirrors the other:
130
+
131
+ - **`docs/LOGS.md` (this skill)** is the **human/team journal** — what a session
132
+ set out to do, what it decided, where to resume. It travels with git, so a
133
+ teammate or a fresh clone reads it with no local state.
134
+ - **Engram (`mem_session_summary`, and the lane's `unit/<NN-slug>/doc` topic)**
135
+ is **local decision and gotcha recall keyed by unit id**, written by
136
+ `unit-lane` and `execute-phase` at unit boundaries. It stays on the machine.
137
+
138
+ Engram never mirrors this log, and this log never mirrors Engram: team memory
139
+ travels with git, agent recall stays local. Write the journal half here; the
140
+ protocol half (boundaries, recall order, degradation) lives in the lane's
141
+ memory reference, `../unit-lane/references/MEMORY.md`.
142
+
127
143
  ## Guardrails
128
144
 
129
145
  - **Never use an expensive model for this.** It's summarization; `qwen3.6`
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: unit-lane
3
3
  user-invocable: true
4
- version: 2.3.0
4
+ version: 2.4.1
5
5
  argument-hint: <NN-slug | "<idea>"> [--retriage] | --fix <issue-number> | --from-issue <issue-number>
6
6
  description: >
7
7
  One-shot lane conductor for a delivery unit: triage, implement, evidence, and
@@ -39,6 +39,8 @@ done:
39
39
  on BREACH: re-triage or record exception, never shrink the diff
40
40
  ✓ Unit doc's Evidence rows updated (command → exit/digest → output → verified-by)
41
41
  and Progress log updated (dated entry) before every commit
42
+ ✓ Memory boundaries ran — probe verdict once, saves at unit start / each phase
43
+ transition / close under `unit/<NN-slug>/doc`, degradation recorded as pending
42
44
  ✓ → Next: block printed as the absolute last output
43
45
  ```
44
46
 
@@ -167,6 +169,20 @@ Before every commit:
167
169
  - **Progress log**: `YYYY-MM-DD HH:MM — <what was done> → <commit sha> — next:
168
170
  <what is next>`
169
171
 
172
+ ### 5b. Memory boundaries
173
+
174
+ Engram is the required memory substrate; a down layer never blocks a unit —
175
+ follow [the memory protocol](references/MEMORY.md).
176
+
177
+ - **Probe once**, before the first memory read: `agentic-workflow memory probe`
178
+ → paste the verdict into Evidence; `degraded` is recorded and said once.
179
+ - **Save at unit start, each phase transition, and close** under
180
+ `topic_key: "unit/<NN-slug>/doc"`, with explicit `project` and explicit
181
+ session attribution (§5 names what carries it on each write surface).
182
+ - **Recall** `mem_context` → scoped search → one explicit `all_projects: true`
183
+ retry → `mem_get_observation` → the unit doc wins. A miss is keyword-bound,
184
+ never proof nothing was saved; an unavailable mirror is marked pending.
185
+
170
186
  ### 6. Close the unit — the close-out ladder
171
187
 
172
188
  When all triaged steps are done, in order: