@codyswann/lisa 2.109.0 → 2.110.1

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 (29) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/skills/github-write-prd/SKILL.md +44 -3
  5. package/plugins/lisa/skills/prd-source-write/SKILL.md +17 -0
  6. package/plugins/lisa/skills/project-ideation/SKILL.md +7 -1
  7. package/plugins/lisa/skills/research/SKILL.md +11 -2
  8. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  9. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  10. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  11. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  12. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  14. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  16. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  18. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  20. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  22. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa-wiki/scripts/lint-wiki.mjs +5 -1
  25. package/plugins/src/base/skills/github-write-prd/SKILL.md +44 -3
  26. package/plugins/src/base/skills/prd-source-write/SKILL.md +17 -0
  27. package/plugins/src/base/skills/project-ideation/SKILL.md +7 -1
  28. package/plugins/src/base/skills/research/SKILL.md +11 -2
  29. package/plugins/src/wiki/scripts/lint-wiki.mjs +5 -1
package/package.json CHANGED
@@ -82,7 +82,7 @@
82
82
  "lodash": ">=4.18.1"
83
83
  },
84
84
  "name": "@codyswann/lisa",
85
- "version": "2.109.0",
85
+ "version": "2.110.1",
86
86
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
87
87
  "main": "dist/index.js",
88
88
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -10,7 +10,8 @@ Create (or update) a PRD issue in the configured source repo. Invoked by `lisa:p
10
10
  when `source = github`; do not call directly from a vendor-neutral caller.
11
11
 
12
12
  `$ARGUMENTS` carries the `lisa:prd-source-write` spec: `title`, `body` (full PRD markdown),
13
- `initial_role` (`draft` | `ready`, default `draft`), `dedupe_key`, `marker`, optional `source_ref`.
13
+ `initial_role` (`draft` | `ready`, default `draft`), `dedupe_key`, `marker`, optional `source_ref`,
14
+ and optional `ideation_ledger_payload` from `lisa:project-ideation` via `lisa:research`.
14
15
 
15
16
  ## Phase 1 — Resolve repo and PRD lifecycle labels
16
17
 
@@ -63,6 +64,40 @@ the single instance. If the live issue body already contains the canonical manag
63
64
  section, preserve it verbatim unless the caller intentionally supplied an updated canonical section;
64
65
  use the shared `usage-accounting` serializer/merge path rather than hand-editing ledger rows.
65
66
 
67
+ **Exploratory ideation run ledger (both paths).** When the write was initiated by
68
+ `lisa:project-ideation`, carries a project-ideation marker, or includes
69
+ `ideation_ledger_payload`, persist a managed `## Exploratory Ideation Run Ledger` section in the PRD
70
+ body. Prefer the managed section over a comment so the PRD itself remains the operator's source of
71
+ truth; use a managed comment only if the body cannot be updated. Populate the fields from
72
+ `ideation_ledger_payload` when present, falling back to `marker`, `initial_role`, repo config, and
73
+ runtime metadata only for missing fields. Keep one managed section by replacing the content between
74
+ stable markers:
75
+
76
+ ```markdown
77
+ ## Exploratory Ideation Run Ledger
78
+ <!-- lisa:exploratory-ideation-run-ledger:start -->
79
+ - timestamp: <ISO-8601 run timestamp>
80
+ - automation_id: <Codex/Claude automation id or unavailable>
81
+ - repo: <org>/<repo>
82
+ - prd_ready: true|false
83
+ - persona_evidence_refs: <comma-separated source refs or unavailable>
84
+ - selected_idea: <selected idea title/key>
85
+ - dedupe_marker: <MARKER>
86
+ - prd_url: <created or reused PRD URL>
87
+ - outcome: created|reused
88
+ - lifecycle_role_after_write: draft|ready|in_review|blocked|ticketed|shipped|verified
89
+ - rejected_overlap_candidates: <issue refs/titles considered and rejected, or none>
90
+ - expected_empirical_verification_artifact: <artifact ref or unavailable>
91
+ <!-- lisa:exploratory-ideation-run-ledger:end -->
92
+ ```
93
+
94
+ On CREATE, write a ledger entry with `outcome: created`, the selected marker, the created PRD URL,
95
+ and the lifecycle role applied by this write. On UPDATE/reuse, write `outcome: reused`, preserve the
96
+ same dedupe marker, record the reused PRD URL, and report the lifecycle role that remains after
97
+ reconciliation. If the live PRD has progressed past ready, do not downgrade it while recording the
98
+ reuse ledger; the `lifecycle_role_after_write` value must be the existing progressed role. Preserve
99
+ exactly one PRD lifecycle label in the same pass as the ledger write.
100
+
66
101
  **CREATE** (no existing issue):
