loki-mode 9.22.4 → 9.22.6

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 (85) hide show
  1. package/README.md +18 -4
  2. package/SKILL.md +2 -2
  3. package/VERSION +1 -1
  4. package/autonomy/issue-parser.sh +112 -0
  5. package/autonomy/lib/proof-generator.py +88 -0
  6. package/autonomy/lib/proof-pr.sh +52 -0
  7. package/autonomy/loki +147 -3
  8. package/autonomy/quickstart.sh +342 -5
  9. package/autonomy/run.sh +26 -0
  10. package/dashboard/__init__.py +1 -1
  11. package/docs/EXECUTION-COCKPIT-PLAN.md +289 -0
  12. package/docs/HARNESS-INTELLIGENCE-PLAN.md +194 -0
  13. package/docs/ISSUE-TO-PR-GOLDEN-PATH-PLAN.md +257 -0
  14. package/loki-ts/dist/loki.js +299 -297
  15. package/mcp/__init__.py +1 -1
  16. package/package.json +1 -1
  17. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  18. package/web-app/dist/assets/{AdminPage-DNGNuAge.js → AdminPage-DLhWX6si.js} +1 -1
  19. package/web-app/dist/assets/{Avatar-CqAveJaT.js → Avatar-CqyDcUxl.js} +1 -1
  20. package/web-app/dist/assets/{Badge-BtMejA0Z.js → Badge-BKGSt1n2.js} +1 -1
  21. package/web-app/dist/assets/{Button-CikxmqSs.js → Button-DuuKHXre.js} +1 -1
  22. package/web-app/dist/assets/CockpitPage-DdClYERC.js +47 -0
  23. package/web-app/dist/assets/{ComparePage-BB8DJBWR.js → ComparePage-CUWlqBxv.js} +1 -1
  24. package/web-app/dist/assets/ErrorBoundary-RwfGKyRJ.js +16 -0
  25. package/web-app/dist/assets/{EvidenceReceiptPanel-6oquKEjd.js → EvidenceReceiptPanel-CzIgk9sg.js} +1 -1
  26. package/web-app/dist/assets/{GitHubIssuesPanel-5XLYWzWH.js → GitHubIssuesPanel-CsXVKuyJ.js} +3 -3
  27. package/web-app/dist/assets/{GitHubPRsPanel-DUfmFYeu.js → GitHubPRsPanel-CYRp1eKS.js} +3 -3
  28. package/web-app/dist/assets/{HomePage-DZ4MmOdH.js → HomePage-CVJcI5pQ.js} +3 -3
  29. package/web-app/dist/assets/LoginPage-BBJNV9Qb.js +1 -0
  30. package/web-app/dist/assets/{MagicPage-CFbX5gWg.js → MagicPage-CIi9P8jK.js} +1 -1
  31. package/web-app/dist/assets/{MetricsPage-DbL6xmRQ.js → MetricsPage-Bm34ipiy.js} +2 -2
  32. package/web-app/dist/assets/{NotFoundPage-BUrjXPAR.js → NotFoundPage-DpTbcC2P.js} +1 -1
  33. package/web-app/dist/assets/{ProjectPage-iP6dJihg.js → ProjectPage-CY2SMGx9.js} +65 -90
  34. package/web-app/dist/assets/{ProjectsPage-BibN9bHl.js → ProjectsPage-DSrXUUKJ.js} +2 -2
  35. package/web-app/dist/assets/{SettingsPage-C0WJp1hW.js → SettingsPage-jvDyOqYi.js} +3 -3
  36. package/web-app/dist/assets/{ShowcasePage-DUv0Njp8.js → ShowcasePage-C8tFWKau.js} +1 -1
  37. package/web-app/dist/assets/{SystemSettingsPage-BIaCB0Vn.js → SystemSettingsPage-DH4FTH3K.js} +2 -2
  38. package/web-app/dist/assets/{TeamsPage-BE0szv9r.js → TeamsPage-C1fQYauF.js} +2 -2
  39. package/web-app/dist/assets/{TemplatesPage-BzkA9kat.js → TemplatesPage-CSTFt-4P.js} +1 -1
  40. package/web-app/dist/assets/TerminalOutput-Cu4NsyN6.js +16 -0
  41. package/web-app/dist/assets/{activity-AbfFz38r.js → activity-CtjsDzmh.js} +1 -1
  42. package/web-app/dist/assets/{bell-DF6Z6y5U.js → bell-C5es1xAs.js} +1 -1
  43. package/web-app/dist/assets/{bot-DQ4np_3n.js → bot-DE04U5Lc.js} +1 -1
  44. package/web-app/dist/assets/{check-RWuguCwE.js → check-DSKKA9EU.js} +1 -1
  45. package/web-app/dist/assets/{chevron-left-VpbQPOkC.js → chevron-left-DJ13W5AR.js} +1 -1
  46. package/web-app/dist/assets/{circle-alert-DwT82lJx.js → circle-alert-CS0BfqAd.js} +1 -1
  47. package/web-app/dist/assets/{clock-BBlUa93G.js → clock-D1Y5nruk.js} +1 -1
  48. package/web-app/dist/assets/{cloud-Dgbz3VCA.js → cloud-nU6LBoZL.js} +1 -1
  49. package/web-app/dist/assets/{code-xml-r6qqION5.js → code-xml-BZfvIdFo.js} +1 -1
  50. package/web-app/dist/assets/{copy-DMHj52B8.js → copy-CK_2O1Xv.js} +1 -1
  51. package/web-app/dist/assets/{database-uJqHSHR1.js → database-DJiwznAm.js} +1 -1
  52. package/web-app/dist/assets/{dollar-sign-BZagljek.js → dollar-sign-pO20A3QY.js} +1 -1
  53. package/web-app/dist/assets/{file-code-corner-DMopmhu0.js → file-code-corner-Besy6vek.js} +1 -1
  54. package/web-app/dist/assets/{file-plus-DU_hT_3w.js → file-plus-DeaswxYY.js} +1 -1
  55. package/web-app/dist/assets/{folder-open-BP5TtQAW.js → folder-open-cr1UvQLI.js} +1 -1
  56. package/web-app/dist/assets/{git-commit-horizontal-zFk_IobS.js → git-commit-horizontal-BLxnfbSn.js} +1 -1
  57. package/web-app/dist/assets/{globe-mthCRtfp.js → globe-DrhG1NfX.js} +1 -1
  58. package/web-app/dist/assets/{hammer-BWaLBvSA.js → hammer-CeZtPBfE.js} +1 -1
  59. package/web-app/dist/assets/index-84JUN_aA.css +1 -0
  60. package/web-app/dist/assets/{index-BXA3UT6P.js → index-CLvjO22Z.js} +24 -24
  61. package/web-app/dist/assets/{layers-Q1LXV5fy.js → layers-fldADzyE.js} +1 -1
  62. package/web-app/dist/assets/{lightbulb-vRRNJ3dB.js → lightbulb-CznOfsPb.js} +1 -1
  63. package/web-app/dist/assets/{loader-circle-KgjeHEcV.js → loader-circle---lPB1Fs.js} +1 -1
  64. package/web-app/dist/assets/{lock-BerKqno7.js → lock-D5jVF-tO.js} +1 -1
  65. package/web-app/dist/assets/{mail-XAxTbprX.js → mail-D7HkLnlW.js} +1 -1
  66. package/web-app/dist/assets/minus-C-dT19Ct.js +6 -0
  67. package/web-app/dist/assets/{package-DLPKWAvW.js → package-Cm9B-cKE.js} +1 -1
  68. package/web-app/dist/assets/{plus-NMxxwHMn.js → plus-CQwOffLD.js} +1 -1
  69. package/web-app/dist/assets/{refresh-cw-Dt42kYtM.js → refresh-cw-CvWJZLbN.js} +1 -1
  70. package/web-app/dist/assets/{rotate-ccw-BCR4Tp9u.js → rotate-ccw-C2Q1LYgM.js} +1 -1
  71. package/web-app/dist/assets/{save-sR4MJd42.js → save-BP0MvpoQ.js} +1 -1
  72. package/web-app/dist/assets/{server-SXkchokx.js → server-4i4VZXix.js} +1 -1
  73. package/web-app/dist/assets/{shield-alert-Bvgp6_Dz.js → shield-alert-D2_bgb7j.js} +1 -1
  74. package/web-app/dist/assets/thumbs-up-vACbzeXj.js +26 -0
  75. package/web-app/dist/assets/{trash-2-D0IGudH7.js → trash-2-EYjdESLs.js} +1 -1
  76. package/web-app/dist/assets/trending-down-BWBdcvE3.js +6 -0
  77. package/web-app/dist/assets/{trending-up-DDrJKL5i.js → trending-up-Bix6V_-Y.js} +1 -1
  78. package/web-app/dist/assets/{upload-C54rjN8K.js → upload-B7hh6ERF.js} +1 -1
  79. package/web-app/dist/assets/{usePolling-D7fw4YSM.js → usePolling-b_e-k-IN.js} +1 -1
  80. package/web-app/dist/assets/{user-Cg7fbzdh.js → user-pmjZKWEg.js} +1 -1
  81. package/web-app/dist/index.html +2 -2
  82. package/web-app/dist/assets/LoginPage-VMzI6ROD.js +0 -1
  83. package/web-app/dist/assets/TerminalOutput-DBrdT_Fp.js +0 -31
  84. package/web-app/dist/assets/index-DgpUuqwR.css +0 -1
  85. package/web-app/dist/assets/trending-down-BbFFBq-v.js +0 -11
