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.
- package/README.md +18 -4
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/issue-parser.sh +112 -0
- package/autonomy/lib/proof-generator.py +88 -0
- package/autonomy/lib/proof-pr.sh +52 -0
- package/autonomy/loki +147 -3
- package/autonomy/quickstart.sh +342 -5
- package/autonomy/run.sh +26 -0
- package/dashboard/__init__.py +1 -1
- package/docs/EXECUTION-COCKPIT-PLAN.md +289 -0
- package/docs/HARNESS-INTELLIGENCE-PLAN.md +194 -0
- package/docs/ISSUE-TO-PR-GOLDEN-PATH-PLAN.md +257 -0
- package/loki-ts/dist/loki.js +299 -297
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-DNGNuAge.js → AdminPage-DLhWX6si.js} +1 -1
- package/web-app/dist/assets/{Avatar-CqAveJaT.js → Avatar-CqyDcUxl.js} +1 -1
- package/web-app/dist/assets/{Badge-BtMejA0Z.js → Badge-BKGSt1n2.js} +1 -1
- package/web-app/dist/assets/{Button-CikxmqSs.js → Button-DuuKHXre.js} +1 -1
- package/web-app/dist/assets/CockpitPage-DdClYERC.js +47 -0
- package/web-app/dist/assets/{ComparePage-BB8DJBWR.js → ComparePage-CUWlqBxv.js} +1 -1
- package/web-app/dist/assets/ErrorBoundary-RwfGKyRJ.js +16 -0
- package/web-app/dist/assets/{EvidenceReceiptPanel-6oquKEjd.js → EvidenceReceiptPanel-CzIgk9sg.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-5XLYWzWH.js → GitHubIssuesPanel-CsXVKuyJ.js} +3 -3
- package/web-app/dist/assets/{GitHubPRsPanel-DUfmFYeu.js → GitHubPRsPanel-CYRp1eKS.js} +3 -3
- package/web-app/dist/assets/{HomePage-DZ4MmOdH.js → HomePage-CVJcI5pQ.js} +3 -3
- package/web-app/dist/assets/LoginPage-BBJNV9Qb.js +1 -0
- package/web-app/dist/assets/{MagicPage-CFbX5gWg.js → MagicPage-CIi9P8jK.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-DbL6xmRQ.js → MetricsPage-Bm34ipiy.js} +2 -2
- package/web-app/dist/assets/{NotFoundPage-BUrjXPAR.js → NotFoundPage-DpTbcC2P.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-iP6dJihg.js → ProjectPage-CY2SMGx9.js} +65 -90
- package/web-app/dist/assets/{ProjectsPage-BibN9bHl.js → ProjectsPage-DSrXUUKJ.js} +2 -2
- package/web-app/dist/assets/{SettingsPage-C0WJp1hW.js → SettingsPage-jvDyOqYi.js} +3 -3
- package/web-app/dist/assets/{ShowcasePage-DUv0Njp8.js → ShowcasePage-C8tFWKau.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-BIaCB0Vn.js → SystemSettingsPage-DH4FTH3K.js} +2 -2
- package/web-app/dist/assets/{TeamsPage-BE0szv9r.js → TeamsPage-C1fQYauF.js} +2 -2
- package/web-app/dist/assets/{TemplatesPage-BzkA9kat.js → TemplatesPage-CSTFt-4P.js} +1 -1
- package/web-app/dist/assets/TerminalOutput-Cu4NsyN6.js +16 -0
- package/web-app/dist/assets/{activity-AbfFz38r.js → activity-CtjsDzmh.js} +1 -1
- package/web-app/dist/assets/{bell-DF6Z6y5U.js → bell-C5es1xAs.js} +1 -1
- package/web-app/dist/assets/{bot-DQ4np_3n.js → bot-DE04U5Lc.js} +1 -1
- package/web-app/dist/assets/{check-RWuguCwE.js → check-DSKKA9EU.js} +1 -1
- package/web-app/dist/assets/{chevron-left-VpbQPOkC.js → chevron-left-DJ13W5AR.js} +1 -1
- package/web-app/dist/assets/{circle-alert-DwT82lJx.js → circle-alert-CS0BfqAd.js} +1 -1
- package/web-app/dist/assets/{clock-BBlUa93G.js → clock-D1Y5nruk.js} +1 -1
- package/web-app/dist/assets/{cloud-Dgbz3VCA.js → cloud-nU6LBoZL.js} +1 -1
- package/web-app/dist/assets/{code-xml-r6qqION5.js → code-xml-BZfvIdFo.js} +1 -1
- package/web-app/dist/assets/{copy-DMHj52B8.js → copy-CK_2O1Xv.js} +1 -1
- package/web-app/dist/assets/{database-uJqHSHR1.js → database-DJiwznAm.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-BZagljek.js → dollar-sign-pO20A3QY.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-DMopmhu0.js → file-code-corner-Besy6vek.js} +1 -1
- package/web-app/dist/assets/{file-plus-DU_hT_3w.js → file-plus-DeaswxYY.js} +1 -1
- package/web-app/dist/assets/{folder-open-BP5TtQAW.js → folder-open-cr1UvQLI.js} +1 -1
- package/web-app/dist/assets/{git-commit-horizontal-zFk_IobS.js → git-commit-horizontal-BLxnfbSn.js} +1 -1
- package/web-app/dist/assets/{globe-mthCRtfp.js → globe-DrhG1NfX.js} +1 -1
- package/web-app/dist/assets/{hammer-BWaLBvSA.js → hammer-CeZtPBfE.js} +1 -1
- package/web-app/dist/assets/index-84JUN_aA.css +1 -0
- package/web-app/dist/assets/{index-BXA3UT6P.js → index-CLvjO22Z.js} +24 -24
- package/web-app/dist/assets/{layers-Q1LXV5fy.js → layers-fldADzyE.js} +1 -1
- package/web-app/dist/assets/{lightbulb-vRRNJ3dB.js → lightbulb-CznOfsPb.js} +1 -1
- package/web-app/dist/assets/{loader-circle-KgjeHEcV.js → loader-circle---lPB1Fs.js} +1 -1
- package/web-app/dist/assets/{lock-BerKqno7.js → lock-D5jVF-tO.js} +1 -1
- package/web-app/dist/assets/{mail-XAxTbprX.js → mail-D7HkLnlW.js} +1 -1
- package/web-app/dist/assets/minus-C-dT19Ct.js +6 -0
- package/web-app/dist/assets/{package-DLPKWAvW.js → package-Cm9B-cKE.js} +1 -1
- package/web-app/dist/assets/{plus-NMxxwHMn.js → plus-CQwOffLD.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-Dt42kYtM.js → refresh-cw-CvWJZLbN.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-BCR4Tp9u.js → rotate-ccw-C2Q1LYgM.js} +1 -1
- package/web-app/dist/assets/{save-sR4MJd42.js → save-BP0MvpoQ.js} +1 -1
- package/web-app/dist/assets/{server-SXkchokx.js → server-4i4VZXix.js} +1 -1
- package/web-app/dist/assets/{shield-alert-Bvgp6_Dz.js → shield-alert-D2_bgb7j.js} +1 -1
- package/web-app/dist/assets/thumbs-up-vACbzeXj.js +26 -0
- package/web-app/dist/assets/{trash-2-D0IGudH7.js → trash-2-EYjdESLs.js} +1 -1
- package/web-app/dist/assets/trending-down-BWBdcvE3.js +6 -0
- package/web-app/dist/assets/{trending-up-DDrJKL5i.js → trending-up-Bix6V_-Y.js} +1 -1
- package/web-app/dist/assets/{upload-C54rjN8K.js → upload-B7hh6ERF.js} +1 -1
- package/web-app/dist/assets/{usePolling-D7fw4YSM.js → usePolling-b_e-k-IN.js} +1 -1
- package/web-app/dist/assets/{user-Cg7fbzdh.js → user-pmjZKWEg.js} +1 -1
- package/web-app/dist/index.html +2 -2
- package/web-app/dist/assets/LoginPage-VMzI6ROD.js +0 -1
- package/web-app/dist/assets/TerminalOutput-DBrdT_Fp.js +0 -31
- package/web-app/dist/assets/index-DgpUuqwR.css +0 -1
- 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 |
|