67
102
 
68
103
  1. Write the marker-normalized PRD body to a temp file.
@@ -70,7 +105,11 @@ use the shared `usage-accounting` serializer/merge path rather than hand-editing
70
105
  gh issue create --repo "$ORG/$REPO" --title "$TITLE" --body-file /tmp/prd-body.md --label "$ROLE_LABEL"
71
106
  ```
72
107
  3. Capture the returned issue number/URL.
73
- 4. If `github.projects.v2` is enabled, resolve the created PRD issue node id and invoke
108
+ 4. Rewrite the PRD body with the managed `## Exploratory Ideation Run Ledger` section populated for
109
+ `outcome: created` when the caller supplied project-ideation ledger inputs, then
110
+ `gh issue edit <n> --body-file /tmp/prd-body.md`. This second write is allowed because the URL is
111
+ not known until after creation.
112
+ 5. If `github.projects.v2` is enabled, resolve the created PRD issue node id and invoke
74
113
  `lisa:github-project-v2` with `operation: ensure-item` and `content_node_id: <issue-node-id>`.
75
114
  - `outcome: disabled` → continue normally.
76
115
  - `outcome: added` or `reused` → continue normally; membership is now present.
@@ -80,7 +119,9 @@ use the shared `usage-accounting` serializer/merge path rather than hand-editing
80
119
  **UPDATE** (existing issue or `source_ref`):
81
120
 
82
121
  1. `gh issue edit <n> --repo "$ORG/$REPO" --body-file /tmp/prd-body.md` with the **marker-normalized**
83
- body (regenerate in place; never drop the marker or an existing managed `## Lisa Usage` section).
122
+ body (regenerate in place; never drop the marker, the managed `## Exploratory Ideation Run Ledger`
123
+ section, or an existing managed `## Lisa Usage` section). When the caller supplied
124
+ project-ideation ledger inputs, replace the managed ledger content with an `outcome: reused` entry.
84
125
  2. Reconcile the lifecycle label to **exactly one**: add `$ROLE_LABEL`, remove every other label in
85
126
  the resolved `${ALL_PRD_LABELS[@]}` set (the config-resolved names — not a hard-coded list) via
86
127
  `gh issue edit <n> --add-label / --remove-label`. Never leave a PRD carrying two lifecycle labels.
@@ -27,6 +27,17 @@ dedupe_key: "<stable-key>" # e.g. project-ideation's idea key
27
27
  marker: "[lisa-project-ideation] idea=<stable-key>" # embedded in the PRD body for dedupe
28
28
  origin: { tool: project-ideation | research | manual }
29
29
  source_ref: "<optional existing PRD ref to force an update>"
