loki-mode 9.75.0 → 9.77.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/completion-council.sh +24 -6
- package/autonomy/lib/proof-check.sh +43 -8
- package/autonomy/lib/voter-agents.sh +42 -5
- package/autonomy/loki +3 -0
- package/autonomy/prd-checklist.sh +77 -16
- package/autonomy/run.sh +40 -4
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/ARCHITECT-CUTS.md +359 -322
- package/docs/v10/BOARD.md +59 -39
- package/docs/v10/GUARDS.md +32 -21
- package/docs/v10/METRICS.md +4 -0
- package/loki-ts/dist/loki.js +341 -338
- 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-CMGkmNnt.js → AdminPage-_YAgQxgp.js} +1 -1
- package/web-app/dist/assets/{Avatar-9mn8sJ-2.js → Avatar-Bxbdwgz5.js} +1 -1
- package/web-app/dist/assets/{Badge-mSFLvvRX.js → Badge-DFOiCwzh.js} +1 -1
- package/web-app/dist/assets/{Button-B1v4CSkD.js → Button-84KGqMJR.js} +1 -1
- package/web-app/dist/assets/CockpitPage-Ck8i3mNd.js +47 -0
- package/web-app/dist/assets/{ComparePage-C1BXuolM.js → ComparePage-BpIdW5x8.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-C2sJyBhb.js → ErrorBoundary-Dcwg_4nU.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-a1irlBPD.js → EvidenceReceiptPanel-6II8hA4-.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-zM-WRxYB.js → GitHubIssuesPanel-CCpJxUo5.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-DvRa5Rxq.js → GitHubPRsPanel-BN7KtPRB.js} +1 -1
- package/web-app/dist/assets/{HomePage-CNwRexp5.js → HomePage-Dmh8Ompu.js} +2 -2
- package/web-app/dist/assets/{LoginPage-HKogNiEX.js → LoginPage-e_wvWykS.js} +1 -1
- package/web-app/dist/assets/{MagicPage-u1mvdkUd.js → MagicPage-SkEbXneS.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-CThdMJb5.js → MetricsPage-Jr2E8O4h.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-B1v3lELS.js → NotFoundPage-Bo-xIGHn.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-hDvSsdLF.js → ProjectPage--lRlzM8G.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-CRAegSM6.js → ProjectsPage-CG_L0UkM.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-Dt90bFxo.js → SettingsPage-DdZ4UAJM.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-C5a9l8u_.js → ShowcasePage-CnV468WN.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-DtqsDXbx.js → SystemSettingsPage-CyvaTJ_t.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-CooeoWxR.js → TeamsPage-g5hHDx0X.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-CJhTxWrw.js → TemplatesPage-CRcRm9ED.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-DvjfbDxb.js → TerminalOutput-BDBfTY9s.js} +1 -1
- package/web-app/dist/assets/{activity-DK6KBQKA.js → activity-CpH9qoQP.js} +1 -1
- package/web-app/dist/assets/{bell-Cd8tQpN6.js → bell-BtlnNdD8.js} +1 -1
- package/web-app/dist/assets/{bot-Y30w8rML.js → bot-BAH-qJ4B.js} +1 -1
- package/web-app/dist/assets/{check-B5eUl1j9.js → check-D7ydqeHo.js} +1 -1
- package/web-app/dist/assets/{chevron-left-qyvpFqze.js → chevron-left-CJ48kXi_.js} +1 -1
- package/web-app/dist/assets/{circle-alert-DXtjVPDB.js → circle-alert-C3m8Jdum.js} +1 -1
- package/web-app/dist/assets/{clock-dqQis2Q6.js → clock-CpVxJ_xL.js} +1 -1
- package/web-app/dist/assets/{cloud-CzTURYO9.js → cloud-C5RpwJJ2.js} +1 -1
- package/web-app/dist/assets/{code-xml-DLbw1HTk.js → code-xml-D8Ch_l6l.js} +1 -1
- package/web-app/dist/assets/{database-BIj38v85.js → database-Dc-r_JaX.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-9bVcHIkD.js → dollar-sign-CXOSNCEc.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-D57x6xD1.js → file-code-corner-il9KkndN.js} +1 -1
- package/web-app/dist/assets/{file-plus-BXOrz3T5.js → file-plus-CduheFSQ.js} +1 -1
- package/web-app/dist/assets/{globe-Cnq8h4Gt.js → globe-C_H2CJ0N.js} +1 -1
- package/web-app/dist/assets/{hammer-iiLGlF28.js → hammer-Dd0DZNve.js} +1 -1
- package/web-app/dist/assets/{index-uGGZ1Ij3.js → index-CnURGAFT.js} +2 -2
- package/web-app/dist/assets/{layers-gcGxxNEN.js → layers-CofXpCI5.js} +1 -1
- package/web-app/dist/assets/{loader-circle-B4Ad11xq.js → loader-circle-Z2PHP1vi.js} +1 -1
- package/web-app/dist/assets/{lock-DvQNG5RI.js → lock-BKZcBfqE.js} +1 -1
- package/web-app/dist/assets/{package-BtQBNbq2.js → package-VeINyJLx.js} +1 -1
- package/web-app/dist/assets/{plus-DKLiMXBZ.js → plus-BdRdn_Ne.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-B4Gu8e2m.js → refresh-cw-SQlfufGR.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-DATSPLYS.js → rotate-ccw-z7xY1hor.js} +1 -1
- package/web-app/dist/assets/{scroll-text-GA8EtlY4.js → scroll-text-D9DLjkO9.js} +1 -1
- package/web-app/dist/assets/{server-DT_3kM4V.js → server-VlEVEIp_.js} +1 -1
- package/web-app/dist/assets/{shield-alert-BEaqZEhO.js → shield-alert-D0ulDTaf.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-DVvA-Fas.js → thumbs-up-7_JKRnvS.js} +1 -1
- package/web-app/dist/assets/{trash-2-BCyT5A9N.js → trash-2-DmRmNre3.js} +1 -1
- package/web-app/dist/assets/{trending-down-BLcNt39o.js → trending-down-DZwkFd-S.js} +1 -1
- package/web-app/dist/assets/{trending-up-BqfBp13A.js → trending-up-4ql9Pr4t.js} +1 -1
- package/web-app/dist/assets/{upload-BxH0rjQU.js → upload-D2KPx9Uo.js} +1 -1
- package/web-app/dist/assets/{usePolling-CokbBZIQ.js → usePolling-D6alWGU5.js} +1 -1
- package/web-app/dist/assets/{user-C_u9mNZM.js → user-Bo3EjryF.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/web-app/dist/assets/CockpitPage-BW0hYuzC.js +0 -47
|
@@ -1,403 +1,440 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
## 20:
|
|
3
|
+
## 20:59Z cut (S-214..S-233)
|
|
4
4
|
|
|
5
|
-
**Checked before cutting.** All reads are on main at
|
|
6
|
-
- **Alternates re-read against the code.**
|
|
7
|
-
- **A1 (BACKLOG 108) is real.** `create_session_pr`'s `LOKI_AUTO_PR=1` branch calls `_loki_trusted_push` and never reads `.loki/state/agent-committed-user-files.z`. The only references to that file are the writer comment and the writer itself, inside `_loki_untrack_agent_committed_user_files`.
|
|
8
|
-
- **A2 (BACKLOG 17) is real.** The "Notify dashboard of active project directory" block, about 24477 today, posts to `/api/focus` behind `command -v curl` only. It has no `ENABLE_DASHBOARD` check.
|
|
9
|
-
- **A3 is real and larger than the card says.** run.sh 211 and 239 always set PROJECT_DIR to the Loki install root. So the BACKLOG 127 "guard when unset" would do nothing. The actual defect is that `council_managed_should_stop` runs `git diff --stat` in Loki's own tree, not the target project. Its three readers are still bare `python3 -E`, and p2-honest-verdict.sh (about 858) says so.
|
|
10
|
-
- **A4 (BACKLOG 51) is real.** `grep -c PYTHONUSERBASE autonomy/loki` prints 0. The NOT CHECKED text says "Install python3 cryptography" even to a user who installed it through PYTHONPATH or PYTHONUSERBASE, which `-E` ignores.
|
|
11
|
-
- **A5 is split.**
|
|
12
|
-
- BACKLOG 145 sits in the Array.from generator arm, about 1934-1994. That does not overlap S-180's helper-return arm (about 2081-2170).
|
|
13
|
-
- BACKLOG 147 edits `HELPER_LOCAL_DECL_TMPL`, which is in S-180's region, so it is held.
|
|
14
|
-
- **New class found: every `-E`-only verdict reader outside completion-council.sh (BACKLOG 53 and 54).** These are:
|
|
15
|
-
- autonomy/lib/done-recognition.sh: 16 sites.
|
|
16
|
-
- autonomy/council-v2.sh: 7 sites.
|
|
17
|
-
- autonomy/lib/voter-agents.sh: 3 sites.
|
|
18
|
-
- autonomy/lib/proof-check.sh: 3 sites.
|
|
19
|
-
- autonomy/prd-checklist.sh: about 11 sites.
|
|
20
|
-
- loki-ts/src/commands/proof.ts:606, the Bun `loki proof verify` path.
|
|
5
|
+
**Checked before cutting.** All reads are on main at 04af133a.
|
|
21
6
|
|
|
22
|
-
|
|
7
|
+
**Held dependencies, checked against main.**
|
|
8
|
+
- **Merged:**
|
|
9
|
+
- S-180 (22ff5a44)
|
|
10
|
+
- S-179 (94035ac4)
|
|
11
|
+
- S-175 (6fab92ce)
|
|
12
|
+
- S-178 (c8b4c8c0)
|
|
13
|
+
- S-187 (03070f62)
|
|
14
|
+
- **Still in flight:** S-194, S-195, S-197, S-198.
|
|
15
|
+
- **What that unblocks:**
|
|
16
|
+
- BACKLOG 147: S-180 has merged, and S-198's region (about 1934-1994, fixture about 3301) does not overlap `HELPER_LOCAL_DECL_TMPL` (1182, used about 2186). Cut as S-214.
|
|
17
|
+
- dashboard/server.py items from BACKLOG 118: S-178 has merged. The council-state fallback (8638) and the notifications zero summary (8909) are already handled on main. The skill-session `running_agents: 0` is cut as S-222. The other two are held or dropped (see below).
|
|
18
|
+
- ProjectWorkspace phase labels and Replay Build: S-187 has merged. Cut as S-230.
|
|
19
|
+
- **Still held:**
|
|
20
|
+
- BACKLOG 36: waits for S-198.
|
|
21
|
+
- BACKLOG 19 and the bash `loki proof verify` interpreter: wait for S-197.
|
|
22
|
+
- BACKLOG 99, bash half: waits for S-194 and S-195.
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
**Found shipped on main, but the backlog text still reads open.** Future cuts can skip these:
|
|
25
|
+
- 35: tests/test-moat-runner.sh:653
|
|
26
|
+
- 37 and 60: loki-ts/src/runner/quality_gates.ts about 565-615
|
|
27
|
+
- 72 and 80, the base and start-sha part: run.sh 9888-9895. The warning wording is still open and is cut as S-233.
|
|
28
|
+
- 91: run.sh 26343-26345
|
|
29
|
+
- 102: run.sh 10951-10955
|
|
30
|
+
- 104 and 120: tests/run-all-tests.sh 965-966
|
|
31
|
+
- 116, the overview council gate card: loki-overview.js about 395-414
|
|
32
|
+
- 118:
|
|
33
|
+
- standalone receipt order and the VERIFIED WITH GAPS colour: build-standalone.js 2517-2531
|
|
34
|
+
- council-state and notifications: server.py 8638, 8909
|
|
35
|
+
- 150: S-79
|
|
36
|
+
- The memory browser's null lists (loki-memory-browser.js 448-506) and the cockpit's ChangeReview and RiskPanel errors are also handled.
|
|
27
37
|
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
- BACKLOG 31: proof-verify maps unverifiable drift to 2.
|
|
36
|
-
- BACKLOG 38: `no_pass_recorded`.
|
|
37
|
-
- BACKLOG 49: the `--jwks` output is patched.
|
|
38
|
-
- BACKLOG 16 and 85: `PYTHONDONTWRITEBYTECODE` in `enforce_test_coverage`, plus the py_compile rewrite.
|
|
39
|
-
- BACKLOG 133: `PULSE_MOAT_RESULT` carries a `.sha` sidecar.
|
|
40
|
-
- BACKLOG 140: the environment-variables.md row names all four tokens and both routes.
|
|
41
|
-
- BACKLOG 13: release.sh bumps INSTALLATION.md at 320.
|
|
42
|
-
- BACKLOG 22: the resource monitor backgrounds its sleep.
|
|
43
|
-
- BACKLOG 26: test-bun-parity-disk-tolerance.sh.
|
|
44
|
-
- The unreadable-waivers banner in loki-checklist-viewer is already pinned in loki-unmeasured-panels-honesty.node.test.mjs:319.
|
|
45
|
-
- The GitPanel badge on a null fetch renders nothing.
|
|
46
|
-
- PhaseVisualizer: its only caller passes 'idle'.
|
|
47
|
-
- **Dropped on merit: BACKLOG 69 (snapshot hash size cap).**
|
|
48
|
-
- A size-plus-mtime fingerprint is spoofable, which weakens `preexisting_modified`.
|
|
49
|
-
- It changes the sealed `.sha.z` entries.
|
|
50
|
-
- Nobody has measured the stall.
|
|
38
|
+
**Dropped on merit.**
|
|
39
|
+
- **`/cost` priced at Sonnet rates with no estimate label (BACKLOG 118).**
|
|
40
|
+
- The Sonnet price only applies to a record that is missing `cost_usd`. No Loki writer produces one: run.sh 9121 always writes `model` and `cost_usd` (0 when unmeasured), and no Bun efficiency writer exists.
|
|
41
|
+
- It would close the way S-208 did.
|
|
42
|
+
- **Removing T6 from test-sentrux-init-rules.sh as a speed-up.**
|
|
43
|
+
- autonomy/loki has no `.sh` extension, so run-shellcheck.sh's `find` never lints it. T6 is its only lint.
|
|
44
|
+
- S-232 moves that lint rather than deleting it.
|
|
51
45
|
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
- Tier: HIGH (secret exposure)
|
|
57
|
-
- Region: this does not overlap S-175 (`enforce_test_coverage`) or S-195 (the focus notify block).
|
|
58
|
-
- Red:
|
|
59
|
-
- With a non-empty agent-committed-user-files.z and `LOKI_AUTO_PR=1`, the stubbed `_loki_trusted_push` gets called.
|
|
60
|
-
- The advisory path prints `git push -u` advice with no cleanup step.
|
|
61
|
-
- Green:
|
|
62
|
-
- When the record is non-empty:
|
|
63
|
-
- Recompute the fork the way `_loki_untrack_agent_committed_user_files` does: the merge base with base-branch.txt, else session-start-sha.
|
|
64
|
-
- Print `git reset --soft <fork> && git commit` before any push advice.
|
|
65
|
-
- Under `LOKI_AUTO_PR=1`, refuse the push: `log_warn` naming the files, and return 1.
|
|
66
|
-
- An empty or absent record leaves both paths byte-identical to today.
|
|
67
|
-
- Gate: the builder first reproduces the stub push call on main. If it does not reproduce, the slice closes as handled.
|
|
68
|
-
- Test rule: `cd` to scratch before sourcing run.sh, and assert that no `.loki/state/provider` appears in the repo (BACKLOG 126).
|
|
69
|
-
- Wall: `bash tests/test-auto-pr-agent-committed-refuse.sh` exits 0. Its legs:
|
|
70
|
-
- Auto path with a record: no push, rc 1, and the cleanup line printed.
|
|
71
|
-
- Advisory path with a record: the cleanup line appears before `git push -u`.
|
|
72
|
-
- Empty record: the push happens.
|
|
73
|
-
- Removing the record read in a scratch copy fails the first leg.
|
|
74
|
-
- `bash tests/test-trusted-push-agent-config.sh` exits 0.
|
|
46
|
+
**New class found: inline Python that imports from the repo under review.**
|
|
47
|
+
- The pattern is `python3 -` or bare `python3 -c` run with the target repo as cwd, which puts `''` first on sys.path.
|
|
48
|
+
- The receipt renderer in autonomy/lib/proof-pr.sh has it (it writes the PR description). So do autonomy/verify.sh's readers (`loki verify`).
|
|
49
|
+
- A committed `json.py` in the repo would be imported before the stdlib module. This is worse than the `.pth` class that S-200..S-205 close.
|
|
75
50
|
|
|
76
|
-
|
|
77
|
-
- Files:
|
|
78
|
-
- autonomy/run.sh: the "Notify dashboard of active project directory" block only.
|
|
79
|
-
- tests/test-focus-post-dashboard-off.sh (new)
|
|
80
|
-
- Tier: MEDIUM
|
|
81
|
-
- Region: this does not overlap S-175 or S-194.
|
|
82
|
-
- Red: with `ENABLE_DASHBOARD=false`, a curl shim on PATH records one POST to `/api/focus`.
|
|
83
|
-
- Green:
|
|
84
|
-
- Guard on the runtime `ENABLE_DASHBOARD`, which run.sh sets false at about 19288. Do not guard on `LOKI_DASHBOARD`.
|
|
85
|
-
- Test: extract the block by its comment anchor, as test-autocapture-shadow-write-guard.sh does. No full run.sh source.
|
|
86
|
-
- Wall: `bash tests/test-focus-post-dashboard-off.sh` exits 0.
|
|
87
|
-
- false: the shim log is empty.
|
|
88
|
-
- true: exactly one POST.
|
|
89
|
-
- Removing the guard in a scratch copy fails the false leg.
|
|
51
|
+
**Stale timings.** shard-durations.tsv still lists trust-core at 130s, reachability at 95s and the selector at 45s. Those predate S-135, S-155 and S-136. S-211 owns the tsv, so the Captain refreshes it after S-211 merges.
|
|
90
52
|
|
|
91
|
-
### S-
|
|
53
|
+
### S-214: the P7 useMemo arm misses a factory that calls a registered fabricator (BACKLOG 147)
|
|
92
54
|
- Files:
|
|
93
|
-
-
|
|
94
|
-
|
|
95
|
-
|
|
55
|
+
- tests/moat/p7-no-fabricated-data.sh, three regions only:
|
|
56
|
+
- `HELPER_LOCAL_DECL_TMPL` (about 1182) and its use (about 2186);
|
|
57
|
+
- the ceiling comment (about 978-986);
|
|
58
|
+
- one fixture beside the DECL_USEMEMO fixture (about 3138-3160).
|
|
96
59
|
- Tier: HIGH (moat)
|
|
97
|
-
-
|
|
98
|
-
|
|
99
|
-
- A planted user-site `.pth` forges the test_summary read.
|
|
60
|
+
- Region: this does not overlap S-198's Array.from arm or its fixture at about 3301. Do not append at the file tail.
|
|
61
|
+
- Red: `function getRows(d){ return [{ id: 1, user: 'Admin' }]; } const rows = useMemo(() => getRows(d), [d]); setRows(rows);` goes through.
|
|
100
62
|
- Green:
|
|
101
|
-
-
|
|
102
|
-
- The
|
|
103
|
-
|
|
104
|
-
-
|
|
105
|
-
-
|
|
63
|
+
- Add an optional `(?:React\.)?useMemo\(\s*\(\)\s*=>\s*` prefix ahead of the fabricator-call pattern.
|
|
64
|
+
- The comment stops listing this shape as a ceiling.
|
|
65
|
+
- Branch: run the widened arm on main first.
|
|
66
|
+
- On any live hit in dashboard-ui or web-app, the slice becomes report-only.
|
|
67
|
+
- Never add an allowlist. cases.txt stays unchanged.
|
|
106
68
|
- Wall:
|
|
107
|
-
- `bash tests/moat/
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
- `bash tests/moat/run.sh` reports no rule failed.
|
|
69
|
+
- `bash tests/moat/p7-no-fabricated-data.sh` prints PASS for every P7 case and flags the composed fixture.
|
|
70
|
+
- Removing the prefix in a scratch copy lets the fixture through.
|
|
71
|
+
- `git diff --stat tests/moat/cases.txt` is empty.
|
|
111
72
|
|
|
112
|
-
### S-
|
|
73
|
+
### S-215: the PR receipt renderer imports json from the target repo (cwd shadow)
|
|
113
74
|
- Files:
|
|
114
|
-
- autonomy/
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
- Tier: LOW
|
|
119
|
-
- Region: this does not overlap S-179 (`cmd_cost`).
|
|
75
|
+
- autonomy/lib/proof-pr.sh: the `render_evidence_receipt_md` heredoc reader, plus a guarded `_loki_snapshot_py_tool` copy.
|
|
76
|
+
- tests/test-proof-pr-no-cwd-shadow.sh (new)
|
|
77
|
+
- Tier: HIGH (the receipt headline in the PR body)
|
|
78
|
+
- Red: from a scratch repo that holds a `json.py` whose `load` returns `{"honesty":{"headline":"VERIFIED"}}`, a proof.json whose headline is NOT VERIFIED renders with VERIFIED.
|
|
120
79
|
- Green:
|
|
121
|
-
-
|
|
122
|
-
-
|
|
80
|
+
- Run through `_loki_snapshot_py_tool -I -S`.
|
|
81
|
+
- If no interpreter resolves, print "Evidence Receipt: unavailable for this run."
|
|
82
|
+
- Gate: reproduce the forged headline on main first. If it does not reproduce, close the slice as handled.
|
|
123
83
|
- Wall:
|
|
124
|
-
- `bash tests/test-proof-
|
|
125
|
-
- `
|
|
126
|
-
- `bash tests/test-
|
|
84
|
+
- `bash tests/test-proof-pr-no-cwd-shadow.sh` exits 0, and reverting to bare `python3 -` in a scratch copy fails it.
|
|
85
|
+
- `bash tests/test-proven-pr-receipt.sh` exits 0.
|
|
86
|
+
- `bash tests/test-council-py-tool-identity.sh` exits 0 and counts one more copy.
|
|
127
87
|
|
|
128
|
-
### S-
|
|
129
|
-
- Files:
|
|
130
|
-
- the
|
|
131
|
-
-
|
|
132
|
-
- Tier: HIGH (
|
|
133
|
-
-
|
|
134
|
-
- Red: `
|
|
135
|
-
- Green:
|
|
136
|
-
-
|
|
137
|
-
-
|
|
138
|
-
|
|
139
|
-
|
|
88
|
+
### S-216: loki verify's inline readers import from the tree under review (cwd shadow)
|
|
89
|
+
- Files:
|
|
90
|
+
- autonomy/verify.sh: the reader sites only (about 190, 591, 1269, 1271, 1295, 1337, 1339, 1441), plus a guarded helper copy.
|
|
91
|
+
- tests/test-verify-no-cwd-shadow.sh (new)
|
|
92
|
+
- Tier: HIGH (P2 verdict path)
|
|
93
|
+
- Out of scope: the `unittest` and `py_compile` runs (about 730, 921). They run the user's own code on purpose.
|
|
94
|
+
- Red: a planted `json.py` in the tree changes a recorded gate. Examples are the npm audit severity count read at about 1295, or the package.json test script read at about 591. The builder names the gate and its before and after status.
|
|
95
|
+
- Green:
|
|
96
|
+
- `-I -S` through the helper.
|
|
97
|
+
- With no interpreter, each reader returns what it returns today when python3 is absent. None of them reads as pass.
|
|
98
|
+
- Gate: reproduce the changed gate on main first.
|
|
99
|
+
- Rule: no moat case, because p2-honest-verdict.sh belongs to S-196 and S-204.
|
|
140
100
|
- Wall:
|
|
141
|
-
- `bash tests/
|
|
142
|
-
-
|
|
101
|
+
- `bash tests/test-verify-no-cwd-shadow.sh` exits 0, and reverting one site in a scratch copy fails it.
|
|
102
|
+
- `bash tests/test-verify.sh` exits 0.
|
|
103
|
+
- `bash tests/moat/run.sh` reports no rule failed. `P2.verify-exit-contract` stays pending.
|
|
104
|
+
- `bash tests/test-council-py-tool-identity.sh` exits 0.
|
|
143
105
|
|
|
144
|
-
### S-
|
|
145
|
-
- Files:
|
|
146
|
-
-
|
|
106
|
+
### S-217: enforce_test_coverage's package.json readers load user-site .pth (BACKLOG 81)
|
|
107
|
+
- Files:
|
|
108
|
+
- autonomy/run.sh: `enforce_test_coverage`, only the `_declared_test_script` and `_ws_script` readers. Anchor on those names.
|
|
109
|
+
- tests/test-enforce-test-coverage-pkg-readers-pth.sh (new)
|
|
110
|
+
- Tier: HIGH
|
|
111
|
+
- Red: a user-site `.pth` under a scratch HOME empties or changes the read, and that changes the recorded test gate outcome in test-results.json. The builder names both the runner and the pass value.
|
|
147
112
|
- Green:
|
|
148
|
-
-
|
|
149
|
-
-
|
|
150
|
-
|
|
113
|
+
- Both readers go through `_loki_snapshot_py_tool -I -S`.
|
|
114
|
+
- With no interpreter, the record reads inconclusive, never pass.
|
|
115
|
+
- Gate:
|
|
116
|
+
- Reproduce the recorded-outcome change on main first.
|
|
117
|
+
- If the forged read changes nothing that gets recorded, close as handled.
|
|
118
|
+
- Test rule: `cd` to scratch before sourcing, and assert that no `.loki/state/provider` is left in the repo.
|
|
151
119
|
- Wall:
|
|
152
|
-
- `bash tests/test-
|
|
153
|
-
-
|
|
120
|
+
- `bash tests/test-enforce-test-coverage-pkg-readers-pth.sh` exits 0, and reverting one reader to `-E` in a scratch copy fails it.
|
|
121
|
+
- `bash tests/test-honest-gate-status.sh` exits 0.
|
|
154
122
|
|
|
155
|
-
### S-
|
|
123
|
+
### S-218: the snapshot's git status runs an agent-chosen core.fsmonitor command (BACKLOG 131c)
|
|
156
124
|
- Files:
|
|
157
|
-
- autonomy/
|
|
158
|
-
- tests/test-
|
|
125
|
+
- autonomy/run.sh: `_loki_untracked_status` only.
|
|
126
|
+
- tests/test-untracked-status-fsmonitor.sh (new)
|
|
159
127
|
- Tier: HIGH
|
|
160
|
-
- Red: a
|
|
128
|
+
- Red: a repo whose `.git/config` sets `core.fsmonitor` to a script that writes a marker gets the marker during `_loki_untracked_status`.
|
|
161
129
|
- Green:
|
|
162
|
-
-
|
|
163
|
-
-
|
|
164
|
-
|
|
165
|
-
-
|
|
130
|
+
- Add `-c core.fsmonitor=false -c core.untrackedCache=false` to that status call.
|
|
131
|
+
- No marker is written, and a real untracked file is still listed.
|
|
132
|
+
- Gate: reproduce the marker on main first.
|
|
133
|
+
- Test rules:
|
|
134
|
+
- Use S-138's isolation prelude.
|
|
135
|
+
- Extract the function by name. No full run.sh source.
|
|
166
136
|
- Wall:
|
|
167
|
-
- `bash tests/test-
|
|
168
|
-
-
|
|
169
|
-
- `bash tests/test-done-recognition-tests-axis.sh` and `bash tests/test-reuse-done-recognition.sh` exit 0.
|
|
137
|
+
- `bash tests/test-untracked-status-fsmonitor.sh` exits 0, and removing the two `-c` flags in a scratch copy fails it.
|
|
138
|
+
- `bash tests/test-no-ambient-gitconfig-writes.sh` and `bash tests/test-branch-lifecycle.sh` exit 0.
|
|
170
139
|
|
|
171
|
-
### S-
|
|
140
|
+
### S-219: a failed git add -A makes the session commit silently commit nothing (BACKLOG 83)
|
|
172
141
|
- Files:
|
|
173
|
-
- autonomy/
|
|
174
|
-
- tests/test-
|
|
175
|
-
- Tier: MEDIUM
|
|
176
|
-
- Red:
|
|
177
|
-
- A `.pth` forges a vote read.
|
|
178
|
-
- A detector failure yields `0.000`, so a unanimous approve never challenges.
|
|
142
|
+
- autonomy/run.sh: `commit_session_changes`, the `git add -A` block only.
|
|
143
|
+
- tests/test-session-commit-add-failure.sh (new)
|
|
144
|
+
- Tier: MEDIUM
|
|
145
|
+
- Red: an embedded git repo with no commits under an un-ignored directory makes `git add -A` fail. The session ends with no commit and no "Left uncommitted" line.
|
|
179
146
|
- Green:
|
|
180
|
-
-
|
|
181
|
-
-
|
|
182
|
-
-
|
|
147
|
+
- Keep git's first stderr line.
|
|
148
|
+
- On a non-zero exit, reset the index, `log_warn "Left uncommitted: git add failed (<line>). Review and commit manually."`, and return 0.
|
|
149
|
+
- A successful add is unchanged.
|
|
150
|
+
- Gate: reproduce the silent no-commit on main first.
|
|
151
|
+
- Test rules: S-138 prelude; scratch cwd; no `.loki/state/provider` left in the repo.
|
|
183
152
|
- Wall:
|
|
184
|
-
- `bash tests/test-
|
|
185
|
-
-
|
|
186
|
-
- `bash tests/test-
|
|
153
|
+
- `bash tests/test-session-commit-add-failure.sh` exits 0: the warning names the failure, and a normal repo still commits.
|
|
154
|
+
- Removing the rc check in a scratch copy fails leg 1.
|
|
155
|
+
- `bash tests/test-branch-lifecycle.sh` exits 0.
|
|
187
156
|
|
|
188
|
-
### S-
|
|
157
|
+
### S-220: the untrack step's global reset drops force-staged agent files from the session commit (BACKLOG 109)
|
|
189
158
|
- Files:
|
|
190
|
-
- autonomy/
|
|
191
|
-
- tests/test-
|
|
192
|
-
- Tier:
|
|
193
|
-
- Red:
|
|
194
|
-
- Green:
|
|
195
|
-
-
|
|
159
|
+
- autonomy/run.sh: `_loki_untrack_agent_committed_user_files` only.
|
|
160
|
+
- tests/test-untrack-keeps-force-staged.sh (new)
|
|
161
|
+
- Tier: MEDIUM
|
|
162
|
+
- Red: the agent runs `git add -f dist/bundle.js` (an ignored path) and also commits one pre-existing user file. After the untrack step and the session commit, `dist/bundle.js` is in neither commit, and no warning is printed.
|
|
163
|
+
- Green:
|
|
164
|
+
- Commit the removal without resetting the whole index. The builder picks the shorter correct form: `git commit --only` on the removed paths, or a temporary `GIT_INDEX_FILE`.
|
|
165
|
+
- Other staged paths stay staged.
|
|
166
|
+
- Gate: reproduce the dropped file on main first.
|
|
167
|
+
- Size: this may run past 30 minutes.
|
|
168
|
+
- Test rules: S-138 prelude; scratch cwd.
|
|
196
169
|
- Wall:
|
|
197
|
-
- `bash tests/test-
|
|
198
|
-
- `
|
|
170
|
+
- `bash tests/test-untrack-keeps-force-staged.sh` exits 0: `dist/bundle.js` is in the session commit, and the user file is untracked and still on disk.
|
|
171
|
+
- Restoring `git reset -q` in a scratch copy fails it.
|
|
172
|
+
- `bash tests/test-branch-lifecycle.sh` exits 0.
|
|
199
173
|
|
|
200
|
-
### S-
|
|
174
|
+
### S-221: audit.py verify exits 0 when it checked nothing (BACKLOG 123, audit.py half)
|
|
201
175
|
- Files:
|
|
202
|
-
-
|
|
203
|
-
- tests/
|
|
176
|
+
- dashboard/audit.py: the `_unified_cli` verify branch and its docstring only.
|
|
177
|
+
- tests/dashboard/test_audit_verify_cli_nothing_checked.py (new)
|
|
204
178
|
- Tier: MEDIUM
|
|
205
|
-
- Red:
|
|
206
|
-
- Green:
|
|
207
|
-
-
|
|
179
|
+
- Red: `python3 dashboard/audit.py verify <empty dir>` exits 0.
|
|
180
|
+
- Green:
|
|
181
|
+
- `files_checked == 0` exits 2 (could not check), and the JSON is unchanged.
|
|
182
|
+
- `tip` and `prefix` are untouched, because src/audit/crosslink.js reads `tip`.
|
|
208
183
|
- Wall:
|
|
209
|
-
- `
|
|
210
|
-
|
|
184
|
+
- `python3 -m pytest -q tests/dashboard/test_audit_verify_cli_nothing_checked.py` covers:
|
|
185
|
+
- empty dir: 2;
|
|
186
|
+
- valid chain: 0;
|
|
187
|
+
- tampered chain: 1;
|
|
188
|
+
- `tip` on an empty dir: still 0.
|
|
189
|
+
- `bash tests/test-audit-chain-honesty.sh` and `bash tests/test-audit-js-suites.sh` exit 0.
|
|
211
190
|
|
|
212
|
-
### S-
|
|
191
|
+
### S-222: the skill-session WebSocket status push hardcodes running_agents 0 (BACKLOG 118)
|
|
213
192
|
- Files:
|
|
214
|
-
-
|
|
215
|
-
- tests/
|
|
216
|
-
- Tier:
|
|
217
|
-
- Red: a
|
|
193
|
+
- dashboard/server.py: the skill-session broadcast payload only (about 1030-1047).
|
|
194
|
+
- tests/dashboard/test_skill_session_ws_running_agents.py (new)
|
|
195
|
+
- Tier: LOW
|
|
196
|
+
- Red: with no dashboard-state.json and a fresh session.json, the pushed payload carries `running_agents: 0`.
|
|
218
197
|
- Green:
|
|
219
|
-
-
|
|
220
|
-
-
|
|
221
|
-
|
|
222
|
-
-
|
|
198
|
+
- Send `running_agents: None` (unmeasured).
|
|
199
|
+
- The clients already read null: loki-overview.js 212, loki-session-control.js 152, and web-app StatusOverview.
|
|
200
|
+
- Gate: drive the branch on main first.
|
|
201
|
+
- If the loop cannot be driven in-process, lift the payload into one function and test that.
|
|
202
|
+
- If the branch is unreachable, close as handled.
|
|
223
203
|
- Wall:
|
|
224
|
-
- `
|
|
225
|
-
-
|
|
226
|
-
- `bash tests/test-prd-checklist-interval-w4.sh` exits 0.
|
|
204
|
+
- `python3 -m pytest -q tests/dashboard/test_skill_session_ws_running_agents.py` shows running_agents None.
|
|
205
|
+
- Restoring 0 fails it.
|
|
227
206
|
|
|
228
|
-
### S-
|
|
207
|
+
### S-223: notification triggers read "No triggers configured" after a failed read (BACKLOG 114 and 118)
|
|
229
208
|
- Files:
|
|
230
|
-
-
|
|
231
|
-
-
|
|
232
|
-
-
|
|
233
|
-
-
|
|
234
|
-
-
|
|
209
|
+
- dashboard/server.py: `get_notification_triggers` only.
|
|
210
|
+
- dashboard-ui/components/loki-notification-center.js: `_loadTriggers` and the triggers empty branch only.
|
|
211
|
+
- tests/dashboard/test_notification_triggers_unreadable.py (new)
|
|
212
|
+
- dashboard-ui/tests/loki-notification-triggers-error.node.test.mjs (new)
|
|
213
|
+
- Tier: LOW
|
|
214
|
+
- Red:
|
|
215
|
+
- A corrupt triggers.json answers `{"triggers": []}`.
|
|
216
|
+
- A failed fetch keeps `[]`, so the panel says "No triggers configured".
|
|
235
217
|
- Green:
|
|
236
|
-
-
|
|
237
|
-
-
|
|
238
|
-
-
|
|
218
|
+
- The server answers `{"triggers": null, "error": "unreadable_triggers"}`, the same shape as `read_active_notifications`.
|
|
219
|
+
- The panel renders "Could not load triggers" and offers no toggles.
|
|
220
|
+
- A missing file still answers `[]`.
|
|
239
221
|
- Wall:
|
|
240
|
-
- `
|
|
241
|
-
-
|
|
242
|
-
- The Captain rebuilds loki-ts/dist.
|
|
222
|
+
- `python3 -m pytest -q tests/dashboard/test_notification_triggers_unreadable.py` passes.
|
|
223
|
+
- `node --test dashboard-ui/tests/loki-notification-triggers-error.node.test.mjs` passes: an error lacks "No triggers configured", and an empty list keeps it.
|
|
243
224
|
|
|
244
|
-
### S-
|
|
225
|
+
### S-224: the web-app receipt and cost trend show a partly priced run as a complete cost (BACKLOG 118)
|
|
245
226
|
- Files:
|
|
246
|
-
- web-app/src/
|
|
247
|
-
- web-app/src/
|
|
248
|
-
-
|
|
227
|
+
- web-app/src/components/EvidenceReceiptPanel.tsx (the Cost field only)
|
|
228
|
+
- web-app/src/api/client.ts (the ProofDetail `cost` type and the cost/timeline `runs` type only)
|
|
229
|
+
- web-app/src/pages/MetricsPage.tsx (`costTrend` only)
|
|
230
|
+
- web-app/src/components/EvidenceReceiptPanel.cost.test.mjs (new)
|
|
231
|
+
- Tier: MEDIUM
|
|
232
|
+
- Red: a detail with `cost: {usd: 1.2, cost_partial: true}` renders "$1.20".
|
|
249
233
|
- Green:
|
|
250
|
-
-
|
|
251
|
-
-
|
|
252
|
-
- `
|
|
253
|
-
- Real data keeps today's copy.
|
|
234
|
+
- The receipt renders "at least $1.20", matching cost.html and proofs.html after S-158.
|
|
235
|
+
- A partial run's trend label carries "(partial)".
|
|
236
|
+
- `cost_partial` absent or false keeps today's text.
|
|
254
237
|
- Wall:
|
|
255
|
-
- `node --test web-app/src/
|
|
256
|
-
- git null lacks "The working tree is clean" and "Nothing to push";
|
|
257
|
-
- status null lacks "No run in progress";
|
|
258
|
-
- `{ahead:0}` with no files keeps both sentences.
|
|
238
|
+
- `node --test web-app/src/components/EvidenceReceiptPanel.cost.test.mjs` passes.
|
|
259
239
|
- `cd web-app && npx tsc -b` exits 0.
|
|
260
|
-
- The Captain rebuilds web-app/dist.
|
|
261
240
|
|
|
262
|
-
### S-
|
|
241
|
+
### S-225: the standalone receipts list shows a partly priced run as a complete cost (BACKLOG 118)
|
|
263
242
|
- Files:
|
|
264
|
-
-
|
|
265
|
-
-
|
|
266
|
-
- web-app/src/cockpit/ExecutionCockpit.tsx (EvidencePanel props only)
|
|
267
|
-
- web-app/src/cockpit/EvidencePanel.state.test.mjs (new)
|
|
243
|
+
- dashboard-ui/scripts/build-standalone.js (the `loadReceipts` cost cell only)
|
|
244
|
+
- tests/test-receipts-panel.sh (one new leg)
|
|
268
245
|
- Tier: LOW
|
|
246
|
+
- Green:
|
|
247
|
+
- `cost_partial === true` renders "at least $X.XX".
|
|
248
|
+
- Anything else keeps today's text.
|
|
269
249
|
- Wall:
|
|
270
|
-
- `
|
|
271
|
-
|
|
272
|
-
- `items:[]` with no error keeps that sentence.
|
|
273
|
-
- `node web-app/src/cockpit/run-derive-view-test.mjs` exits 0.
|
|
274
|
-
- `cd web-app && npx tsc -b` exits 0.
|
|
275
|
-
- The Captain rebuilds web-app/dist.
|
|
250
|
+
- `bash tests/test-receipts-panel.sh` exits 0, and the new leg asserts the "at least" prefix only when `cost_partial` is true.
|
|
251
|
+
- `bash tests/test-budget-banner-dedup.sh` exits 0.
|
|
276
252
|
|
|
277
|
-
### S-
|
|
253
|
+
### S-226: loki stats reads unmeasured cost as $0.00 on both routes (BACKLOG 106 class)
|
|
278
254
|
- Files:
|
|
279
|
-
- autonomy/
|
|
280
|
-
-
|
|
255
|
+
- autonomy/loki (`cmd_stats` only)
|
|
256
|
+
- loki-ts/src/commands/stats.ts
|
|
257
|
+
- loki-ts/tests/commands/stats_unmeasured.test.ts (new)
|
|
258
|
+
- tests/test-stats-unmeasured-cost.sh (new)
|
|
281
259
|
- Tier: MEDIUM
|
|
282
|
-
- Red:
|
|
260
|
+
- Red: efficiency records where every cost and token field is 0 print "Estimated cost: $0.00", and the JSON has `tokens.cost_usd: 0.0`.
|
|
283
261
|
- Green:
|
|
284
|
-
-
|
|
285
|
-
-
|
|
286
|
-
-
|
|
262
|
+
- A record counts when `efficiency_cost.record_is_measured` (bash) or kpis.ts `recordsMeasured` (Bun) holds.
|
|
263
|
+
- If none counts, the JSON sends `cost_usd: null` and the text says "not recorded".
|
|
264
|
+
- Budget used follows `cmd_cost`'s rule: a positive recorded `budget_used`, else the measured current cost, else null.
|
|
265
|
+
- Both routes produce identical output.
|
|
266
|
+
- Size: this may run past 30 minutes.
|
|
287
267
|
- Wall:
|
|
288
|
-
- `
|
|
289
|
-
-
|
|
290
|
-
-
|
|
268
|
+
- `bash tests/test-stats-unmeasured-cost.sh` exits 0.
|
|
269
|
+
- `cd loki-ts && bun test tests/commands/stats.test.ts tests/commands/stats_unmeasured.test.ts` exits 0.
|
|
270
|
+
- `bash tests/test-bash-bun-parity.sh` exits 0.
|
|
291
271
|
|
|
292
|
-
### S-
|
|
272
|
+
### S-227: loki status prints Budget $0 for a run it never measured, on both routes (BACKLOG 106 class)
|
|
293
273
|
- Files:
|
|
294
|
-
- loki
|
|
295
|
-
- loki-ts/
|
|
296
|
-
- loki-ts/tests/
|
|
274
|
+
- autonomy/loki (the `cmd_status` budget block only)
|
|
275
|
+
- loki-ts/src/commands/status.ts (`readBudgetField` and its budget caller only)
|
|
276
|
+
- loki-ts/tests/commands/status.test.ts (budget legs only)
|
|
277
|
+
- tests/test-status-budget-unmeasured.sh (new)
|
|
297
278
|
- Tier: MEDIUM
|
|
279
|
+
- Red: `"budget_used": 0` (what `check_budget_limit` writes when unmeasured), null, or a missing key prints "Budget: $0 / $10" on bash and "0" on Bun.
|
|
298
280
|
- Green:
|
|
299
|
-
-
|
|
300
|
-
-
|
|
281
|
+
- Only a positive recorded `budget_used` is a reading, the same rule as `cmd_cost`.
|
|
282
|
+
- Otherwise print "Budget: not recorded / $10" (or "Cost: not recorded (no limit)") and skip the gauge.
|
|
283
|
+
- Both routes produce identical output.
|
|
301
284
|
- Wall:
|
|
302
|
-
- `
|
|
303
|
-
-
|
|
304
|
-
-
|
|
305
|
-
- Removing the prefix fails the three legs.
|
|
306
|
-
- The Captain rebuilds loki-ts/dist.
|
|
285
|
+
- `bash tests/test-status-budget-unmeasured.sh` exits 0.
|
|
286
|
+
- `cd loki-ts && bun test tests/commands/status.test.ts` exits 0.
|
|
287
|
+
- `bash tests/test-status-cli-provider-parity.sh` exits 0.
|
|
307
288
|
|
|
308
|
-
### S-
|
|
309
|
-
- Files:
|
|
289
|
+
### S-228: DeployConnections pushes default "not connected" states upward after its own fetch failed (BACKLOG 121)
|
|
290
|
+
- Files:
|
|
291
|
+
- web-app/src/components/DeployConnections.tsx (the connect and disconnect handlers only)
|
|
292
|
+
- web-app/src/components/DeployConnections.propagate.test.mjs (new)
|
|
310
293
|
- Tier: LOW
|
|
311
|
-
-
|
|
312
|
-
|
|
313
|
-
- Then probe with `xargs -P 8`, each probe in its own scratch cwd, writing one result file per command.
|
|
314
|
-
- Keep the captured-output (never piped) rule noted in the file.
|
|
294
|
+
- Red: the first fetch fails, then connecting Vercel calls `onStatusChange` with netlify and github `{connected:false}` built from the default state.
|
|
295
|
+
- Green: when the last fetch failed, the handlers re-fetch instead of pushing synthesized defaults.
|
|
315
296
|
- Wall:
|
|
316
|
-
- `
|
|
317
|
-
- `
|
|
318
|
-
-
|
|
297
|
+
- `node --test web-app/src/components/DeployConnections.propagate.test.mjs` passes.
|
|
298
|
+
- `node --test web-app/src/components/DeployConnections.state.test.mjs` passes.
|
|
299
|
+
- `cd web-app && npx tsc -b` exits 0.
|
|
319
300
|
|
|
320
|
-
### S-
|
|
321
|
-
- Files:
|
|
322
|
-
-
|
|
323
|
-
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
-
|
|
327
|
-
-
|
|
328
|
-
- A
|
|
301
|
+
### S-229: the preview header says "Detecting project type..." forever after a failed preview-info fetch (BACKLOG 114)
|
|
302
|
+
- Files:
|
|
303
|
+
- web-app/src/components/ProjectWorkspace.tsx, preview regions only: the `getPreviewInfo` call (about 839) and the "Detecting project type..." branch (about 1877).
|
|
304
|
+
- web-app/src/components/ProjectWorkspace.preview.test.mjs (new)
|
|
305
|
+
- Tier: LOW
|
|
306
|
+
- Green:
|
|
307
|
+
- Keep the error.
|
|
308
|
+
- Render "Could not detect project type" with the message.
|
|
309
|
+
- A pending request keeps "Detecting project type...".
|
|
310
|
+
- Wall:
|
|
311
|
+
- `node --test web-app/src/components/ProjectWorkspace.preview.test.mjs` passes: a rejected fetch lacks "Detecting project type...".
|
|
312
|
+
- `node --test web-app/src/components/ProjectWorkspace.panels.test.mjs` passes.
|
|
313
|
+
- `cd web-app && npx tsc -b` exits 0.
|
|
314
|
+
|
|
315
|
+
### S-230: ProjectWorkspace labels unknown phases "building", and Replay Build can never appear (BACKLOG 115 and 118)
|
|
316
|
+
- Files:
|
|
317
|
+
- web-app/src/components/ProjectWorkspace.tsx, only the `buildPhase` memo (about 1401-1410) and the Replay Build condition (about 1488).
|
|
318
|
+
- web-app/src/components/ProjectWorkspace.phase.test.mjs (new)
|
|
319
|
+
- Tier: LOW
|
|
320
|
+
- Region: this does not overlap S-229's preview regions.
|
|
321
|
+
- Green:
|
|
322
|
+
- The builder lists the phase strings run.sh and the Bun runner actually write.
|
|
323
|
+
- Map REASON, ACT, REFLECT and VERIFY explicitly. Any other phase returns 'unknown'.
|
|
324
|
+
- Replay Build shows when `!isBuilding` and `sessionData.status` is completed or completion_promise_fulfilled, the same test as about 1431.
|
|
329
325
|
- Wall:
|
|
330
|
-
- `
|
|
331
|
-
|
|
326
|
+
- `node --test web-app/src/components/ProjectWorkspace.phase.test.mjs` passes:
|
|
327
|
+
- an unrecognized phase is not 'building';
|
|
328
|
+
- a completed idle session shows Replay Build.
|
|
329
|
+
- `cd web-app && npx tsc -b` exits 0.
|
|
332
330
|
|
|
333
|
-
### S-
|
|
334
|
-
- Files:
|
|
331
|
+
### S-231: the "Moat suite" CI check reads as moat proven at 0 of 9 (BACKLOG 52)
|
|
332
|
+
- Files: .github/workflows/test.yml (the moat-suite job `name:` only)
|
|
335
333
|
- Tier: LOW
|
|
336
334
|
- Green:
|
|
337
|
-
-
|
|
338
|
-
-
|
|
339
|
-
|
|
335
|
+
- Rename the job to "Moat ratchet (no rule failed)".
|
|
336
|
+
- The step summary keeps its N of 9 count.
|
|
337
|
+
- Gate:
|
|
338
|
+
- First run `gh api repos/{owner}/{repo}/branches/main/protection/required_status_checks --jq .contexts`.
|
|
339
|
+
- If "Moat suite" is a required context, the slice becomes report-only, because renaming it would block every merge.
|
|
340
340
|
- Wall:
|
|
341
|
-
- `
|
|
342
|
-
- `
|
|
341
|
+
- `git grep -n "name: Moat suite" -- .github` prints nothing.
|
|
342
|
+
- `git grep -n "Moat suite" -- tests scripts .github` lists only the step-summary heading.
|
|
343
|
+
- The first push after merge shows the renamed check green.
|
|
343
344
|
|
|
344
|
-
### S-
|
|
345
|
-
- Files:
|
|
345
|
+
### S-232: autonomy/loki is linted only inside the sentrux test; the lint suite never schedules its big files first
|
|
346
|
+
- Files:
|
|
347
|
+
- tests/run-shellcheck.sh
|
|
348
|
+
- tests/test-sentrux-init-rules.sh (T6 only)
|
|
349
|
+
- Tier: LOW (velocity plus lint placement)
|
|
350
|
+
- Change:
|
|
351
|
+
- (a) Add ./autonomy/loki to run-shellcheck.sh at `-S error`, today's bar. Delete T6.
|
|
352
|
+
- (b) Order the file list largest first, so run.sh and loki do not start last.
|
|
353
|
+
- Gate: capture the counts and real time before changing anything. Run back to back with a fixed `LOKI_SHELLCHECK_JOBS=4`.
|
|
354
|
+
- If (b) gains under 15%, keep only (a).
|
|
355
|
+
- Wall:
|
|
356
|
+
- `LOKI_SHELLCHECK_JOBS=4 bash tests/run-shellcheck.sh` exits 0. Its output includes "Checked ./autonomy/loki". The pass, fail and info counts equal the pre-change capture, with loki added.
|
|
357
|
+
- `time bash tests/test-sentrux-init-rules.sh` exits 0 with "8 passed" and real time under 10s.
|
|
358
|
+
- `grep -c shellcheck tests/test-sentrux-init-rules.sh` prints 0.
|
|
359
|
+
- The builder reports both timings.
|
|
360
|
+
|
|
361
|
+
### S-233: a refused resume says nothing about which file blocked it or where the earlier commits are (BACKLOG 72 remainder)
|
|
362
|
+
- Files:
|
|
363
|
+
- autonomy/run.sh: the `setup_agent_branch` resume block only, around the `--no-overwrite-ignore` checkout.
|
|
364
|
+
- tests/test-refused-resume-warning.sh (new)
|
|
346
365
|
- Tier: LOW
|
|
347
|
-
-
|
|
348
|
-
|
|
349
|
-
-
|
|
366
|
+
- Red: a gitignored user file at a path the recorded branch tracks gets "could not be checked out - creating a new one", and nothing else.
|
|
367
|
+
- Green:
|
|
368
|
+
- The warning names the conflicting path or paths from git's stderr.
|
|
369
|
+
- It states that the earlier session's commits are still on `${recorded}`.
|
|
370
|
+
- Test rules: S-138 prelude; scratch cwd; no `.loki/state/provider` left in the repo.
|
|
350
371
|
- Wall:
|
|
351
|
-
- `
|
|
352
|
-
-
|
|
372
|
+
- `bash tests/test-refused-resume-warning.sh` exits 0, and the warning contains the file name and the branch name.
|
|
373
|
+
- `bash tests/test-branch-lifecycle.sh` exits 0.
|
|
353
374
|
|
|
354
|
-
**Registration and rebuilds (Captain).**
|
|
355
|
-
- New tests to register
|
|
356
|
-
- S-
|
|
357
|
-
- S-
|
|
358
|
-
- S-
|
|
359
|
-
-
|
|
360
|
-
- S-
|
|
361
|
-
- S-
|
|
362
|
-
-
|
|
363
|
-
- S-
|
|
364
|
-
- S-
|
|
365
|
-
- S-
|
|
375
|
+
**Registration and rebuilds (Captain).** S-211 owns tests/run-all-tests.sh and tests/shard-durations.tsv, so no slice edits them.
|
|
376
|
+
- **New tests to register, after S-211 merges:**
|
|
377
|
+
- S-215: tests/test-proof-pr-no-cwd-shadow.sh
|
|
378
|
+
- S-216: tests/test-verify-no-cwd-shadow.sh
|
|
379
|
+
- S-217: tests/test-enforce-test-coverage-pkg-readers-pth.sh
|
|
380
|
+
- S-218: tests/test-untracked-status-fsmonitor.sh
|
|
381
|
+
- S-219: tests/test-session-commit-add-failure.sh
|
|
382
|
+
- S-220: tests/test-untrack-keeps-force-staged.sh
|
|
383
|
+
- S-221: tests/dashboard/test_audit_verify_cli_nothing_checked.py
|
|
384
|
+
- S-222: tests/dashboard/test_skill_session_ws_running_agents.py
|
|
385
|
+
- S-223: tests/dashboard/test_notification_triggers_unreadable.py and dashboard-ui/tests/loki-notification-triggers-error.node.test.mjs
|
|
386
|
+
- S-224: web-app/src/components/EvidenceReceiptPanel.cost.test.mjs
|
|
387
|
+
- S-226: tests/test-stats-unmeasured-cost.sh and loki-ts/tests/commands/stats_unmeasured.test.ts
|
|
388
|
+
- S-227: tests/test-status-budget-unmeasured.sh
|
|
389
|
+
- S-228: DeployConnections.propagate.test.mjs
|
|
390
|
+
- S-229: ProjectWorkspace.preview.test.mjs
|
|
391
|
+
- S-230: ProjectWorkspace.phase.test.mjs
|
|
392
|
+
- S-233: tests/test-refused-resume-warning.sh
|
|
393
|
+
- **Bundle rebuilds:**
|
|
394
|
+
- loki-ts/dist: S-226, S-227.
|
|
395
|
+
- web-app/dist: S-224, S-228, S-229, S-230.
|
|
396
|
+
- dashboard static: S-225.
|
|
397
|
+
- dashboard-ui dist and dashboard static: S-223.
|
|
398
|
+
- **Merge order:**
|
|
399
|
+
- run.sh: S-217, S-218, S-219, S-220 and S-233, plus S-194 and S-195 in flight. They name regions that do not overlap, anchor on function names, and merge one at a time.
|
|
400
|
+
- autonomy/loki: S-226 and S-227, plus S-197 in flight, one at a time.
|
|
401
|
+
- dashboard/server.py: S-222 and S-223.
|
|
402
|
+
- ProjectWorkspace.tsx: S-229 and S-230.
|
|
403
|
+
- S-215 and S-216 add guarded helper copies. S-199's identity test picks them up with no edit.
|
|
404
|
+
- **Test rules for the git-touching slices** (S-218, S-219, S-220, S-233): each uses S-138's isolation prelude, and `bash tests/test-no-ambient-gitconfig-writes.sh` must stay green.
|
|
366
405
|
|
|
367
406
|
**Held, not in the 20:**
|
|
368
|
-
- BACKLOG
|
|
369
|
-
- BACKLOG
|
|
370
|
-
- BACKLOG
|
|
371
|
-
-
|
|
372
|
-
- BACKLOG
|
|
373
|
-
- workspace_diff
|
|
374
|
-
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
-
|
|
381
|
-
- Speeding up test-autocapture-shadow-write-guard.sh: its negative legs wait on a disowned process and need a design.
|
|
382
|
-
- Carried over: P1.verification-metadata-signed; the P2 verify renumber (CEO); BACKLOG 18, 28, 52, 121, and 123 (the audit.py half); S-112, S-114, S-115, S-117 to S-122.
|
|
407
|
+
- BACKLOG 36: waits for S-198.
|
|
408
|
+
- BACKLOG 19 and the bash `loki proof verify` interpreter: wait for S-197 (S-179 is merged, 94035ac4).
|
|
409
|
+
- BACKLOG 99, bash half: waits for S-194 and S-195 (S-175 is merged, 6fab92ce).
|
|
410
|
+
- `StatusResponse` defaults (iteration 0, provider "claude"): changing the types touches every /api/status consumer, so this needs a design.
|
|
411
|
+
- BACKLOG 100 (the untrack step in the interrupt path): git commits from a signal handler need a design.
|
|
412
|
+
- workspace_diff count 0 in a non-git directory: needs a design.
|
|
413
|
+
- Speeding up test-autocapture-shadow-write-guard.sh: needs a design.
|
|
414
|
+
- `P4.three-setups-resolve`: waits on the D10 default decision.
|
|
415
|
+
- BACKLOG 18: default-off decision for the founder.
|
|
416
|
+
- BACKLOG 28: needs per-case expected failure reasons; design.
|
|
417
|
+
- BACKLOG 121, the settings half: product decision.
|
|
418
|
+
- `P1.verification-metadata-signed`: M2 seal.v1.
|
|
419
|
+
- The P2 verify renumber (CEO); S-112, S-114, S-115, S-117 to S-122.
|
|
383
420
|
|
|
384
|
-
| S-
|
|
385
|
-
| S-
|
|
386
|
-
| S-
|
|
387
|
-
| S-
|
|
388
|
-
| S-
|
|
389
|
-
| S-
|
|
390
|
-
| S-
|
|
391
|
-
| S-
|
|
392
|
-
| S-
|
|
393
|
-
| S-
|
|
394
|
-
| S-
|
|
395
|
-
| S-
|
|
396
|
-
| S-
|
|
397
|
-
| S-
|
|
398
|
-
| S-
|
|
399
|
-
| S-
|
|
400
|
-
| S-
|
|
401
|
-
| S-
|
|
402
|
-
| S-
|
|
403
|
-
| S-
|
|
421
|
+
| S-214 | BACKLOG 147: P7 useMemo arm misses a factory that calls a registered fabricator | tests/moat/p7-no-fabricated-data.sh (HELPER_LOCAL_DECL_TMPL ~1182 and its use ~2186, ceiling comment ~978-986, one fixture beside the DECL_USEMEMO fixture ~3138-3160 only; does not overlap S-198) | HIGH | bash tests/moat/p7-no-fabricated-data.sh prints PASS for every P7 case and flags the composed useMemo fixture; removing the useMemo prefix in a scratch copy lets it through; git diff --stat tests/moat/cases.txt is empty | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
422
|
+
| S-215 | PR receipt renderer in proof-pr.sh imports json from the target repo (cwd shadow) | autonomy/lib/proof-pr.sh (render_evidence_receipt_md heredoc reader plus guarded _loki_snapshot_py_tool copy), tests/test-proof-pr-no-cwd-shadow.sh (new) | HIGH | bash tests/test-proof-pr-no-cwd-shadow.sh exits 0 (a planted json.py cannot forge the headline) and reverting to bare python3 - in a scratch copy fails it; bash tests/test-proven-pr-receipt.sh exits 0; bash tests/test-council-py-tool-identity.sh exits 0 and counts one more copy | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
423
|
+
| S-216 | loki verify inline readers import from the tree under review (cwd shadow) | autonomy/verify.sh (reader sites ~190, 591, 1269, 1271, 1295, 1337, 1339, 1441 plus guarded helper copy; not the unittest or py_compile runs), tests/test-verify-no-cwd-shadow.sh (new) | HIGH | bash tests/test-verify-no-cwd-shadow.sh exits 0 and reverting one site in a scratch copy fails it; bash tests/test-verify.sh exits 0; bash tests/moat/run.sh reports no rule failed; bash tests/test-council-py-tool-identity.sh exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
424
|
+
| S-217 | BACKLOG 81: enforce_test_coverage package.json readers load user-site .pth | autonomy/run.sh (enforce_test_coverage _declared_test_script and _ws_script readers only; anchor on names), tests/test-enforce-test-coverage-pkg-readers-pth.sh (new) | HIGH | bash tests/test-enforce-test-coverage-pkg-readers-pth.sh exits 0 (a .pth no longer changes the recorded test gate outcome) and reverting one reader to -E in a scratch copy fails it; no .loki/state/provider left in the repo; bash tests/test-honest-gate-status.sh exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
425
|
+
| S-218 | BACKLOG 131c: snapshot git status runs an agent-chosen core.fsmonitor command | autonomy/run.sh (_loki_untracked_status only), tests/test-untracked-status-fsmonitor.sh (new) | HIGH | bash tests/test-untracked-status-fsmonitor.sh exits 0 (no fsmonitor marker, real untracked file still listed) and removing the two -c flags in a scratch copy fails it; bash tests/test-no-ambient-gitconfig-writes.sh and bash tests/test-branch-lifecycle.sh exit 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
426
|
+
| S-219 | BACKLOG 83: a failed git add -A makes the session commit silently commit nothing | autonomy/run.sh (commit_session_changes git add -A block only), tests/test-session-commit-add-failure.sh (new) | MEDIUM | bash tests/test-session-commit-add-failure.sh exits 0: an empty embedded repo prints Left uncommitted naming the add failure, a normal repo still commits; removing the rc check in a scratch copy fails leg 1; bash tests/test-branch-lifecycle.sh exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
427
|
+
| S-220 | BACKLOG 109: untrack step's global reset drops force-staged agent files from the session commit | autonomy/run.sh (_loki_untrack_agent_committed_user_files only), tests/test-untrack-keeps-force-staged.sh (new) | MEDIUM | bash tests/test-untrack-keeps-force-staged.sh exits 0: git add -f dist/bundle.js lands in the session commit while the pre-existing user file stays untracked on disk; restoring git reset -q in a scratch copy fails it; bash tests/test-branch-lifecycle.sh exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
428
|
+
| S-221 | BACKLOG 123: audit.py verify exits 0 when it checked nothing | dashboard/audit.py (_unified_cli verify branch and docstring only; tip and prefix untouched), tests/dashboard/test_audit_verify_cli_nothing_checked.py (new) | MEDIUM | python3 -m pytest -q tests/dashboard/test_audit_verify_cli_nothing_checked.py: empty dir exits 2, valid chain 0, tampered 1, tip on an empty dir still 0; bash tests/test-audit-chain-honesty.sh and bash tests/test-audit-js-suites.sh exit 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
429
|
+
| S-222 | BACKLOG 118: skill-session WebSocket status push hardcodes running_agents 0 | dashboard/server.py (skill-session broadcast payload ~1030-1047 only), tests/dashboard/test_skill_session_ws_running_agents.py (new) | LOW | python3 -m pytest -q tests/dashboard/test_skill_session_ws_running_agents.py shows running_agents None on the skill-session push; restoring 0 fails it | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
430
|
+
| S-223 | BACKLOG 114/118: notification triggers read No triggers configured after a failed read | dashboard/server.py (get_notification_triggers only), dashboard-ui/components/loki-notification-center.js (_loadTriggers and triggers empty branch only), tests/dashboard/test_notification_triggers_unreadable.py (new), dashboard-ui/tests/loki-notification-triggers-error.node.test.mjs (new) | LOW | python3 -m pytest -q tests/dashboard/test_notification_triggers_unreadable.py shows triggers null with error on a corrupt file and [] on a missing one; node --test dashboard-ui/tests/loki-notification-triggers-error.node.test.mjs shows an error lacks No triggers configured and an empty list keeps it | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
431
|
+
| S-224 | BACKLOG 118: web-app receipt and cost trend show a partly priced run as a complete cost | web-app/src/components/EvidenceReceiptPanel.tsx (Cost field only), web-app/src/api/client.ts (ProofDetail cost type and cost/timeline runs type only), web-app/src/pages/MetricsPage.tsx (costTrend only), web-app/src/components/EvidenceReceiptPanel.cost.test.mjs (new) | MEDIUM | node --test web-app/src/components/EvidenceReceiptPanel.cost.test.mjs: cost_partial true renders at least $1.20, absent keeps $1.20, a partial run's trend label carries (partial); cd web-app && npx tsc -b exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
432
|
+
| S-225 | BACKLOG 118: standalone receipts list shows a partly priced run as a complete cost | dashboard-ui/scripts/build-standalone.js (loadReceipts cost cell only), tests/test-receipts-panel.sh (one new leg) | LOW | bash tests/test-receipts-panel.sh exits 0 with the new leg asserting at least $X.XX only when cost_partial is true; bash tests/test-budget-banner-dedup.sh exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
433
|
+
| S-226 | BACKLOG 106 class: loki stats reads unmeasured cost as $0.00 on both routes | autonomy/loki (cmd_stats only), loki-ts/src/commands/stats.ts, loki-ts/tests/commands/stats_unmeasured.test.ts (new), tests/test-stats-unmeasured-cost.sh (new) | MEDIUM | bash tests/test-stats-unmeasured-cost.sh exits 0 (all-zero records give cost_usd null and not recorded, same on both routes); cd loki-ts && bun test tests/commands/stats.test.ts tests/commands/stats_unmeasured.test.ts exits 0; bash tests/test-bash-bun-parity.sh exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
434
|
+
| S-227 | BACKLOG 106 class: loki status prints Budget $0 for a run it never measured, on both routes | autonomy/loki (cmd_status budget block only), loki-ts/src/commands/status.ts (readBudgetField and its budget caller only), loki-ts/tests/commands/status.test.ts (budget legs only), tests/test-status-budget-unmeasured.sh (new) | MEDIUM | bash tests/test-status-budget-unmeasured.sh exits 0 (budget_used 0, null or absent prints not recorded on both routes, a positive value prints as today); cd loki-ts && bun test tests/commands/status.test.ts exits 0; bash tests/test-status-cli-provider-parity.sh exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
435
|
+
| S-228 | BACKLOG 121: DeployConnections pushes default not-connected states upward after its own fetch failed | web-app/src/components/DeployConnections.tsx (connect and disconnect handlers only), web-app/src/components/DeployConnections.propagate.test.mjs (new) | LOW | node --test web-app/src/components/DeployConnections.propagate.test.mjs shows no synthesized statuses reach onStatusChange after a failed fetch; node --test web-app/src/components/DeployConnections.state.test.mjs and cd web-app && npx tsc -b exit 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
436
|
+
| S-229 | BACKLOG 114: preview header says Detecting project type forever after a failed preview-info fetch | web-app/src/components/ProjectWorkspace.tsx (getPreviewInfo call ~839 and Detecting project type branch ~1877 only), web-app/src/components/ProjectWorkspace.preview.test.mjs (new) | LOW | node --test web-app/src/components/ProjectWorkspace.preview.test.mjs shows a rejected fetch renders Could not detect project type and lacks Detecting project type; node --test web-app/src/components/ProjectWorkspace.panels.test.mjs and cd web-app && npx tsc -b exit 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
437
|
+
| S-230 | BACKLOG 115/118: ProjectWorkspace labels unknown phases building and Replay Build can never appear | web-app/src/components/ProjectWorkspace.tsx (buildPhase memo ~1401-1410 and Replay Build condition ~1488 only; does not overlap S-229), web-app/src/components/ProjectWorkspace.phase.test.mjs (new) | LOW | node --test web-app/src/components/ProjectWorkspace.phase.test.mjs shows an unrecognized phase is not building and a completed idle session shows Replay Build; cd web-app && npx tsc -b exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
438
|
+
| S-231 | BACKLOG 52: the Moat suite CI check reads as moat proven at 0 of 9 | .github/workflows/test.yml (moat-suite job name only) | LOW | gh api required_status_checks for main does not list Moat suite (else report-only); git grep -n "name: Moat suite" -- .github prints nothing; git grep -n "Moat suite" -- tests scripts .github lists only the step-summary heading; the next push shows the renamed check | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
439
|
+
| S-232 | autonomy/loki is linted only inside the sentrux test; the lint suite schedules big files last | tests/run-shellcheck.sh, tests/test-sentrux-init-rules.sh (T6 only) | LOW | LOKI_SHELLCHECK_JOBS=4 bash tests/run-shellcheck.sh exits 0, prints Checked ./autonomy/loki, counts match the pre-change capture plus loki; time bash tests/test-sentrux-init-rules.sh exits 0 with 8 passed under 10s; grep -c shellcheck tests/test-sentrux-init-rules.sh prints 0; both timings reported | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|
|
440
|
+
| S-233 | BACKLOG 72 remainder: refused resume does not name the blocking file or where the earlier commits are | autonomy/run.sh (setup_agent_branch resume block around the no-overwrite-ignore checkout only), tests/test-refused-resume-warning.sh (new) | LOW | bash tests/test-refused-resume-warning.sh exits 0 with the warning naming the conflicting ignored file and the recorded branch; bash tests/test-branch-lifecycle.sh exits 0 | ready@2026-09-27T20:59Z | Source: 20:59Z cut. |
|