loki-mode 11.17.46 → 11.17.48
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/loki +32 -4
- package/autonomy/run.sh +16 -6
- package/benchmarks/seeded-defects/manifest.json +1606 -0
- package/completions/_loki +8 -0
- package/completions/loki.bash +1 -1
- package/dashboard/__init__.py +1 -1
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/BOARD.md +33 -3
- package/docs/v10/CONTROL-PLANE.md +1 -1
- package/docs/v10/FAILURE-CLASSES.md +1 -1
- package/docs/v10/PROGRESS.md +6 -0
- package/loki-ts/dist/loki.js +1307 -1279
- package/mcp/__init__.py +1 -1
- package/package.json +4 -2
- package/packages/control-plane/dist/ask-tools-server.js +8 -0
- package/packages/control-plane/dist/server.js +442 -368
- package/packages/control-plane/src/server/ingest.ts +2 -2
- package/packages/control-plane/src/server/integrity.ts +6 -12
- package/packages/control-plane/src/shipper/ship.ts +2 -8
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-DOQbb9S2.js → AdminPage-BPJVaCEf.js} +1 -1
- package/web-app/dist/assets/{Avatar-DlCHpaY9.js → Avatar-Bw7MMGi1.js} +1 -1
- package/web-app/dist/assets/{Badge-CsGRidkQ.js → Badge-CEFAS_Xj.js} +1 -1
- package/web-app/dist/assets/{Button-CaNiRTkv.js → Button-CzQvJaSb.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-B8sezC-W.js → CockpitPage-uWZUV5vU.js} +1 -1
- package/web-app/dist/assets/{ComparePage-B36mEWLR.js → ComparePage-B8K52Bob.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BFGjCcE5.js → ErrorBoundary-mmBzw79w.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-mFXX7T0e.js → EvidenceReceiptPanel-D-C_9v67.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-BjUOWEuY.js → GitHubIssuesPanel-D01lFHnc.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-CcLMzJZk.js → GitHubPRsPanel-Bje_NQB0.js} +1 -1
- package/web-app/dist/assets/{HomePage-9j8CciDG.js → HomePage-C8OEDRTr.js} +2 -2
- package/web-app/dist/assets/{LoginPage-BXEJEipC.js → LoginPage-Cool7Iw_.js} +1 -1
- package/web-app/dist/assets/{MagicPage-JJhHAzUo.js → MagicPage-DMvhVDyI.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-g2murSvE.js → MetricsPage-CzYARc4t.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-D3fshofn.js → NotFoundPage-CLuI0jCU.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-B91c8gqI.js → ProjectPage-BxhIhhVe.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-f-AqCLnm.js → ProjectsPage-D_hclu0C.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-xmKoxIhv.js → SettingsPage-Dau5TMP3.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-DxPIEO67.js → ShowcasePage-D560cP-Z.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-Cm9Dy2-W.js → SystemSettingsPage-ek9P-k4X.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-xUmbM2Q6.js → TeamsPage-e1RGxUiS.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-BF0atSP9.js → TemplatesPage-C5O7u6Yl.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-BRR-hjM0.js → TerminalOutput-_UWCGfD0.js} +1 -1
- package/web-app/dist/assets/{activity-bs7r0Zgu.js → activity-BcHzPz-Z.js} +1 -1
- package/web-app/dist/assets/{bell-BSBQU6oH.js → bell-D5IPRWzy.js} +1 -1
- package/web-app/dist/assets/{bot-IY1WHsy_.js → bot-B_5hZVKx.js} +1 -1
- package/web-app/dist/assets/{check-BbLOs82D.js → check-Dn2f9AXR.js} +1 -1
- package/web-app/dist/assets/{chevron-left-Dr_YJex2.js → chevron-left-DF2PtK7-.js} +1 -1
- package/web-app/dist/assets/{circle-alert-CdPabs5h.js → circle-alert-B_4ZRu8m.js} +1 -1
- package/web-app/dist/assets/{clock-DSSC0-0Q.js → clock-7CFKor-w.js} +1 -1
- package/web-app/dist/assets/{cloud-D_gWiz8h.js → cloud-CGYN9-6_.js} +1 -1
- package/web-app/dist/assets/{code-xml-BeK0mcX9.js → code-xml-DqBxYuk4.js} +1 -1
- package/web-app/dist/assets/{database-CcJkBSXN.js → database-CiOULELf.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-B0KTo6gY.js → dollar-sign-DijBsvLO.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-Br9i1QUK.js → file-code-corner-BNEtGVfX.js} +1 -1
- package/web-app/dist/assets/{file-plus-Cntlx-H3.js → file-plus-DtUmw4Kz.js} +1 -1
- package/web-app/dist/assets/{globe-BzTQwBst.js → globe-CmWPNrp3.js} +1 -1
- package/web-app/dist/assets/{hammer-DY5E-S_s.js → hammer-CnrZECeT.js} +1 -1
- package/web-app/dist/assets/{index-D8iQaeY_.js → index-B9oYaFMU.js} +3 -3
- package/web-app/dist/assets/{layers-fichWK2q.js → layers-Lxxu1F99.js} +1 -1
- package/web-app/dist/assets/{loader-circle-H4GEC-nt.js → loader-circle-Dp9seYEV.js} +1 -1
- package/web-app/dist/assets/{lock-L2gybTp0.js → lock-Ej10h0El.js} +1 -1
- package/web-app/dist/assets/{package-C6GhNvrY.js → package-nzNsxPvu.js} +1 -1
- package/web-app/dist/assets/{plus-C76f-H0b.js → plus-Bohfac84.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-CYrIM5Gt.js → refresh-cw-D28TMjNP.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-DuVzPMTc.js → rotate-ccw-EydLVFHV.js} +1 -1
- package/web-app/dist/assets/{scroll-text-Ou40WwYD.js → scroll-text-CqJ7dpQH.js} +1 -1
- package/web-app/dist/assets/{server-CY2Y_apg.js → server-UHZ1Mk-a.js} +1 -1
- package/web-app/dist/assets/{shield-alert-CNf-jmi3.js → shield-alert-a-XlrS3P.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-DNRc_NvO.js → thumbs-up-QHDAqKhY.js} +1 -1
- package/web-app/dist/assets/{trash-2-CdzowWF_.js → trash-2-CJ8uIX7e.js} +1 -1
- package/web-app/dist/assets/{trending-down-DtZEAOFe.js → trending-down-CQ1Ofr8H.js} +1 -1
- package/web-app/dist/assets/{trending-up-BwiPR3rB.js → trending-up-jG23a3L-.js} +1 -1
- package/web-app/dist/assets/{upload-BI_6o8oU.js → upload-CsZ15cCI.js} +1 -1
- package/web-app/dist/assets/{usePolling-TefZLSUZ.js → usePolling-C2ztQasf.js} +1 -1
- package/web-app/dist/assets/{user-BzczgZi4.js → user-B1RCExaJ.js} +1 -1
- package/web-app/dist/index.html +1 -1
package/completions/_loki
CHANGED
|
@@ -153,6 +153,14 @@ function _loki {
|
|
|
153
153
|
'--help[Show help]' \
|
|
154
154
|
'1:subcommand:(prometheus)'
|
|
155
155
|
;;
|
|
156
|
+
report)
|
|
157
|
+
_arguments \
|
|
158
|
+
'--json[Machine-readable JSON output]' \
|
|
159
|
+
'--since[Only include runs since this time]:since:' \
|
|
160
|
+
'--efficiency[Show efficiency metrics]' \
|
|
161
|
+
'--help[Show help]' \
|
|
162
|
+
'1:subcommand:(session metrics cost kpis export share dogfood)'
|
|
163
|
+
;;
|
|
156
164
|
share)
|
|
157
165
|
_arguments \
|
|
158
166
|
'--private[Create a secret gist]' \
|
package/completions/loki.bash
CHANGED
|
@@ -240,7 +240,7 @@ _loki_completion() {
|
|
|
240
240
|
|
|
241
241
|
control)
|
|
242
242
|
if [[ "$cur" == -* ]]; then
|
|
243
|
-
COMPREPLY=( $(compgen -W "--port --json --help" -- "$cur") )
|
|
243
|
+
COMPREPLY=( $(compgen -W "--port --json --repo --help" -- "$cur") )
|
|
244
244
|
return 0
|
|
245
245
|
fi
|
|
246
246
|
COMPREPLY=( $(compgen -W "serve status help" -- "$cur") )
|
package/dashboard/__init__.py
CHANGED
package/docs/CLI-REFERENCE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CLI reference
|
|
2
2
|
|
|
3
|
-
Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.
|
|
3
|
+
Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.48. Do not edit by hand.
|
|
4
4
|
Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
|
|
5
5
|
|
|
6
6
|
| Command | Description |
|
package/docs/INSTALLATION.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Loki Mode, by [Autonomi](https://www.autonomi.dev/), turns a spec or an issue into a verified pull request with a receipt you can check. This page covers installing it, a first run, and the options around it.
|
|
4
4
|
|
|
5
|
-
**Version:** v11.17.
|
|
5
|
+
**Version:** v11.17.48
|
|
6
6
|
|
|
7
7
|
**Engine note:** `loki start` is the primary command. `loki start`, `loki "<task>"`, `loki owner/repo#N` and `loki quick` all run the Loki 10 engine, whatever the flag order or input form (PRD file, issue ref, task or one-word brief). The previous loop runs only on `--engine legacy`, `LOKI_ENGINE=legacy`, or for one call when a flag Loki 10 cannot honor is present. See the [user guide](v10/GUIDE.md) and the [5-minute quickstart](QUICKSTART.md).
|
|
8
8
|
|
package/docs/v10/BOARD.md
CHANGED
|
@@ -418,7 +418,7 @@ set is declared to avoid overlap with those and with each other.
|
|
|
418
418
|
| Q17-04 | FC-68 siblings: `assert-wall-executed.sh` also fails the release smoke when an expected non-Wall check (lint, mutation proof, cross review) is missing from the receipt `checks[]` without a failing exit. | scripts/assert-wall-executed.sh, scripts/real-run.sh (SC_* knob in the existing scenario parser), tests/test-real-run-guards.sh | HIGH | `bash tests/test-real-run-guards.sh`; `bash -n scripts/assert-wall-executed.sh scripts/real-run.sh` | parked@2026-10-17T00:20Z | D98 park after HIGH r2 BLOCK on b617d3e1f: B1 fixed, B2 not; SC_EXPECT_CHECKS=node is met by the Wall check node:loki_wall_* alone (verify.ts:277, wall.ts:22), so a dropped non-Wall test still passes. Re-sliced as Q17-04b. r2 fix b617d3e1f (wall guard 36/0); HIGH r2 review running. FAILURE-CLASSES.md:643 FC-68 "Siblings: any other check a receipt could lose without a failing exit ... is not yet counted". Release gate, so HIGH. Needs red-then-green: a receipt with the lint check dropped must go red. |
|
|
419
419
|
| Q17-04b | Q17-04 re-slice: real-run scenarios pin the exact non-Wall check names (trivial-sum node:sum.test.js, two-bug node:lib.test.js) on top of b617d3e1f, plus a guard test where only the Wall test is a node check and token node:sum.test.js fails | tests/real-run/scenarios/trivial-sum.sh, tests/real-run/scenarios/two-bug.sh, tests/test-wall-executed-guard.sh | MEDIUM | `bash tests/test-wall-executed-guard.sh`; `bash tests/test-sigpipe-guard.sh` | released@2026-10-17T03:50Z | TL APPROVE e1bdde7d3 (bare-node mutation caught by structural check); merged with Q17-04 commits. Built e1bdde7d3 (wall guard 0 FAIL, shellcheck rc 0, sigpipe 4/0); TL review running. Source: Q17-04 HIGH r2 finding, fix option 1. Base b617d3e1f (branch q17-04). Shipped in npm 11.17.15 (latest+next) or 11.17.16 (Release run success on e3d445460). |
|
|
420
420
|
| Q17-05 | Shipper sends the sha256 of each event line before redaction, so the Control Plane can tell a genuine redaction from a downgrade (FAILED edited to PARTIAL plus a planted [REDACTED]). Today such a log reads only "(unattested)" or UNVERIFIED. | loki-ts/src/util/redact.ts, packages/control-plane/src/server/integrity.ts, packages/control-plane/test/integrity.test.ts | HIGH | `cd packages/control-plane && bun test test/integrity.test.ts`; `cd loki-ts && bun test tests/util/redact.test.ts` | rejected@2026-10-17T00:38Z | HIGH r1 BLOCK on 36524784d, design unsound (D12): client-supplied pre-redaction chain is trusted, so copying log.sealed events_sha256 makes a FAILED-to-VERIFIED forgery read attested and sig-checked; chain not bound to run id (cross-run replay). Not patchable in place; re-sliced as Q17-05b (engine-side redaction). Branch q17-05 kept. Built 36524784d (control-plane integrity 61/0, loki-ts util 286/0); HIGH r1 review running. FAILURE-CLASSES.md:140 deferred sibling of EL-FC08b. Delivered accuracy and Seal. A forged downgrade must read TAMPERED. Test file paths are the nearest existing ones; the engineer confirms by `ls`. |
|
|
421
|
-
| Q17-05b | EL-FC08b at source: the engine redacts secrets in event data before it hashes the log and signs the seal, so an honest run holding a token ships byte-identical lines that the Control Plane hashes itself and reads VERIFIED; the shipper redaction becomes a no-op on already-redacted lines, and any later edit (including a planted [REDACTED]) reads TAMPERED. No client-supplied hash is ever trusted. | loki-ts/src/util/redact.ts, the engine event-log writer that computes events_sha256 (locate via git grep events_sha256 loki-ts/src), packages/control-plane/test/integrity.test.ts | HIGH | `cd packages/control-plane && bun test test/server/`; `cd loki-ts && bun test tests/util/ tests/engine10/` |
|
|
421
|
+
| Q17-05b | EL-FC08b at source: the engine redacts secrets in event data before it hashes the log and signs the seal, so an honest run holding a token ships byte-identical lines that the Control Plane hashes itself and reads VERIFIED; the shipper redaction becomes a no-op on already-redacted lines, and any later edit (including a planted [REDACTED]) reads TAMPERED. No client-supplied hash is ever trusted. | loki-ts/src/util/redact.ts, the engine event-log writer that computes events_sha256 (locate via git grep events_sha256 loki-ts/src), packages/control-plane/test/integrity.test.ts | HIGH | `cd packages/control-plane && bun test test/server/`; `cd loki-ts && bun test tests/util/ tests/engine10/` | released v11.17.47 | Source: Q17-05 HIGH r1 (FAILURE-CLASSES.md:139-140). Architect pass first: confirm the writer call site and the parity with run.sh before building; forgery fixtures A-D from the Q17-05 review must read TAMPERED or UNVERIFIED, never VERIFIED. |
|
|
422
422
|
| Q18-01 | FC-25c(b) remainder: control-plane shipper gitOrigin runs raw execFileSync("git") with a real-token env; convert to safeGit and make the raw-spawn guard scan packages/control-plane | packages/control-plane/src/shipper/discover.ts, loki-ts/tests/util/fc25_raw_spawn_guard.test.ts | HIGH | `cd loki-ts && bun test tests/util/fc25_raw_spawn_guard.test.ts tests/util/fc25_safe_git.test.ts`; `cd packages/control-plane && bun test`; `cd loki-ts && bunx tsc --noEmit` | released@2026-10-17T03:50Z | HIGH APPROVE dbb93205a (bun test util 289 pass, 6/6 guard mutations caught); follow-up: comment integrations.ts:85 key-path split Shipped in npm 11.17.15 (latest+next) or 11.17.16 (Release run success on e3d445460). |
|
|
423
423
|
| Q18-02 | FC-25c(a): allowToken keeps repo-local core.sshCommand, remote.*.uploadpack/receivepack and repo-scope credential.helper; pin them off while the user global helper still works | loki-ts/src/util/safe_git.ts, loki-ts/tests/util/fc25_safe_git.test.ts | HIGH | `cd loki-ts && bun test tests/util/fc25_safe_git.test.ts`; `bash tests/moat/p9-rule-of-two.sh`; `cd loki-ts && bunx tsc --noEmit` | released@2026-10-17T03:50Z | HIGH r1 APPROVE 730f27460: tests/util 289/0 rc=0, p9 4 PASS, 2 mutations each fail 1 test; merged 38b6b4b13, dist 3a1c1255c. Reviewer ran no hostile-repo probes, so those go to Q18-02b. Shipped in npm 11.17.15 (latest+next) or 11.17.16 (Release run success on e3d445460). |
|
|
424
424
|
| Q18-02b | FC-25c(b): run the hostile-repo probes against safe_git allowToken and close any that leak: credential.helper with a leading !, credential.<url>.helper (including = in the url), include.path and includeIf, insteadOf to ext:: or file::, http.proxy and TLS keys, core.askPass, GIT_CONFIG_COUNT, extensions.worktreeConfig | loki-ts/src/util/safe_git.ts, loki-ts/tests/util/fc25_safe_git.test.ts | HIGH | `cd loki-ts && bun test tests/util/`; `bash tests/moat/p9-rule-of-two.sh` | released@2026-10-17T03:50Z | merged e0365685b (HIGH r2 APPROVE 9482dbe62) Shipped in npm 11.17.15 (latest+next) or 11.17.16 (Release run success on e3d445460). |
|
|
@@ -434,7 +434,7 @@ set is declared to avoid overlap with those and with each other.
|
|
|
434
434
|
| Q18-11 | group.started/group.unit events and createGroupRenderer (D61-14) have no producer or caller; emit from backlog launcher callbacks and attach the renderer to group runs | loki-ts/src/features/speed/group_grid.ts, loki-ts/src/features/speed/group_output.ts, loki-ts/tests/engine10/output_group.test.ts | MEDIUM | `cd loki-ts && bun test tests/engine10/output_group.test.ts tests/features/speed/group_output.test.ts`; `cd loki-ts && bunx tsc --noEmit` | released@2026-10-17T02:57Z | merge 326cf3402; TL APPROVE cb3e92fca (real-spawn onOut tap untested, follow-up). PO refill 2026-10-17, grep-checked not shipped: Architect confirms file set apart from Q18-08 first; else hold until Q18-08 merges. v11.17.13 npm next 11.17.13 |
|
|
435
435
|
| Q18-03c | P9 allowToken guard residuals from Q18-03b r2: named re-export with as (export { safeGitEnv as x } from safe_git), indirect calls (const f = safeGitEnv; .apply; spread args), and a shadowed args default in a pinned file all give F=0 | tests/moat/p9-rule-of-two.sh | HIGH | bash tests/moat/run.sh | parked@2026-10-17T01:55Z | Shipped via Q18-03d merge 98611351a. D98 2 rounds used: r2 head 2b3421402 closes all r1 bypasses but its comment strip misses regex literals and template nesting, a regression vs main; continued as Q18-03d on top of 2b3421402. r1 BLOCK (HIGH), r2 fix in progress. Source: Q18-03b HIGH r2 notes 1, 2 and 4. Obfuscated key escapes (unicode escapes, computed concatenation) cannot be closed by grep; record as accepted residual. |
|
|
436
436
|
| Q18-03d | P9 allowToken guard: comma, import and indirect scans fail if either raw or comment-stripped text trips them (strip misses regex literals and template nesting); add regex-literal, template-nesting, barrel-of-barrel and strip-only positive controls | tests/moat/p9-rule-of-two.sh | HIGH | bash tests/moat/run.sh | released@2026-10-17T02:57Z | merge 98611351a (includes Q18-03c r2 commits); HIGH APPROVE ec6e0adfd, 4 mutations red, P9 PROVEN. Built on Q18-03c r2 head 2b3421402 (branch q18-03c). HIGH r2 repro payloads: const re = /\/*/; safeGitEnv(process.env, true); // */ and const re = /"/; then const u = "//"; safeGitEnv(...). Fresh review rounds. v11.17.13 npm next 11.17.13 |
|
|
437
|
-
| Q18-03e | P9 allowToken guard: strip helper treats regex literals as opaque (or a regex-aware third pass), so a regex plus a quote inside a comment cannot hide a call from both passes | tests/moat/p9-rule-of-two.sh | HIGH | bash tests/moat/run.sh | ready
|
|
437
|
+
| Q18-03e | P9 allowToken guard: strip helper treats regex literals as opaque (or a regex-aware third pass), so a regex plus a quote inside a comment cannot hide a call from both passes | tests/moat/p9-rule-of-two.sh | HIGH | bash tests/moat/run.sh | ready (reslice 4: 4 BLOCK rounds, last 339fe02ad in wf_d85b02bd-e63; hand-rolled regex/division disambiguation is unfixable (export default /re/, if (a) /re/ vs (4) / 2). ADOPT OSS: find calls with the TypeScript compiler API from loki-ts/node_modules/typescript (ts.createSourceFile plus a CallExpression walk), so comments, strings, regex and JSX are parsed by the real grammar; keep every existing control plus probe-default, probe-extends, probe-mixed; fail closed on parse diagnostics) | Pre-existing gap found by Q18-03d HIGH review (also on main): after the safe_git import, const re = /\/*/; safeGitEnv(process.env /* ' */, true); is MISSED and runs under node. Add it as a positive control. |
|
|
438
438
|
| Q18-05b | AI-BOM filter gaps: secret filter misses github_pat_, glpat-, AIza, npm_, hf_, ASIA, sk_live_ and is case-sensitive; SAFE_NAME drops provider/model ids with one interior slash; hooks.sealed receives the live receipt (pass a frozen clone) | loki-ts/src/engine10/ai_bom.ts, loki-ts/src/engine10/stages/seal.ts, loki-ts/tests/engine10/ai_bom.test.ts | MEDIUM | cd loki-ts && bun test tests/engine10/ai_bom.test.ts tests/engine10/seal.test.ts | released@2026-10-17T02:57Z | merge ae90c2875 dist 0eb48d905; TL APPROVE 82058ff97 (102 pass, 4 mutations red). Test file is tests/features/ai_bom.test.ts. Source: Q18-05 HIGH review notes. Keep engine10 core net zero. v11.17.13 npm next 11.17.13 |
|
|
439
439
|
| COST-WALL-f | Partial cost read as complete outside benchmarks: trust_trajectory cost_per_accepted_usd ignores cost.cost_partial; check cost-summary.py and proof-generator.py the same way, routing through one partial check | autonomy/lib/trust_trajectory.py, autonomy/lib/cost-summary.py, autonomy/lib/proof-generator.py, tests/test_efficiency_cost_availability.py | HIGH | python3 -m pytest tests/test_efficiency_cost_availability.py -q | released@2026-10-17T02:57Z | merge 3d0587f4f dist 7919f31ca; HIGH r2 APPROVE ef9979ad8 (53 pytest, 11 cost-cli, 33 bun pass; 5 of 6 mutations red). Follow-ups: template costIsPartial JS harness, dashboard series partial marker, cost-summary Avg/iter label. r1 BLOCK (HIGH), r2 fix in progress. Source: COST-WALL-e HIGH r1 note 4 (FC-COST-PARTIAL-b siblings). v11.17.13 npm next 11.17.13 |
|
|
440
440
|
| Q17-06 | COST-6 offline half: `attribution.py` dry-run prints a cost-per-accepted-task table with the ratio against raw Claude Code and against the 0.5x target, using existing result files, so the paid `--execute` run only has to plug in numbers. | benchmarks/bench/attribution.py, benchmarks/bench/test_attribution.py | MEDIUM | `python3 -I benchmarks/bench/attribution.py --dry-run`; `python3 -m pytest benchmarks/bench -k attribution -q` | released@2026-10-17T03:50Z | Merged fe3a4e252 (6b9bd03d6; line-828 mutation caught: 1 failed 93 passed, restored 94 passed). COST-6 is parked as a paid eval needing a spend go. This re-slice needs no spend. Cost audit 2026-10-16: best measured run is 0.68x of raw, none reaches 0.5x. Report both floors (attribution.py:778). Confirm the test file name by `ls`. Shipped in npm 11.17.15 (latest+next) or 11.17.16 (Release run success on e3d445460). |
|
|
@@ -1136,7 +1136,7 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
|
|
|
1136
1136
|
| TEN-QUALITY-14 | enhancement: Wall authoring prompt requires one negative-case assertion (rejects bad input or fails before the fix) per acceptance line | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall.test.ts | MEDIUM | red: prompt has no negative-case rule; green: rule present, prompt size growth under 400 chars, existing wall tests green; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/wall.test.ts | released v11.17.38 | goal: stronger Wall checks reject wrong implementations; wall.ts line budget applies (shrink-or-flat) |
|
|
1137
1137
|
| TEN-QUALITY-15 | fix: fix rounds stop retrying the same model when the failing test set is identical two rounds in a row and escalate once | loki-ts/src/engine10/stages/fix.ts, loki-ts/tests/engine10/fix.test.ts | MEDIUM | red: identical failure signature loops on the same model to the round cap; green: escalates once then stops with a stalled reason; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/fix.test.ts | released v11.17.38 | goal: stop wasted fix spend; grep stallClimb in unit_model.ts and reuse it, do not duplicate |
|
|
1138
1138
|
| TEN-GATES-14 | feature: loki verify --explain lists each gate with exogenous or agent-influenced and the evidence it read | loki-ts/src/engine10/verify_cmd.ts, loki-ts/tests/engine10/verify_cmd.test.ts | HIGH | red: --explain is an unknown flag; green: one line per gate, exit code unchanged, --json carries the same fields; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/verify_cmd.test.ts | released v11.17.37 | goal: make the moat legible to buyers; read-only output, no verdict change |
|
|
1139
|
-
| TEN-GATES-15 | enhancement: Seal receipt records the seeded-defect corpus version and catch rate used for the ablation gate | loki-ts/src/engine10/stages/seal.ts, loki-ts/tests/engine10/seal_verify_roundtrip.test.ts | HIGH | red: receipt lacks corpus id; green: corpus version and rate in the signed payload and loki verify rejects a tampered value; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/seal_verify_roundtrip.test.ts |
|
|
1139
|
+
| TEN-GATES-15 | enhancement: Seal receipt records the seeded-defect corpus version and catch rate used for the ablation gate | loki-ts/src/engine10/stages/seal.ts, loki-ts/tests/engine10/seal_verify_roundtrip.test.ts | HIGH | red: receipt lacks corpus id; green: corpus version and rate in the signed payload and loki verify rejects a tampered value; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/seal_verify_roundtrip.test.ts | released v11.17.47 | goal: tie the load-bearing claim to evidence; builds on TEN-GATES-12/13 (released) |
|
|
1140
1140
|
| TEN-GATES-16 | fix: loki verify reports DRIFT, not OK, when HEAD moved after the seal and the changed paths overlap the sealed diff | loki-ts/src/util/seal_drift.ts, loki-ts/tests/engine10/log_seal.test.ts | HIGH | red: sealed run then an amend on a sealed path still verifies OK; green: DRIFT with the path named, unrelated commits keep OK; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/log_seal.test.ts | released v11.17.38 | goal: a seal must not vouch for code it did not see; read seal_drift.ts first and extend it |
|
|
1141
1141
|
| TEN-UX-13 | feature: loki undo --dry-run prints the diffstat it would revert and changes nothing | loki-ts/src/commands/undo.ts, loki-ts/tests/commands/undo.test.ts | LOW | red: --dry-run unknown or applies the revert; green: diffstat printed, tree and HEAD unchanged, exit 0; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/undo.test.ts | released v11.17.37 | goal: safe undo; new test file because no existing test owns undo.ts (rollback.test.ts covers rollback.ts only) |
|
|
1142
1142
|
| TEN-UX-14 | enhancement: loki queue list shows age and status columns and a count footer | loki-ts/src/commands/queue.ts, loki-ts/tests/commands/queue.test.ts | LOW | red: list prints ids only; green: id, age, status columns and 'N queued' footer, empty queue prints a next step; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/queue.test.ts | released v11.17.38 | goal: queue is inspectable at a glance |
|
|
@@ -1212,6 +1212,36 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
|
|
|
1212
1212
|
| TEN-SPEED-12 | enhancement: cache the repo profile (LOKI_REPO_PROFILE=1 path) keyed on HEAD sha and dirty flag so a resumed run does not rescan the tree | loki-ts/src/runner/repo_profile.ts, loki-ts/tests/runner/autonomous.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/runner/autonomous.test.ts -t "repo profile cache hit"` fails (scan runs twice); green: passes, cache invalidates on a new commit | released v11.17.46 | Gap: autonomous.ts:633 calls the profiler each start; read repo_profile.ts first and drop if a cache exists |
|
|
1213
1213
|
| TEN-QUALITY-26 | fix: `loki wiki show <bad-section>` should list the valid sections (architecture, modules, data-flow) in the error and exit 2; extend the wiki test | loki-ts/src/commands/wiki.ts, loki-ts/tests/commands/wiki.test.ts | LOW | red: `cd loki-ts && bun test tests/commands/wiki.test.ts -t "bad section lists valid"` fails; green: passes, valid sections unchanged | released v11.17.46 | Gap: wiki.ts:51 prints the section list only in the usage branch; check the unknown-section branch first |
|
|
1214
1214
|
| TEN-UX-29 | fix: `loki report kpis --since` with no value, or followed by another flag, reports an empty invalid value and consumes the next flag; print "--since requires a value" and exit 1 without swallowing the next token; chain after TEN-SPEED-11 | loki-ts/src/commands/kpis.ts, loki-ts/tests/commands/kpis.test.ts | LOW | red: `cd loki-ts && bun test tests/commands/kpis.test.ts -t "since missing value"` fails (message names an empty value); green: passes, `--since 7d` and `--since=7d` unchanged | released v11.17.46 | Gap: kpis.ts:87 `args[++i] ?? ""` eats the next token; chain after TEN-SPEED-11 |
|
|
1215
|
+
| TEN-QUALITY-27 | test: the "corrupt budget state rebuilds used from efficiency records" case in budget.test.ts asserts only budget_used; also assert limit, budget_limit and exceeded for BUDGET_LIMIT unset, below the cap and at the cap, so a rebuild can never silently disarm the cap | loki-ts/tests/runner/budget.test.ts | LOW | red: mutate rebuildBudgetState to return `exceeded: false` and `limit: 0` and run `cd loki-ts && bun test tests/runner/budget.test.ts -t "rebuilds"`, it fails; green: restored source passes | released v11.17.48 | Gap: budget.test.ts:278-290 checks `.budget_used` only; budget.ts:316-325 computes limit, budget_limit and exceeded with no test; seed from the TEN-COST-39 review |
|
|
1216
|
+
| TEN-QUALITY-28 | test: control.test.ts has only the missing-value cases for `backfill --repo`; add the positive `backfill --repo DIR` case (ships DIR, not cwd) and the bare `backfill DIR` case, with an injected env so nothing is sent | loki-ts/tests/commands/control.test.ts | LOW | red: mutate control.ts:235 to ignore `--repo` and run `cd loki-ts && bun test tests/commands/control.test.ts -t "backfill repo DIR"`, it fails; green: restored source passes | released v11.17.48 | Gap: control.test.ts:171-180 is the only backfill block and covers only exit 2; the positive path is unpinned; seed from the TEN-STABILITY-26 review |
|
|
1217
|
+
| TEN-COST-42 | fix: the bash readers of default_max_cost_usd (run.sh `_loki_budget_default`, autonomy/loki `loki_budget_default_usd`) fall back to 100 with no word when model-pricing.json is present but unreadable or has no parsable key; print one stderr warning naming the file, as the TS side does (TEN-COST-40), and keep the 100 fallback | autonomy/run.sh, autonomy/loki, tests/test-pricing-parity.sh | MEDIUM | red: add a case in tests/test-pricing-parity.sh that points the reader at an unreadable copy and expects a warning on stderr; `bash tests/test-pricing-parity.sh` fails; green: passes and a healthy file prints nothing extra | released v11.17.48 | Gap: run.sh:571 `sed ... 2>/dev/null` then `case '' ) 100.00`; autonomy/loki:79 `[ -f ... ] && sed` with no else branch; absent-file stays silent (that is the documented fallback), unreadable or keyless must warn |
|
|
1218
|
+
| TEN-COST-44 | enhancement: readEfficiencyDir skips malformed efficiency records silently, so a rebuilt budget undercounts spend with no hint; count the skipped files and have rebuildBudgetState include the count in its existing one-line warning; chain after TEN-QUALITY-27 | loki-ts/src/runner/budget.ts, loki-ts/tests/runner/budget.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/runner/budget.test.ts -t "skipped malformed"` fails (warning has no count); green: passes, the returned records and the 4-decimal cost are unchanged | released v11.17.48 | Gap: budget.ts:280-286 `catch { // ignore malformed file }`; budget.ts:320 warns only with the record count; chain after TEN-QUALITY-27 (same test file) |
|
|
1219
|
+
| TEN-COST-45 | fix: `loki estimate --provider bogus` and `--model nosuchmodel` are accepted and priced through whatever the resolver returns, while `loki start` rejects an unknown provider with exit 2; validate against the same provider list and print one error line naming the fix, exit 1 | loki-ts/src/runner/router/cost_preview.ts, loki-ts/tests/runner/cost_preview.test.ts | LOW | red: `cd loki-ts && bun test tests/runner/cost_preview.test.ts -t "unknown provider"` fails (exit 0); green: passes, claude, codex and a known model unchanged | released v11.17.48 | Gap: cost_preview.ts:151 stores any `--provider` value; start.ts:272 is the validating counterpart (VALID_PROVIDERS); confirm the run-history fixture prints a number for a bogus provider before filing the fix |
|
|
1220
|
+
| TEN-STABILITY-32 | fix: a set but unparseable LOKI_E10_CAP_S ("abc", "0", "-5") or loki.yaml budgets.run_cap_s is dropped by envCapS and yamlRunCapS and the 900s default silently applies in four readers; make the one helper return a warning once on stderr naming the bad value and the default used (never loosen the cap) | loki-ts/src/engine10/types.ts, loki-ts/src/util/run_cap.ts, loki-ts/tests/engine10/cap.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/engine10/cap.test.ts -t "invalid cap warns"` fails (no output); green: passes, valid values and the unset case print nothing | released v11.17.48 | Gap: types.ts:23 `Number.isFinite(n) && n > 0 ? n : null` with no diagnostic; consumers worker.ts:41, supervisor.ts:163, run_cap.ts:60 all read it; sibling of TEN-STABILITY-27 which covered only LOKI_E10_STALL_S |
|
|
1221
|
+
| TEN-STABILITY-33 | fix: `loki start ./prd.md --brief --yes` (and --prd, --completion-promise, --aider-model, --aider-flags, --cline-model) takes the next flag token as the value, so a forgotten value becomes a paid run on the text "--yes"; a value that starts with "-" or is empty must print one error naming the flag and exit 2 (use `--flag=-x` for a dash-leading value) | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/commands/start.test.ts -t "value flag swallows flag"` fails (parse succeeds with brief "--yes"); green: passes and `cd loki-ts && bunx tsc --noEmit` exits 0 | released v11.17.48 | Gap: start.ts:29 argVal returns args[i+1] with no flag-shape check; TEN-COST-36 only covered the six numeric flags; chain before TEN-UX-32 |
|
|
1222
|
+
| TEN-UX-32 | fix: `loki start ./a.md --prd ./b.md --brief "x"` silently picks --prd and drops the others; when two or more of positional spec, --prd and --brief are given with different values, print which one wins or refuse with exit 2 naming all of them; chain after TEN-STABILITY-33 | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/commands/start.test.ts -t "conflicting spec sources"` fails (exit 0); green: passes, a single source and `--prd` equal to the positional are unchanged | released v11.17.48 | Gap: start.ts `prdFlag ?? briefFlag ?? spec` precedence with no conflict check; chain after TEN-STABILITY-33 (same file) |
|
|
1223
|
+
| TEN-COST-43 | fix: `loki start prd.md --budget-limit 5 --budget 50` reads the first flag and silently drops the second, so the cap the user meant last can be the one ignored; differing values must print one error naming both flags and exit 2; chain after TEN-UX-32 | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/commands/start.test.ts -t "conflicting budget flags"` fails (cap 5 applied, no message); green: passes, equal values and a single flag unchanged | released v11.17.48 | Gap: start.ts `posNum(argVal(args, "--budget-limit") ?? argVal(args, "--budget"))`; chain after TEN-UX-32 (same file) |
|
|
1224
|
+
| TEN-DEPLOY-21 | fix: `loki start prd.md --deploy --destination prod`, `--auto-rollback` or `--health-match` without `--health-url`, and `--canary` with a non-production destination are only rejected by `loki deploy` AFTER the paid build finishes; reject them in deployFlagError before the run; chain after TEN-COST-43 | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/commands/start.test.ts -t "deploy flags fail before build"` fails (returns null for each case); green: passes, valid combinations unchanged | released v11.17.48 | Gap: start.ts deployFlagError checks only --health-url, --domain and --env-file; the destination enum, health-url requirement and canary rule live at autonomy/loki:11176-11256 and run after cmd_start (autonomy/loki:2733); chain after TEN-COST-43 (same file) |
|
|
1225
|
+
| TEN-DEPLOY-22 | fix: the bash `start` parser (autonomy/loki `_ps_*`) has the same late validation for `--destination`, `--health-match`/`--auto-rollback` without `--health-url`, and `--canary` with a non-production destination; copy the three checks next to the existing "apply only with --deploy" guard so the bash route fails before cmd_start | autonomy/loki, tests/test-deploy.sh | MEDIUM | red: add cases to tests/test-deploy.sh that run `loki start --deploy --destination prod` and expect exit 2 before any start output; `bash tests/test-deploy.sh` fails; green: passes | released v11.17.48 | Gap: autonomy/loki:2696 checks only that deploy flags need --deploy; enum and pairing checks sit in cmd_deploy at 11176 and 11245-11256; message text must match cmd_deploy so one doc covers both |
|
|
1226
|
+
| TEN-STABILITY-34 | fix: `loki queue list --bogus`, `queue clear extra` and `queue run --bogus` ignore unknown flags and extra args (queueRun only looks for --no-pr and --max-total-cost); reject with the usage line and exit 2, so a mistyped --no-pr cannot open PRs | loki-ts/src/commands/queue.ts, loki-ts/tests/commands/queue.test.ts | LOW | red: `cd loki-ts && bun test tests/commands/queue.test.ts -t "unknown flag"` fails (exit 0); green: passes, valid forms unchanged | released v11.17.48 | Gap: queue.ts:262 `args.includes("--no-pr")` with no allow-list; queueList(d) and queueClear(d) are called without their args at queue.ts:475-481; sibling of TEN-DEPLOY-16 |
|
|
1227
|
+
| TEN-ADOPTION-25 | feature: `loki queue list --json` printing the queued refs as a JSON array so scripts and editors can read the queue; plain output stays byte identical; chain after TEN-STABILITY-34 | loki-ts/src/commands/queue.ts, loki-ts/tests/commands/queue.test.ts | LOW | red: `cd loki-ts && bun test tests/commands/queue.test.ts -t "list json"` fails (unknown flag); green: passes, text output golden unchanged | released v11.17.48 | Gap: queue.ts has no --json for list (the only --json at :353 is the usage governor call); chain after TEN-STABILITY-34 (same file) |
|
|
1228
|
+
| TEN-STABILITY-35 | fix: preflight passes a git repo with no commits (git init, nothing committed) and the run then dies inside worktree creation with a raw "invalid reference: HEAD"; add a HEAD check and the fatal line `repository has no commits; run: git add . && git commit -m init` | loki-ts/src/engine10/preflight.ts, loki-ts/tests/engine10/preflight.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/engine10/preflight.test.ts -t "no commits"` fails (fatal is null); green: passes, a repo with one commit and the empty-folder auto-init path unchanged | released v11.17.48 | Gap: preflight.ts checks only `rev-parse --is-inside-work-tree` and the git identity; first_run_repo.ts:11 even tells a non-empty folder user to run `git init` first, which leaves exactly this state |
|
|
1229
|
+
| TEN-STABILITY-36 | enhancement: preflight has no free-disk check, so a full volume fails mid-run in worktree or event-log writes; warn under 2 GB free and refuse under 200 MB on the repo volume with a message naming the volume, reuse statfsSync like the doctor disk check; chain after TEN-STABILITY-35 | loki-ts/src/engine10/preflight.ts, loki-ts/tests/engine10/preflight.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/engine10/preflight.test.ts -t "low disk"` fails (no warning, injected statfs ignored); green: passes, normal disk prints nothing | released v11.17.48 | Gap: no statfs in src/engine10; doctor.ts:405 already computes it for `loki doctor`; thresholds overridable by LOKI_MIN_FREE_MB; chain after TEN-STABILITY-35 (same file) |
|
|
1230
|
+
| TEN-SPEED-14 | enhancement: checkPreflight awaits `rev-parse` before it starts the two `git config` reads; start all three together and re-run the work-tree check only when auto-init ran, saving one git spawn on every `loki start`; chain after TEN-STABILITY-36 | loki-ts/src/engine10/preflight.ts, loki-ts/tests/engine10/preflight.test.ts | LOW | red: `cd loki-ts && bun test tests/engine10/preflight.test.ts -t "parallel git reads"` fails (spawn order is serial); green: passes, every existing preflight verdict and message unchanged | released v11.17.48 | Gap: preflight.ts `let wt0 = await git(...)` then `Promise.all([Promise.resolve(wt0), git(name), git(email)])`; chain after TEN-STABILITY-36 (same file) |
|
|
1231
|
+
| TEN-SPEED-13 | enhancement: buildTestMap walks the whole tree with readdirSync minus a skip list, which is slow on a large monorepo; take the file list from `git ls-files` (safe_git) with the walk as the fallback outside a repo, same sorted output | loki-ts/src/engine10/testmap.ts, loki-ts/tests/engine10/testmap.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/engine10/testmap.test.ts -t "tracked files only"` fails (an ignored node_modules-like dir is walked); green: passes, existing fixtures give the same map | released v11.17.48 | Gap: testmap.ts:66 carries the author note "full recursive walk ... use git ls-files if a huge monorepo makes this slow"; untracked-but-ignored dirs not in SKIP_DIRS are walked today |
|
|
1232
|
+
| TEN-STABILITY-37 | fix: engine10 supervisor main() pushes every unrecognised token into the task words, so `loki "fix the bug" --no-prr` or `--dry-run` becomes part of the paid task text; reject unknown dash-leading tokens with a usage line and exit 2, and honour `--` as the end of options | loki-ts/src/engine10/supervisor.ts, loki-ts/tests/engine10/spec_first_intent.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/engine10/spec_first_intent.test.ts -t "unknown flag"` fails (task contains the flag); green: passes, tasks without flags and `-- -weird task` unchanged | released v11.17.48 | Gap: supervisor.ts:255-262 final `else words.push(a)`; the start route (engineArgv) only emits known flags, so the direct `loki "<task>"` entry is the exposed one |
|
|
1233
|
+
| TEN-UX-33 | fix: supervisor `--provider` with no value or a flag-shaped value keeps the env provider or takes the next flag as the provider name; print "--provider needs a value" and exit 2; chain after TEN-STABILITY-37 | loki-ts/src/engine10/supervisor.ts, loki-ts/tests/engine10/spec_first_intent.test.ts | LOW | red: `cd loki-ts && bun test tests/engine10/spec_first_intent.test.ts -t "provider needs a value"` fails; green: passes, `--provider codex` unchanged | released v11.17.48 | Gap: supervisor.ts:254 `provider = args[++i] ?? provider`; chain after TEN-STABILITY-37 (same file) |
|
|
1234
|
+
| TEN-STABILITY-38 | fix: supervisor treats any token starting with `--max-cost` as the cap flag, so `--max-costly` or `--max-cost5` slices garbage (`a.slice(11)`) or swallows the next token; match `--max-cost` exactly or `--max-cost=`; chain after TEN-UX-33 | loki-ts/src/engine10/supervisor.ts, loki-ts/tests/engine10/spec_first_intent.test.ts | LOW | red: `cd loki-ts && bun test tests/engine10/spec_first_intent.test.ts -t "max-cost prefix"` fails; green: passes, `--max-cost 5` and `--max-cost=5` unchanged | released v11.17.48 | Gap: supervisor.ts:253 `a.startsWith("--max-cost")`; chain after TEN-UX-33 (same file) |
|
|
1235
|
+
| TEN-UX-30 | fix: `loki stats --bogus` is ignored and prints stats with exit 0 on the TS route and in bash; reject unknown flags with one line and exit 2 on both routes (--json, --efficiency, --help stay) | loki-ts/src/commands/stats.ts, loki-ts/tests/commands/stats.test.ts | LOW | red: `cd loki-ts && bun test tests/commands/stats.test.ts -t "unknown flag"` fails (exit 0); green: passes and `bun test tests/commands/stats.test.ts` stays green; if a bash-parity test pins the old exit 0, update it in the same change | released v11.17.48 | Gap: stats.ts:473 comment "unknown flags ignored to match bash behavior"; observed `loki stats --bogus` prints the session table and exits 0; a mistyped --json silently gives text |
|
|
1236
|
+
| TEN-UX-31 | fix: `loki version --bogus` prints the version and exits 0; reject an unknown flag with a usage line and exit 2 (--json, --help, -h, help stay) | loki-ts/src/commands/version.ts, loki-ts/tests/commands/version.test.ts | LOW | red: `cd loki-ts && bun test tests/commands/version.test.ts -t "unknown flag"` fails (exit 0); green: passes, plain output byte identical | released v11.17.48 | Gap: version.ts:17-27 reads only --json and the help words; observed `loki version --bogus` prints `Loki Mode v11.17.46` exit 0; seed from the sibling sweep of TEN-UX-20 |
|
|
1237
|
+
| TEN-UX-36 | fix: `loki status run-a run-b` reports "unknown flag run-b" for a second run id and the usage line omits [run-id]; print "too many arguments: expected one run id" with the full usage and exit 1 | loki-ts/src/commands/run_status.ts, loki-ts/tests/commands/run_status.test.ts | LOW | red: `cd loki-ts && bun test tests/commands/run_status.test.ts -t "second run id"` fails (message says unknown flag); green: passes, one run id and --json unchanged | released v11.17.48 | Gap: run_status.ts:143 shares one else branch for extra positionals and flags and prints `Usage: loki status [--json]` |
|
|
1238
|
+
| TEN-UX-34 | fix: `loki answer --text` with no value silently falls through to the saved Control Plane answer (or "no answer"), so a forgotten value answers with stale text; print "--text needs a value" and exit 2 | loki-ts/src/features/blocked_answer.ts, loki-ts/tests/features/blocked_answer.test.ts | LOW | red: `cd loki-ts && bun test tests/features/blocked_answer.test.ts -t "text needs a value"` fails; green: passes, `--text "x"`, `--text=x` and the file path unchanged | released v11.17.48 | Gap: blocked_answer.ts:63 `text = args[++i]` stores undefined, then `text ?? readAnswerFile(...)` at :70 |
|
|
1239
|
+
| TEN-SECURITY-12 | fix: loadSigningKey returns null with no word when LOKI_RECEIPT_SIGNING_KEY_FILE points at an unreadable file, a malformed PEM or a non-ed25519 key, so the run seals an UNSIGNED receipt and the user never learns why; return a reason (file unreadable, not a PEM, not ed25519) that the seal step prints on one stderr line, never the key bytes, and keep the receipt UNSIGNED, never invent a signature | loki-ts/src/util/receipt_signer.ts, loki-ts/tests/engine10/seal_verify_roundtrip.test.ts | HIGH | red: `cd loki-ts && bun test tests/engine10/seal_verify_roundtrip.test.ts -t "unusable signing key names the reason"` fails (no reason, no stderr line); green: passes, the default generated key and a valid explicit key sign exactly as before | released v11.17.48 | Gap: receipt_signer.ts:57-59 outer `catch { return null; }` and :50 `k.asymmetricKeyType === "ed25519" ? k : null` collapse every failure into the same UNSIGNED result; HIGH because it is the Seal; reviewers must confirm no key material reaches the message |
|
|
1240
|
+
| TEN-SPEED-15 | enhancement: collectToolchain spawns `node`, `python3` and `git --version` serially with spawnSync on every seal; memoize the result per process (tools do not change inside one run) and run the probes together, receipt body unchanged; chain after TEN-SECURITY-12 | loki-ts/src/util/receipt_signer.ts, loki-ts/tests/engine10/seal_verify_roundtrip.test.ts | MEDIUM | red: `cd loki-ts && bun test tests/engine10/seal_verify_roundtrip.test.ts -t "toolchain probed once"` fails (probe called per seal); green: passes, toolchain fields identical in the receipt | released v11.17.48 | Gap: receipt_signer.ts:75-80 toolVersion uses spawnSync with a 5s timeout per tool and collectToolchain has no cache; chain after TEN-SECURITY-12 (same file) |
|
|
1241
|
+
| TEN-GATES-25 | fix: `loki verify --bogus` and `loki verify run-a run-b` treat the first token as the run id, so a typo yields a misleading "no such receipt" style verdict and extra ids are ignored; reject unknown dash-leading flags and more than one positional with a usage line and exit 2, never change any verdict exit code | loki-ts/src/engine10/verify_cmd.ts, loki-ts/tests/engine10/verify_cmd.test.ts | HIGH | red: `cd loki-ts && bun test tests/engine10/verify_cmd.test.ts -t "unknown flag and extra id"` fails; green: passes and the whole verify_cmd suite stays green (exit 0/1/2/3/4/66 mapping unchanged) | released v11.17.48 | Gap: verify_cmd.ts verifyMain strips known flags then uses `args[0] ?? latestRunId(...)` with no leftover check; HIGH because it is the verifier front door and a wrong exit here is a false-green risk |
|
|
1242
|
+
| TEN-GATES-26 | feature: `loki verify [run-id] --json` printing {run, verdict, receipt_sha256, reasons, agent_independent:{k,of}} on stdout so CI can gate without scraping text; exit codes unchanged and the text output stays byte identical without the flag; chain after TEN-GATES-25 | loki-ts/src/engine10/verify_cmd.ts, loki-ts/tests/engine10/verify_cmd.test.ts | HIGH | red: `cd loki-ts && bun test tests/engine10/verify_cmd.test.ts -t "verify json"` fails (unknown flag); green: passes, golden text output unchanged | released v11.17.48 | Gap: verify_cmd.ts has no --json (verify-pr has one, TEN-GATES-21); independentLine() already computes k and the pass count; chain after TEN-GATES-25 (same file) |
|
|
1243
|
+
| TEN-ADOPTION-24 | feature: `loki wiki show --json` printing {section, content} (or all sections) so tooling can read the generated wiki without parsing text; text output unchanged | loki-ts/src/commands/wiki.ts, loki-ts/tests/commands/wiki.test.ts | LOW | red: `cd loki-ts && bun test tests/commands/wiki.test.ts -t "show json"` fails (unknown option); green: passes, text golden unchanged | released v11.17.48 | Gap: wiki.ts:55 rejects every dash token except --help and there is no json path; wiki.ts has 0 --json occurrences |
|
|
1244
|
+
| TEN-ADOPTION-26 | feature: `loki issues run --dry-run --json` printing the triage decision per issue (number, decision, reason, covered_by_pr) so CI can review the plan before any paid run | loki-ts/src/commands/issues_run.ts, loki-ts/tests/commands/issues_run.test.ts | LOW | red: `cd loki-ts && bun test tests/commands/issues_run.test.ts -t "dry run json"` fails (unexpected argument: --json); green: passes, the text table unchanged | released v11.17.48 | Gap: issues_run.ts:82-99 arg loop has no --json; triage results (`t.decision`, `t.reason`) and coveredIssues() already exist at :262-290 and :104 |
|
|
1215
1245
|
| TEN-COST-35 | fix: `loki start --budget-limit=5` (and --provider=, --session-model=, --prd=, --brief=) is accepted by the flag validator then silently ignored, so the default $100 cap and default provider apply; read the `=` form everywhere argVal reads a flag | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | MEDIUM | red: bun test tests/commands/start.test.ts -t "equals form" fails (cap stays default); green: same test passes and `cd loki-ts && bunx tsc --noEmit` exits 0 | released v11.17.44 | Gap: start.ts:23 argVal matches only exact args via indexOf; start.ts:212 validator splits on "=" so the form is accepted; only --cost and --attempts parse "=" |
|
|
1216
1246
|
| TEN-COST-36 | fix: `loki start --budget-limit abc`, `--max-iterations -1`, `--budget-limit 0x` and a trailing value flag with no value are silently dropped so the default cap applies; print one error line naming the flag and exit 2 | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | MEDIUM | red: bun test tests/commands/start.test.ts -t "invalid numeric" fails (exit 0, no message); green: passes, valid values unchanged | released v11.17.44 | Gap: start.ts:123 posNum returns undefined for non-numeric, zero or negative with no diagnostic; chain after TEN-COST-35 |
|
|
1217
1247
|
| TEN-STABILITY-21 | fix: control `--port` with no value or a non-numeric value silently falls back to the default port; reject with a usage line and exit 2 | loki-ts/src/commands/control.ts, loki-ts/tests/commands/control.test.ts | LOW | red: bun test tests/commands/control.test.ts -t "port without value" fails; green: passes and existing control tests stay green | released v11.17.44 | Gap: control.ts:33 flag() returns args[i+1] unchecked (undefined or the next flag) and callers fall through to the default |
|
|
@@ -117,4 +117,4 @@ A run blocked on a spec conflict shows its question in the run view with an answ
|
|
|
117
117
|
|
|
118
118
|
Ingest runs a pure verifier (`src/server/integrity.ts`) over every stored run and persists `tampered`, `attested`, `sig_checked` and `integrity_reasons`. Only the sealed prefix (events through `log.sealed`) supplies the verdict; a second `run.completed`, or any verdict-bearing event after `log.sealed`, is TAMPERED. The `log.sealed` kid must equal the signed receipt kid, and with keys configured an unknown kid is TAMPERED.
|
|
119
119
|
|
|
120
|
-
Display verdicts (`effective_verdict`, mirrored by `ui/src/api.ts`): TAMPERED; UNVERIFIED (a VERIFIED claim that is not attested
|
|
120
|
+
Display verdicts (`effective_verdict`, mirrored by `ui/src/api.ts`): TAMPERED; UNVERIFIED (a VERIFIED claim that is not attested); "VERIFIED (signature not checked)" (attested, but no key in `LOKI_CP_RECEIPT_PUBKEYS` checked the seal signature); VERIFIED (attested and signature-checked). With no keys configured nothing can be plain VERIFIED. Choice for the list filter: `?verdict=VERIFIED` lists signature-checked runs only; `?verdict=VERIFIED (signature not checked)` lists the rest. ALREADY_SATISFIED is a success outcome and needs a seal exactly like VERIFIED (same UNVERIFIED and signature-not-checked rules). Any other verdict on an unattested run shows `<verdict> (unattested)`, so an edited or redacted FAILED or PARTIAL never reads as plain. The Overview VERIFIED tile counts only plain VERIFIED; a separate tile counts signature-not-checked runs. Redaction (Q17-05b): the engine redacts event data with `redactEnvelope` (`loki-ts/src/util/redact.ts`) before it hashes the log and signs the seal; the shipper and ingest apply the same function, which is a fixpoint, so on an engine-written line both are no-ops. Seal crypto fields of the exact engine shape are exempt. A log whose bytes no longer match its seal, including one rewritten by redaction after sealing, is TAMPERED; there is no UNVERIFIED escape for redaction. Rows are recomputed at boot in chunks (one transaction each) when attested is NULL or the stored key-set fingerprint (`integrity_key_fp`) differs from the configured one; rows whose events are gone are marked unattested once and not retried.
|
|
@@ -136,7 +136,7 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
|
|
|
136
136
|
- `loki status`.
|
|
137
137
|
- Mechanism: one verdict-display function that returns TAMPERED whenever the run is tampered or its seal is invalid (CPE-27).
|
|
138
138
|
- Fixture: an ingested run with tamper.detected never shows VERIFIED in any surface.
|
|
139
|
-
- Sibling follow-up (EL-FC08b): redact at source in the engine before hashing. Today the shipper (redactEvent) and the server (redactSecrets) rewrite event data before the CP can hash it, so an honest signed run holding a token reads UNVERIFIED ("log redacted before ingest; seal not checkable"), never TAMPERED and never VERIFIED. Redacting before the engine hashes and signs would make such runs checkable end to end.
|
|
139
|
+
- Sibling follow-up (EL-FC08b): redact at source in the engine before hashing. Today the shipper (redactEvent) and the server (redactSecrets) rewrite event data before the CP can hash it, so an honest signed run holding a token reads UNVERIFIED ("log redacted before ingest; seal not checkable"), never TAMPERED and never VERIFIED. Redacting before the engine hashes and signs would make such runs checkable end to end. Status: built in Q17-05b (engine writer, shipper and ingest share redactEnvelope; redactSecrets iterates to a fixpoint so the layers produce the same bytes; a redaction-rewritten signed log now reads TAMPERED).
|
|
140
140
|
- Sibling follow-up (deferred, not built in EL-FC08b): the shipper should send the sha256 of each line before redaction (alongside the redacted line). The CP could then check the seal over the original hashes and tell a genuine redaction from a downgrade (a FAILED log edited to PARTIAL plus a planted [REDACTED]); today such a log can only read "<verdict> (unattested)" or UNVERIFIED. This is the lasting fix for placeholder downgrades. REJECTED 2026-10-17 (Q17-05, HIGH r1 on 36524784d): a client-supplied original hash cannot be checked by the server, so a forger copies log.sealed events_sha256 into the shipped chain and a FAILED run displays VERIFIED; the chain is also unbound to the run id, so any signed seal replays onto any log. Rule: the CP never accepts a client-supplied hash in place of recomputing one over the bytes it received. The lasting fix is the line above: redact in the engine before hashing and signing (Q17-05b).
|
|
141
141
|
- Sibling follow-up: the Slack summary, PR status and `loki status` do not yet read the CP effective_verdict.
|
|
142
142
|
|
package/docs/v10/PROGRESS.md
CHANGED
|
@@ -2518,3 +2518,9 @@ v11.17.21 published (Release success on 462fbc40a; npm latest 11.17.21, next 11.
|
|
|
2518
2518
|
|
|
2519
2519
|
## 2026-10-17T11:21Z (CoS) v11.17.46
|
|
2520
2520
|
- Released wave AM: 28 slices APPROVE across 19 chains; TEN-STABILITY-29 and TEN-ADOPTION-23 dropped as already fixed. Combined main: tsc rc 0; bun 593/0 and 449/0; help-changelog-drift, help-discoverability, secret-scan rc 0.
|
|
2521
|
+
|
|
2522
|
+
## 2026-10-17T11:59Z (CoS) v11.17.47
|
|
2523
|
+
- Released TEN-GATES-15 and Q17-05b (wave AH redo, opus APPROVE 708682ea2 and 0112c4fcc) plus a tsc fix-forward in redact.test.ts (325df1f44). Q18-03e blocked after 3 rounds; reslice to a real tokenizer. Combined: tsc rc 0; loki-ts bun 557/0; control-plane server 335/0. Board refill wave AN (bda2ee54d) included.
|
|
2524
|
+
|
|
2525
|
+
## 2026-10-17T12:36Z (CoS) v11.17.48
|
|
2526
|
+
- Wave AN shipped: 30 of 30 TEN rows APPROVE and merged in 19 chains (one test import conflict resolved by hand, union of both import sets). Checks: tsc rc=0; bun test changed files plus spawn_env_guard, engine10/budget and tests/util 1026 pass 0 fail; test-deploy, test-help-start-flags, test-pricing-parity rc=0; help-changelog-drift 51 passed 0 failed after the completion fix. Main Tests red on cbded2759 (shard-durations row for TEN-ADOPTION-15 plus shell and bun shards) has a P0 fix-forward agent running. Q18-03e reslice 4 (TypeScript compiler API) building.
|