30
+ ideation_ledger_payload: # optional; forwarded unchanged to the vendor writer
31
+ selected_marker: "<same value as marker>"
32
+ automation_id: "<Codex/Claude automation id or unavailable>"
33
+ automation_memory_path: "<path or unavailable>"
34
+ repo: "<org>/<repo or detected repo identity>"
35
+ prd_ready: true|false
36
+ persona_names: ["<derived persona name>"]
37
+ persona_evidence_refs: ["<file/doc/table/release ref>"]
38
+ selected_idea: "<selected idea title/key>"
39
+ rejected_overlap_candidates: ["<issue refs/titles considered and rejected>"]
40
+ expected_empirical_verification_artifact: "<artifact ref or unavailable>"
30
41
  ```
31
42
 
32
43
  `initial_role` semantics are uniform across vendors (the role STRINGS resolve per vendor from
@@ -72,6 +83,10 @@ prior PRD-source-write behavior to preserve, so omitted means `draft`.
72
83
  the applied role (`draft`/`ready`), the dedupe marker, and whether it was created or reused.
73
84
  Downstream callers (research, project-ideation) parse this — do not paraphrase.
74
85
 
86
+ When `ideation_ledger_payload` is present, this shim still does not render or interpret it. Forward
87
+ the object verbatim to the selected vendor writer so source-specific rendering remains behind the
88
+ configured writer and the dispatch layer never bypasses source selection.
89
+
75
90
  ## Rules
76
91
 
77
92
  - Never bypass dispatch — a vendor-neutral caller calling a `*-write-prd` skill directly defeats the
@@ -80,5 +95,7 @@ prior PRD-source-write behavior to preserve, so omitted means `draft`.
80
95
  and fallback behavior belongs in the vendor writers and follows the `usage-accounting` contract.
81
96
  - Never accept a source outside `{notion, confluence, github, linear}`. `jira` and `file` fail loudly.
82
97
  - Never mutate the spec between layers. The vendor writers define their own create/dedupe contract.
98
+ - Never drop, rename, or vendor-render `ideation_ledger_payload`; it is a pass-through payload for
99
+ the configured writer.
83
100
  - Never invent a PRD lifecycle role string — resolve every role from `config-resolution` per vendor.
84
101
  - Idempotency is the vendor writer's job (marker search before create); this shim only routes.
@@ -155,7 +155,13 @@ For each idea in the creation set, invoke `/lisa:research` with:
155
155
  grounding and the empirical verification plan),
156
156
  - `prd_ready` (this run's flag — `lisa:research` maps it to draft vs prd-ready),
157
157
  - a stable **dedupe marker** (see below) so a re-run references the existing PRD instead of creating
158
- a duplicate.
158
+ a duplicate,
159
+ - a structured `ideation_ledger_payload` handoff containing the selected marker, automation id and
160
+ memory path when available, persona names, persona evidence references, rejected overlap
161
+ candidates, repo identity, `prd_ready`, selected idea title/key, and the expected empirical
162
+ verification artifact. This payload is the only ideation-run metadata channel between
163
+ `project-ideation`, `research`, `prd-source-write`, and the vendor writer; keep GitHub-specific
164
+ rendering out of this skill.
159
165
 
160
166
  `lisa:research` synthesizes the PRD and creates it in the configured source via
161
167
  `lisa:prd-source-write`. `project-ideation` never writes to the source directly — it delegates, so
@@ -16,6 +16,12 @@ Produce a PRD for the problem in `$ARGUMENTS`, then create it in the configured
16
16
  - `dedupe_key` / `marker` (optional) — a stable dedupe marker (e.g. supplied by
17
17
  `lisa:project-ideation`) embedded in the created PRD so re-runs reference the existing PRD rather
18
18
  than creating a duplicate.
19
+ - `ideation_ledger_payload` (optional, required when invoked by `lisa:project-ideation`) — a
20
+ structured metadata object to forward unchanged to `lisa:prd-source-write`. It carries the
21
+ selected marker, automation id/path when available, persona names, persona evidence references,
22
+ rejected overlap candidates, repo identity, `prd_ready`, selected idea title/key, and expected
23
+ empirical verification artifact. `research` may use these fields to inform the PRD body, but must
24
+ not discard, rename, or vendor-render them.
19
25
 
20
26
  ## Orchestration: agent team
21
27
 
@@ -55,5 +61,8 @@ source — there is no loose document artifact.** Before handing the synthesized
55
61
  `lisa:usage-accounting` so the PRD body carries the canonical `## Lisa Usage` ledger from creation
56
62
  time onward. If the runtime does not expose trustworthy usage, the direct entry must still be
57
63
  written with `source: unavailable` and nullable token/cost fields rather than silently omitting the
58
- Research row. A `source` must be configured; if it is not, stop and report it rather than emitting
59
- a document. The Plan flow consumes the created PRD next.
64
+ Research row. If the call includes `ideation_ledger_payload`, pass that object through in the
65
+ `lisa:prd-source-write` spec unchanged alongside `marker`, `dedupe_key`, and `initial_role`; this is
66
+ the vendor-neutral handoff that lets the configured writer render an auditable run ledger without
67
+ `research` bypassing source selection. A `source` must be configured; if it is not, stop and report
68
+ it rather than emitting a document. The Plan flow consumes the created PRD next.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.109.0",
3
+ "version": "2.110.1",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -317,4 +317,8 @@ if (asJson) {
317
317
  );