@@ -0,0 +1,257 @@
1
+ # Issue-to-PR Golden Path -- Architecture and Acceptance Plan
2
+
3
+ Lane: LOKI-GOLDEN-PATH-68. Status: plan for the first user-visible slice.
4
+
5
+ ## 0. Two scope facts stated up front
6
+
7
+ **Which file was read as AGENTS.md.** There is no `AGENTS.md` at the repo root.
8
+ The two candidates are `skills/agents.md` (263 lines) and `references/agents.md`
9
+ (1043 lines). `skills/agents.md` was read in full; it is the agent-dispatch and
10
+ structured-prompting module, and its "Project AGENTS.md" section (L184-192)
11
+ defines the AAIF priority order this repo follows. It contains no numbered
12
+ feature list.
13
+
14
+ **Where the feature numbering comes from.** The directive names features
15
+ 1, 2, 3, 4, 9, 10. No document in this repo contains a numbered list of >=10
16
+ items describing the issue-to-PR journey. `docs/CAPABILITY-BACKLOG.md` has a
17
+ numbered priority table but it stops at 6 and is about verification-tax
18
+ measurement, not this journey. This was verified exhaustively, not
19
+ assumed: searches over the semantics (`review-ready`, `time to first`,
20
+ `issue to PR`, `golden path`) across every file type, every local and remote
21
+ ref, and deleted files in git history found no such list. The phrase "golden
22
+ path" appears nowhere in the repo, and the closest founder mandates
23
+ (`docs/COCKPIT-UX-MANDATE.md`, the deleted `docs/KILLER-FEATURE-MANDATE.md`)
24
+ carry 6 and 7 items respectively on unrelated subjects.
25
+
26
+ Therefore this plan maps the six labels onto the six required-outcome clauses in
27
+ the directive itself, in the order the directive states them. This is an
28
+ assumption, and it is recorded here so it can be corrected cheaply:
29
+
30
+ | # | Feature | Directive clause |
31
+ |---|---------|------------------|
32
+ | 1 | Single entrypoint | one `loki start <issue>` path |
33
+ | 2 | Exact acceptance context import | imports exact issue acceptance context |
34
+ | 3 | Early machine-readable status/plan | useful machine-readable early result inside 60s |
35
+ | 4 | One unified review-ready result | completes with one unified review-ready result |
36
+ | 9 | Consent-gated PR | PR created/prepared only after existing consent rules |
37
+ | 10 | Truthful evidence receipt | attaches a truthful evidence/outcome receipt |
38
+
39
+ Features 5-8 are unallocated under this reading. Nothing in this slice claims
40
+ to implement them.
41
+
42
+ ## 1. What already exists (verified by reading, not assumed)
43
+
44
+ This journey is mostly assembled, not missing. The slice is integration.
45
+
46
+ | Seam | Location | State |
47
+ |---|---|---|
48
+ | Issue ref parsing | `autonomy/issue-parser.sh:89` `parse_issue_ref` | Handles URL, `owner/repo#N`, bare `N` |
49
+ | Acceptance extraction | `autonomy/issue-parser.sh:154` `extract_acceptance_criteria` | Extracts checkboxes + Acceptance Criteria / Requirements sections |
50
+ | Structured issue output | `autonomy/issue-parser.sh:423` `output_json` | Emits `acceptance_criteria` as a JSON field |
51
+ | Single entrypoint | `autonomy/loki:2779` | `loki start` already detects issue refs and re-dispatches to `cmd_run` |
52
+ | PR creation (attached) | `autonomy/loki:10237` | `gh pr create` in the `cmd_run` github branch |
53
+ | PR creation (detached) | `autonomy/loki:10088` | second `gh pr create` inside the detached inner script |
54
+ | Evidence receipt render | `autonomy/lib/proof-pr.sh:49` `render_evidence_receipt_md` | Print-only, honesty-gated, never blocks PR creation |
55
+ | Proof assembly | `autonomy/lib/proof-generator.py:1097` `_build_proof` | Emits facts/assessments/honesty blocks |
56
+ | Time to first artifact | `.loki/state/first-artifact.json` (writer `run.sh:23292`, reader `run.sh:4271`) | `seconds_to_first_artifact`, write-once |
57
+ | Intervention socket | `autonomy/lib/trust_trajectory.py:145` `_interventions_value` | Reads `proof.interventions`; documents that no writer exists yet |
58
+ | Zero-spend preview pattern | `autonomy/quickstart.sh:475` + `_qs_load_preview:510` | `--dry-run --json`, schema-v1, bounded + validated |
59
+ | Test harness pattern | `tests/cli/test-quickstart.sh` | Source-level stubs, zero spend, zero network |
60
+
61
+ ### Required product facts: already present vs missing
62
+
63
+ Present in `proof.json` today: elapsed time (`wall_clock_sec`), iterations
64
+ (`_collect_iterations`, with progress/rework attribution), exact changed files
65
+ (`_git_diffstat`), test outcomes (`_collect_tests`), spec (`_collect_spec`).
66
+
67
+ Missing and in scope for this slice: time to first useful result,
68
+ human-intervention count, acceptance-criteria coverage, PR state/URL,
69
+ uncertainty, rollback, and lint/typecheck/build commands recorded alongside
70
+ their outcomes.
71
+
72
+ ## 2. Architecture of the slice
73
+
74
+ Four small additions on existing seams. No new subsystem, no new gate, no new
75
+ artifact format (`docs/CAPABILITY-BACKLOG.md:45-50` explicitly forbids the
76
+ last two).
77
+
78
+ **A. Carry acceptance criteria forward (feature 2).**
79
+ `extract_acceptance_criteria` already produces the exact criteria; they are
80
+ rendered into a generated PRD and then lost. Persist the parsed criteria to
81
+ `.loki/state/issue-context.json` at import time so later stages can key on the
82
+ exact text rather than re-deriving it from prose.
83
+
84
+ **B. Early machine-readable plan (feature 3).**
85
+ Write `.loki/state/journey-plan.json` from the issue-parse output *before the
86
+ first provider call*. Because it is derived from `gh` output and not from model
87
+ output, it does not depend on provider latency at all -- the 60s budget becomes
88
+ deterministic rather than conditional. Shape and validation discipline mirror
89
+ the quickstart schema-v1 preview.
90
+
91
+ **C. Receipt facts (features 4 and 10).**
92
+ Extend `_build_proof` with the missing facts, and extend
93
+ `render_evidence_receipt_md` to print them. Both follow the honesty rule already
94
+ enforced throughout this codebase: absent measurement renders nothing, never a
95
+ fabricated zero (`run.sh:4258`, `proof-generator.py` `_compute_degraded`).
96
+ Acceptance coverage is reported as *stated vs addressed*, never as a pass/fail
97
+ verdict, because no deterministic checker exists for free-text criteria; claiming
98
+ one would be the exact "fake green" this repo's trust core forbids.
99
+ Interventions fill the socket `trust_trajectory.py:145` already reads.
100
+
101
+ **D. Consent-gated PR (feature 9).**
102
+ The consent rules already exist; the gap is that there are **two**
103
+ `gh pr create` call sites and a guard on one leaves the other unguarded. This
104
+ slice covers the attached path at `autonomy/loki:10237` and adds a
105
+ prepare-only mode that writes the PR title/body to disk without mutating
106
+ GitHub. The detached path at `:10088` is explicitly **not** covered by this
107
+ slice and is named in section 5 as remaining work.
108
+
109
+ ## 3. Files to change
110
+
111
+ | File | Change |
112
+ |---|---|
113
+ | `autonomy/issue-parser.sh` | Persist parsed issue context (incl. exact acceptance criteria) to `.loki/state/issue-context.json` |
114
+ | `autonomy/loki` | Write `journey-plan.json` before the provider call; add prepare-only PR mode at the `:10237` seam |
115
+ | `autonomy/lib/proof-generator.py` | Collect the 7 missing facts into the existing `facts` block |
116
+ | `autonomy/lib/proof-pr.sh` | Render the new facts in the receipt, honesty-gated |
117
+ | `tests/cli/test-issue-to-pr.sh` | New: end-to-end journey test with mocked `gh` + provider |
118
+
119
+ Deliberately unchanged: `autonomy/run.sh` prompt construction. CLAUDE.md records
120
+ that goal scoring is byte-mirrored between `run.sh` and
121
+ `loki-ts/src/runner/goal_score.ts` and that parity fixtures diverge if one side
122
+ is edited. Staying out of `build_prompt` also avoids the prompt-cache prefix
123
+ rule and the `loki-ts` dist-rebuild requirement entirely.
124
+
125
+ ## 4. Acceptance tests
126
+
127
+ All zero-spend, zero-network, no external GitHub mutation. `gh` and the provider
128
+ are PATH-shimmed exactly as `tests/cli/test-quickstart.sh` shims its boundaries.
129
+
130
+ 1. **Issue ref forms** -- URL, `owner/repo#N`, and bare `N` all resolve to the
131
+ same parsed context.
132
+ 2. **Exact acceptance import** -- criteria in `issue-context.json` match the
133
+ fixture issue body verbatim, including checkbox items.
134
+ 3. **Early plan exists and validates** -- `journey-plan.json` is written before
135
+ any provider invocation, and parses against the expected schema.
136
+ 4. **Provider-free dry-run** -- the full journey runs to a printed contract with
137
+ the provider shim asserting it was never called.
138
+ 5. **No PR without consent** -- default path performs no `gh pr create`; the
139
+ `gh` shim records every invocation and the test asserts the mutation set is
140
+ empty.
141
+ 6. **Prepare-only writes locally** -- prepare mode produces a PR body on disk
142
+ and still performs no GitHub mutation.
143
+ 7. **Receipt truthfulness** -- with facts absent, the receipt omits them rather
144
+ than printing zeros; with facts present, it prints the measured values.
145
+ 8. **Acceptance coverage is not a verdict** -- coverage renders as stated vs
146
+ addressed and never emits a pass/fail claim.
147
+
148
+ ## 4a. What shipped (post-implementation)
149
+
150
+ Implemented as planned, with one deviation recorded honestly:
151
+
152
+ - `autonomy/issue-parser.sh` -- `_gp_criteria_lines` + `write_journey_context`,
153
+ called from the `parse_github_issue` chokepoint so every caller is covered.
154
+ - `autonomy/loki` -- `--prepare-pr` at BOTH `loki start` and `cmd_run`; a
155
+ prepare-only block that writes `pr-title.txt` / `pr-body.md` / `pr.json` and
156
+ never invokes `gh`; PR state recorded on the published path only on ACTUAL
157
+ success, so a failed create cannot leave a "created" claim behind.
158
+ - `autonomy/lib/proof-generator.py` -- `_collect_journey` + the top-level
159
+ `interventions` mirror.
160
+ - `autonomy/lib/proof-pr.sh` -- journey rows, each conditional on measurement.
161
+ - `tests/cli/test-issue-to-pr.sh` -- 13 assertions, all passing.
162
+
163
+ **Two dead-code defects found and fixed during verification.** Both were caught
164
+ only by driving the real CLI; every unit test stayed green through both.
165
+
166
+ 1. **Wrong chokepoint.** The first implementation hooked
167
+ `issue-parser.sh::parse_github_issue`, which serves ONLY the deprecated
168
+ `loki issue parse|view`. `loki start` / `loki run` route through
169
+ `fetch_issue` (`autonomy/issue-providers.sh:333`), so features 2 and 3 were
170
+ dead on the required path. Re-hooked at the `fetch_issue` call site in
171
+ `cmd_run`, which is also provider-agnostic (github/gitlab/jira/azure). A
172
+ follow-on bug surfaced there too: `ISSUE_OWNER`/`ISSUE_REPO` are re-cleared
173
+ by later `parse_issue_reference` calls, producing a `"/#42"` ref; the ref now
174
+ comes from the normalized JSON's `repo` field.
175
+
176
+ 2. **Unreachable after exec.** `cmd_start` exec-replaces the process
177
+ (`autonomy/loki:3490`), so everything after a bare call in `cmd_run` is
178
+ unreachable -- including the PRE-EXISTING `if $create_pr` block, which
179
+ explains why the detached route reimplements PR creation instead of sharing
180
+ it. Verified empirically with a minimal repro, not inferred. `--prepare-pr`
181
+ now subshells the runner so control returns; the default path keeps the bare
182
+ call, because subshelling everything would change signal and Ctrl+C
183
+ semantics for existing users.
184
+
185
+ A third defect was found in the test harness itself: the issue fixture was
186
+ built with `python3 -c '...' FIXTURE_BODY="$body"`, which passes a positional
187
+ argument rather than an environment variable, so `os.environ` raised and
188
+ `2>/dev/null` hid it. The empty fixture made the CLI fail to fetch while
189
+ assertions passed for the wrong reason. Fixed, and an explicit non-empty guard
190
+ now fails loudly rather than vacuously.
191
+
192
+ **Deviation.** The first draft of `_gp_criteria_lines` carried a `grep -vE '^#'`
193
+ guard against a section heading leaking in as a criterion. Mutation testing
194
+ showed the guard was never reached: `extract_acceptance_criteria`'s `sed` range
195
+ already terminates at the next `^#`, and four separate constructions failed to
196
+ produce a heading that reached the filter. It was removed rather than kept as
197
+ decorative defense. The horizontal-rule guard beside it was tested the same way,
198
+ found genuinely load-bearing (a bare `---` survives the bullet-strip as a lone
199
+ `-` and would become a phantom criterion), and kept with a dedicated test.
200
+
201
+ ## 4b. Required product facts: delivered vs not
202
+
203
+ | Fact | Status |
204
+ |---|---|
205
+ | Elapsed time | delivered (pre-existing `wall_clock_sec`) |
206
+ | Time to first useful result | delivered (reads the existing `first-artifact.json`) |
207
+ | Iterations | delivered (pre-existing, incl. progress/rework split) |
208
+ | Human interventions | delivered; writer added at `run.sh::handle_pause` |
209
+ | Exact changed files | delivered (pre-existing `_git_diffstat`) |
210
+ | Test command + outcome | delivered (pre-existing) |
211
+ | Build command + outcome | delivered (pre-existing) |
212
+ | **Lint command + outcome** | **NOT delivered** |
213
+ | **Typecheck command + outcome** | **NOT delivered** |
214
+ | Acceptance-criteria coverage | delivered as *stated*, never as *met* (see below) |
215
+ | PR state / URL | delivered (`prepared` and `created`) |
216
+ | Uncertainty | delivered (counts `honesty.degraded[]`) |
217
+ | Rollback | delivered (`git reset --hard <base_sha>`) |
218
+
219
+ **Lint and typecheck are not delivered, and nothing in the receipt pretends they
220
+ are.** There is no lint or typecheck record anywhere in the proof chain today
221
+ (`grep -rn "lint\|typecheck" autonomy/lib/proof-generator.py
222
+ autonomy/lib/proof-pr.sh` returns nothing). Emitting them would require
223
+ instrumenting the gate-execution path in `run.sh` to record each command and
224
+ exit code -- real scope, and beyond a first coherent slice. Because every row in
225
+ this receipt is conditional on measurement, their absence renders no row rather
226
+ than a false green.
227
+
228
+ **Acceptance coverage is a correspondence, not a verdict.** `addressed_count` is
229
+ deliberately `null`, not `0`: there is no deterministic checker for free-text
230
+ criteria, and `0` would read as "none met", which is not known. The row states
231
+ how many criteria the issue asked for and says plainly that they are not
232
+ machine-verified.
233
+
234
+ ## 5. Explicitly not done in this slice
235
+
236
+ - Lint and typecheck command/outcome capture (see section 4b).
237
+ - The detached `gh pr create` (the inner detached script) is unguarded by this
238
+ slice's prepare-only mode, and the pre-existing attached `--pr` block remains
239
+ dead code after the `cmd_start` exec. This slice does NOT revive it: making
240
+ `--pr` publish from the attached path would turn a currently-inert flag into
241
+ one that mutates GitHub, which is a behavior change requiring its own consent
242
+ review rather than a side effect of this work.
243
+ - GitLab (`glab`) parity for prepare-only mode.
244
+ - Acceptance-criteria coverage is a reported correspondence, not a verified one.
245
+ There is no deterministic checker for free-text criteria and this slice does
246
+ not pretend to add one.
247
+ - Features 5-8 under the numbering assumption in section 0.
248
+ - No version bump, no release, no commit, no push.
249
+
250
+ ## 6. Risks
251
+
252
+ | Risk | Mitigation |
253
+ |---|---|
254
+ | Numbering assumption in section 0 is wrong | Recorded explicitly; the six implemented clauses come verbatim from the directive, so the work stands even if labels are renumbered |
255
+ | Two PR call sites, one guarded | Named as remaining work rather than silently half-fixed |
256
+ | Receipt could overstate | Every new fact follows the existing absent-renders-nothing rule; coverage is never a verdict |
257
+ | Dirty worktree | All new writes go to `.loki/state/`, which is run state, not tracked source |