318
318
  }
319
319
 
320
- process.exit(blocking === 0 ? 0 : 1);
320
+ // Set exitCode instead of calling process.exit() so a large `--json` payload
321
+ // written to a pipe (e.g. captured via spawnSync by verify-migration) is fully
322
+ // flushed before the process exits. process.exit() can truncate async stdout
323
+ // writes at the OS pipe buffer (~64KB), corrupting the JSON for the reader.
324
+ process.exitCode = blocking === 0 ? 0 : 1;
@@ -10,7 +10,8 @@ Create (or update) a PRD issue in the configured source repo. Invoked by `lisa:p
10
10
  when `source = github`; do not call directly from a vendor-neutral caller.
11
11
 
12
12
  `$ARGUMENTS` carries the `lisa:prd-source-write` spec: `title`, `body` (full PRD markdown),
13
- `initial_role` (`draft` | `ready`, default `draft`), `dedupe_key`, `marker`, optional `source_ref`.
13
+ `initial_role` (`draft` | `ready`, default `draft`), `dedupe_key`, `marker`, optional `source_ref`,
14
+ and optional `ideation_ledger_payload` from `lisa:project-ideation` via `lisa:research`.
14
15
 
15
16
  ## Phase 1 — Resolve repo and PRD lifecycle labels
16
17
 
@@ -63,6 +64,40 @@ the single instance. If the live issue body already contains the canonical manag
63
64
  section, preserve it verbatim unless the caller intentionally supplied an updated canonical section;
64
65
  use the shared `usage-accounting` serializer/merge path rather than hand-editing ledger rows.
65
66
 
67
+ **Exploratory ideation run ledger (both paths).** When the write was initiated by
68
+ `lisa:project-ideation`, carries a project-ideation marker, or includes
69
+ `ideation_ledger_payload`, persist a managed `## Exploratory Ideation Run Ledger` section in the PRD
70
+ body. Prefer the managed section over a comment so the PRD itself remains the operator's source of
71
+ truth; use a managed comment only if the body cannot be updated. Populate the fields from
72
+ `ideation_ledger_payload` when present, falling back to `marker`, `initial_role`, repo config, and
73
+ runtime metadata only for missing fields. Keep one managed section by replacing the content between
74
+ stable markers:
75
+
76
+ ```markdown
77
+ ## Exploratory Ideation Run Ledger
78
+ <!-- lisa:exploratory-ideation-run-ledger:start -->
79
+ - timestamp: <ISO-8601 run timestamp>
80
+ - automation_id: <Codex/Claude automation id or unavailable>
81
+ - repo: <org>/<repo>
82
+ - prd_ready: true|false
83
+ - persona_evidence_refs: <comma-separated source refs or unavailable>
84
+ - selected_idea: <selected idea title/key>
85
+ - dedupe_marker: <MARKER>
86
+ - prd_url: <created or reused PRD URL>
87
+ - outcome: created|reused
88
+ - lifecycle_role_after_write: draft|ready|in_review|blocked|ticketed|shipped|verified
89
+ - rejected_overlap_candidates: <issue refs/titles considered and rejected, or none>
90
+ - expected_empirical_verification_artifact: <artifact ref or unavailable>
91
+ <!-- lisa:exploratory-ideation-run-ledger:end -->
92
+ ```
93
+
94
+ On CREATE, write a ledger entry with `outcome: created`, the selected marker, the created PRD URL,
95
+ and the lifecycle role applied by this write. On UPDATE/reuse, write `outcome: reused`, preserve the
96
+ same dedupe marker, record the reused PRD URL, and report the lifecycle role that remains after
97
+ reconciliation. If the live PRD has progressed past ready, do not downgrade it while recording the
98
+ reuse ledger; the `lifecycle_role_after_write` value must be the existing progressed role. Preserve
99
+ exactly one PRD lifecycle label in the same pass as the ledger write.
100
+
66
101
  **CREATE** (no existing issue):
67
102
 
68
103
  1. Write the marker-normalized PRD body to a temp file.
@@ -70,7 +105,11 @@ use the shared `usage-accounting` serializer/merge path rather than hand-editing
70
105
  gh issue create --repo "$ORG/$REPO" --title "$TITLE" --body-file /tmp/prd-body.md --label "$ROLE_LABEL"
71
106
  ```
72
107
  3. Capture the returned issue number/URL.
73
- 4. If `github.projects.v2` is enabled, resolve the created PRD issue node id and invoke
108
+ 4. Rewrite the PRD body with the managed `## Exploratory Ideation Run Ledger` section populated for
109
+ `outcome: created` when the caller supplied project-ideation ledger inputs, then
110
+ `gh issue edit <n> --body-file /tmp/prd-body.md`. This second write is allowed because the URL is
111
+ not known until after creation.
112
+ 5. If `github.projects.v2` is enabled, resolve the created PRD issue node id and invoke
74
113
  `lisa:github-project-v2` with `operation: ensure-item` and `content_node_id: <issue-node-id>`.
75
114
  - `outcome: disabled` → continue normally.
76
115
  - `outcome: added` or `reused` → continue normally; membership is now present.
@@ -80,7 +119,9 @@ use the shared `usage-accounting` serializer/merge path rather than hand-editing
80
119
  **UPDATE** (existing issue or `source_ref`):
81
120
 
82
121
  1. `gh issue edit <n> --repo "$ORG/$REPO" --body-file /tmp/prd-body.md` with the **marker-normalized**
83
- body (regenerate in place; never drop the marker or an existing managed `## Lisa Usage` section).
122
+ body (regenerate in place; never drop the marker, the managed `## Exploratory Ideation Run Ledger`
123
+ section, or an existing managed `## Lisa Usage` section). When the caller supplied
124
+ project-ideation ledger inputs, replace the managed ledger content with an `outcome: reused` entry.
84
125
  2. Reconcile the lifecycle label to **exactly one**: add `$ROLE_LABEL`, remove every other label in
85
126
  the resolved `${ALL_PRD_LABELS[@]}` set (the config-resolved names — not a hard-coded list) via
86
127
  `gh issue edit <n> --add-label / --remove-label`. Never leave a PRD carrying two lifecycle labels.
@@ -27,6 +27,17 @@ dedupe_key: "<stable-key>" # e.g. project-ideation's idea key
27
27
  marker: "[lisa-project-ideation] idea=<stable-key>" # embedded in the PRD body for dedupe
28
28
  origin: { tool: project-ideation | research | manual }
29
29
  source_ref: "<optional existing PRD ref to force an update>"
30
+ ideation_ledger_payload: # optional; forwarded unchanged to the vendor writer
31
+ selected_marker: "<same value as marker>"
32
+ automation_id: "<Codex/Claude automation id or unavailable>"
33
+ automation_memory_path: "<path or unavailable>"
34
+ repo: "<org>/<repo or detected repo identity>"
35
+ prd_ready: true|false
36
+ persona_names: ["<derived persona name>"]
37
+ persona_evidence_refs: ["<file/doc/table/release ref>"]
38
+ selected_idea: "<selected idea title/key>"
39
+ rejected_overlap_candidates: ["<issue refs/titles considered and rejected>"]
40
+ expected_empirical_verification_artifact: "<artifact ref or unavailable>"
30
41
  ```
31
42
 
32
43
  `initial_role` semantics are uniform across vendors (the role STRINGS resolve per vendor from
@@ -72,6 +83,10 @@ prior PRD-source-write behavior to preserve, so omitted means `draft`.
72
83
  the applied role (`draft`/`ready`), the dedupe marker, and whether it was created or reused.
73
84
  Downstream callers (research, project-ideation) parse this — do not paraphrase.
74
85
 
86
+ When `ideation_ledger_payload` is present, this shim still does not render or interpret it. Forward
87
+ the object verbatim to the selected vendor writer so source-specific rendering remains behind the
88
+ configured writer and the dispatch layer never bypasses source selection.
89
+
75
90
  ## Rules
76
91
 
77
92
  - Never bypass dispatch — a vendor-neutral caller calling a `*-write-prd` skill directly defeats the
@@ -80,5 +95,7 @@ prior PRD-source-write behavior to preserve, so omitted means `draft`.
80
95
  and fallback behavior belongs in the vendor writers and follows the `usage-accounting` contract.
81
96
  - Never accept a source outside `{notion, confluence, github, linear}`. `jira` and `file` fail loudly.
82
97
  - Never mutate the spec between layers. The vendor writers define their own create/dedupe contract.
98
+ - Never drop, rename, or vendor-render `ideation_ledger_payload`; it is a pass-through payload for
99
+ the configured writer.
83
100
  - Never invent a PRD lifecycle role string — resolve every role from `config-resolution` per vendor.
84
101
  - Idempotency is the vendor writer's job (marker search before create); this shim only routes.
@@ -155,7 +155,13 @@ For each idea in the creation set, invoke `/lisa:research` with:
155
155
  grounding and the empirical verification plan),
156
156
  - `prd_ready` (this run's flag — `lisa:research` maps it to draft vs prd-ready),
157
157
  - a stable **dedupe marker** (see below) so a re-run references the existing PRD instead of creating
158
- a duplicate.
158
+ a duplicate,
159
+ - a structured `ideation_ledger_payload` handoff containing the selected marker, automation id and
160
+ memory path when available, persona names, persona evidence references, rejected overlap
161
+ candidates, repo identity, `prd_ready`, selected idea title/key, and the expected empirical
162
+ verification artifact. This payload is the only ideation-run metadata channel between
163
+ `project-ideation`, `research`, `prd-source-write`, and the vendor writer; keep GitHub-specific
164
+ rendering out of this skill.
159
165
 
160
166
  `lisa:research` synthesizes the PRD and creates it in the configured source via
161
167
  `lisa:prd-source-write`. `project-ideation` never writes to the source directly — it delegates, so
@@ -16,6 +16,12 @@ Produce a PRD for the problem in `$ARGUMENTS`, then create it in the configured
16
16
  - `dedupe_key` / `marker` (optional) — a stable dedupe marker (e.g. supplied by
17
17
  `lisa:project-ideation`) embedded in the created PRD so re-runs reference the existing PRD rather
18
18
  than creating a duplicate.
19
+ - `ideation_ledger_payload` (optional, required when invoked by `lisa:project-ideation`) — a
20
+ structured metadata object to forward unchanged to `lisa:prd-source-write`. It carries the
21
+ selected marker, automation id/path when available, persona names, persona evidence references,
22
+ rejected overlap candidates, repo identity, `prd_ready`, selected idea title/key, and expected
23
+ empirical verification artifact. `research` may use these fields to inform the PRD body, but must
24
+ not discard, rename, or vendor-render them.
19
25
 
20
26
  ## Orchestration: agent team
21
27
 
@@ -55,5 +61,8 @@ source — there is no loose document artifact.** Before handing the synthesized
55
61
  `lisa:usage-accounting` so the PRD body carries the canonical `## Lisa Usage` ledger from creation
56
62
  time onward. If the runtime does not expose trustworthy usage, the direct entry must still be
57
63
  written with `source: unavailable` and nullable token/cost fields rather than silently omitting the
58
- Research row. A `source` must be configured; if it is not, stop and report it rather than emitting
59
- a document. The Plan flow consumes the created PRD next.
64
+ Research row. If the call includes `ideation_ledger_payload`, pass that object through in the
65
+ `lisa:prd-source-write` spec unchanged alongside `marker`, `dedupe_key`, and `initial_role`; this is
66
+ the vendor-neutral handoff that lets the configured writer render an auditable run ledger without
67
+ `research` bypassing source selection. A `source` must be configured; if it is not, stop and report
68
+ it rather than emitting a document. The Plan flow consumes the created PRD next.
@@ -317,4 +317,8 @@ if (asJson) {
317
317
  );
318
318
  }
319
319
 
320
- process.exit(blocking === 0 ? 0 : 1);
320
+ // Set exitCode instead of calling process.exit() so a large `--json` payload
321
+ // written to a pipe (e.g. captured via spawnSync by verify-migration) is fully
322
+ // flushed before the process exits. process.exit() can truncate async stdout
323
+ // writes at the OS pipe buffer (~64KB), corrupting the JSON for the reader.
324
+ process.exitCode = blocking === 0 ? 0 : 1;