loki-mode 11.17.53 → 11.17.54
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 +13 -2
- package/bin/loki +15 -2
- package/completions/_loki +1 -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 +61 -31
- package/docs/v10/PROGRESS.md +3 -0
- package/loki-ts/dist/loki.js +1271 -1257
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
- package/packages/control-plane/dist/server.js +344 -89
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-B5S4tImz.js → AdminPage-BKytQzi7.js} +1 -1
- package/web-app/dist/assets/{Avatar-DVT9cXf-.js → Avatar-DULU38xR.js} +1 -1
- package/web-app/dist/assets/{Badge-D-n8nS0d.js → Badge-BgAJWEbC.js} +1 -1
- package/web-app/dist/assets/{Button-Dfgum0N6.js → Button-QBy3E-K9.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-4xhSdrDM.js → CockpitPage-BMLeFZw0.js} +1 -1
- package/web-app/dist/assets/{ComparePage-CPta-oKN.js → ComparePage-BZkbj-wD.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-CR8B9oGo.js → ErrorBoundary-9dL8wmBU.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-CUhElwm7.js → EvidenceReceiptPanel-lC78oTLX.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-xKI3dI1W.js → GitHubIssuesPanel-Dl1Dbj4g.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-CJ16YJ9s.js → GitHubPRsPanel-Bu1v1fgS.js} +1 -1
- package/web-app/dist/assets/{HomePage-CzW6cDpa.js → HomePage-ChhuZMUO.js} +2 -2
- package/web-app/dist/assets/{LoginPage-CV6Tvhge.js → LoginPage-Cw0Atl1f.js} +1 -1
- package/web-app/dist/assets/{MagicPage-Dqq2v6Uu.js → MagicPage-C2glZHi6.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-w5e0DFyq.js → MetricsPage-CMy_qRSQ.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-CD15KPqA.js → NotFoundPage-C-onZ3-d.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-CLOEGdOa.js → ProjectPage-ZOQL-ktT.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-wVGxTUqN.js → ProjectsPage-CfLavgux.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-tcZTOUCx.js → SettingsPage-CSyAoZ8a.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-DhhFuJrY.js → ShowcasePage-Ai6ZvcyU.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-DJTIpzRe.js → SystemSettingsPage-DVSEWSp5.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-D_G-ch7e.js → TeamsPage-Xn4lNrgG.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-Br8IjtsC.js → TemplatesPage-vulcofcg.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-CDpeKr1C.js → TerminalOutput-yp6jNOTy.js} +1 -1
- package/web-app/dist/assets/{activity-D3HHYtv7.js → activity-CC6ndXV7.js} +1 -1
- package/web-app/dist/assets/{bell-Cw_RiUI1.js → bell-sL3Z98iv.js} +1 -1
- package/web-app/dist/assets/{bot-CvSdbJCG.js → bot-CcObIALe.js} +1 -1
- package/web-app/dist/assets/{check-BrdmdEjE.js → check-Bxbpy74M.js} +1 -1
- package/web-app/dist/assets/{chevron-left-BNGgoAGR.js → chevron-left-Bfxs9puC.js} +1 -1
- package/web-app/dist/assets/{circle-alert-DbRWBNqr.js → circle-alert-ChkicRIA.js} +1 -1
- package/web-app/dist/assets/{clock-Be7jXWMi.js → clock-0wlcRVn5.js} +1 -1
- package/web-app/dist/assets/{cloud-CRvIp-jH.js → cloud-Bj4b7d1v.js} +1 -1
- package/web-app/dist/assets/{code-xml-BzHwWlm3.js → code-xml-DP0hubH3.js} +1 -1
- package/web-app/dist/assets/{database-91AqM-FY.js → database-BF7N8Oqx.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-BeNsKJBp.js → dollar-sign-BgxE1svU.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-BvNUefQ2.js → file-code-corner-C3QgWeEA.js} +1 -1
- package/web-app/dist/assets/{file-plus-DSdhJlCE.js → file-plus-BDkocQyd.js} +1 -1
- package/web-app/dist/assets/{globe-alpFSVbm.js → globe-Dow8JyQ5.js} +1 -1
- package/web-app/dist/assets/{hammer-DceL_3zd.js → hammer-C_UL7aCu.js} +1 -1
- package/web-app/dist/assets/{index-BOfXC5KW.js → index-Wg_eixdv.js} +3 -3
- package/web-app/dist/assets/{layers-C2dORLkY.js → layers-DXI8u4Fm.js} +1 -1
- package/web-app/dist/assets/{loader-circle-CcbHAofe.js → loader-circle-D88L4Po6.js} +1 -1
- package/web-app/dist/assets/{lock-yivPar99.js → lock-CEHdJ2FR.js} +1 -1
- package/web-app/dist/assets/{package-BGe4JXNK.js → package-Dtmmpeq0.js} +1 -1
- package/web-app/dist/assets/{plus-BpZ4ajEG.js → plus-DoldLnin.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-CqIBSjzI.js → refresh-cw-Dd0Hlwn6.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-C7s45N_R.js → rotate-ccw-CHF-gtUq.js} +1 -1
- package/web-app/dist/assets/{scroll-text-Ce9Kmot6.js → scroll-text-DX4nLBkd.js} +1 -1
- package/web-app/dist/assets/{server-DyUYnlLz.js → server-BMsz27AO.js} +1 -1
- package/web-app/dist/assets/{shield-alert-DT2LYxTG.js → shield-alert-vPyoSgqA.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-DJeSSzDq.js → thumbs-up-C4wrwJ5e.js} +1 -1
- package/web-app/dist/assets/{trash-2-BfICAUqu.js → trash-2-Ce7D0nSW.js} +1 -1
- package/web-app/dist/assets/{trending-down-DzjhrhCE.js → trending-down-BmvCA5Qx.js} +1 -1
- package/web-app/dist/assets/{trending-up-qxrTgUwQ.js → trending-up-BPiTPRTf.js} +1 -1
- package/web-app/dist/assets/{upload-BRZGP_py.js → upload-Dcy74KSo.js} +1 -1
- package/web-app/dist/assets/{usePolling-V4nOdEIl.js → usePolling-BCA-Wm1u.js} +1 -1
- package/web-app/dist/assets/{user-CHfDU18s.js → user-Dv2IjXtp.js} +1 -1
- package/web-app/dist/index.html +1 -1
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: An autonomous software factory that knows what it is supposed to deliver, and proves it did. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v11.17.
|
|
6
|
+
# Loki Mode v11.17.54
|
|
7
7
|
|
|
8
8
|
**Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the previous bash loop. PRD-file starts (`loki start ./prd.md`) and the opencode provider still run on it until FC38-SWEEP ports them; the legacy-engine command and the LOKI_ENGINE switch remain removed. Prefer `loki owner/repo#N` for issues.
|
|
9
9
|
|
|
@@ -483,4 +483,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
483
483
|
|
|
484
484
|
---
|
|
485
485
|
|
|
486
|
-
**v11.17.
|
|
486
|
+
**v11.17.54 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
11.17.
|
|
1
|
+
11.17.54
|
package/autonomy/loki
CHANGED
|
@@ -2915,7 +2915,7 @@ cmd_start() {
|
|
|
2915
2915
|
echo " and, with --deploy, the flag --github runs loki github publish after a good deploy"
|
|
2916
2916
|
echo ""
|
|
2917
2917
|
echo "Issue-mode options (used when input is an ISSUE-REF or a --brief):"
|
|
2918
|
-
echo " --dry-run
|
|
2918
|
+
echo " --dry-run Validate flags, run the preflight and print the provider, model and cost cap without starting (issue mode: preview the PRD)"
|
|
2919
2919
|
echo " --no-start Generate PRD but don't start execution"
|
|
2920
2920
|
echo " --output FILE Save generated PRD to custom path"
|
|
2921
2921
|
echo " --worktree, -w Git worktree isolation (separate branch)"
|
|
@@ -3549,7 +3549,18 @@ cmd_start() {
|
|
|
3549
3549
|
# SUPPORTED_PROVIDERS but missing from the older lists.
|
|
3550
3550
|
local _pf_installed=""
|
|
3551
3551
|
local _pf_p
|
|
3552
|
-
|
|
3552
|
+
# Single source: SUPPORTED_PROVIDERS in providers/loader.sh.
|
|
3553
|
+
local _pf_known
|
|
3554
|
+
_pf_known="$(sed -n 's/^SUPPORTED_PROVIDERS=(\(.*\))$/\1/p' "$_LOKI_SCRIPT_DIR/../providers/loader.sh" 2>/dev/null | tr -d '"' | head -1)"
|
|
3555
|
+
[ -n "$_pf_known" ] || _pf_known="claude codex cline aider opencode"
|
|
3556
|
+
case " $_pf_known " in
|
|
3557
|
+
*" $_pf_explicit "*) ;;
|
|
3558
|
+
*)
|
|
3559
|
+
echo -e "${RED}Error: unknown provider '$_pf_explicit' (use one of: ${_pf_known// /, })${NC}" >&2
|
|
3560
|
+
exit 1
|
|
3561
|
+
;;
|
|
3562
|
+
esac
|
|
3563
|
+
for _pf_p in $_pf_known; do
|
|
3553
3564
|
if command -v "$_pf_p" >/dev/null 2>&1; then
|
|
3554
3565
|
_pf_installed="${_pf_installed:+$_pf_installed }$_pf_p"
|
|
3555
3566
|
fi
|
package/bin/loki
CHANGED
|
@@ -434,7 +434,7 @@ _loki_start_needs_bash() {
|
|
|
434
434
|
|--fast|--repo-fast|--full|--repo-full \
|
|
435
435
|
|--bmad-project|--openspec \
|
|
436
436
|
|--mirofish|--mirofish-docker|--mirofish-rounds|--mirofish-timeout|--mirofish-bg \
|
|
437
|
-
|--issue|--
|
|
437
|
+
|--issue|--no-start|--output|--worktree|-w|--pr|--ship|--detach|-d)
|
|
438
438
|
return 0 ;;
|
|
439
439
|
--isolation)
|
|
440
440
|
# value follows; only worktree/docker/sandbox divert (none stays Bun).
|
|
@@ -455,7 +455,7 @@ _loki_start_needs_bash() {
|
|
|
455
455
|
}
|
|
456
456
|
_loki_attempts_refuse() {
|
|
457
457
|
if _loki_start_needs_bash "$@"; then
|
|
458
|
-
echo "loki: 'loki start --attempts' runs only the Loki 10 engine; an option or provider in this command (for example --parallel, --github, --sandbox, --issue,
|
|
458
|
+
echo "loki: 'loki start --attempts' runs only the Loki 10 engine; an option or provider in this command (for example --parallel, --github, --sandbox, --issue, or --detach) was only honored by the removed legacy loop. Remove it, or use a task string, an issue ref or a PRD path." >&2
|
|
459
459
|
exit 2
|
|
460
460
|
fi
|
|
461
461
|
case "${LOKI_PROVIDER:-claude}" in
|
|
@@ -514,6 +514,19 @@ if [ "${1:-}" = "start" ]; then
|
|
|
514
514
|
unset _loki_sp_a
|
|
515
515
|
fi
|
|
516
516
|
|
|
517
|
+
# TEN-UX-45: `loki start ... --dry-run` is the Bun start command's preview (flags, preflight,
|
|
518
|
+
# provider, model, cap; nothing runs). Issue refs and bash-only flags keep the legacy route,
|
|
519
|
+
# where --dry-run previews the generated PRD.
|
|
520
|
+
if [ "${1:-}" = "start" ]; then
|
|
521
|
+
_loki_dry=0
|
|
522
|
+
for _loki_da in "${@:2}"; do [ "$_loki_da" = "--dry-run" ] && _loki_dry=1; done
|
|
523
|
+
if [ "$_loki_dry" = "1" ] && ! _loki_start_needs_bash "${@:2}"; then
|
|
524
|
+
_loki_dry_bun="$(_loki_bun)"
|
|
525
|
+
[ -n "$_loki_dry_bun" ] && exec "$_loki_dry_bun" "$BUN_CLI" "$@"
|
|
526
|
+
fi
|
|
527
|
+
unset _loki_dry _loki_da _loki_dry_bun
|
|
528
|
+
fi
|
|
529
|
+
|
|
517
530
|
# OC-ROUTE: normalize flags before the engine decision so argument order and input form
|
|
518
531
|
# never change the engine (autonomy/route.sh; `loki route ...` and --explain-route print it).
|
|
519
532
|
_R_APPLIED=0
|
package/completions/_loki
CHANGED
|
@@ -405,6 +405,7 @@ function _loki_start {
|
|
|
405
405
|
'--skip-memory[Skip loading memory context]' \
|
|
406
406
|
'--spec[Run against an edited spec file]:spec file:_files' \
|
|
407
407
|
'--spec-first[Write an editable spec, then stop]' \
|
|
408
|
+
'--dry-run[Validate flags and preflight, print provider, model and cap, spend nothing]' \
|
|
408
409
|
'--yes[Skip confirmation prompts]' \
|
|
409
410
|
'-y[Skip confirmation prompts]' \
|
|
410
411
|
'--budget[Cost budget limit in USD]:amount:' \
|
package/completions/loki.bash
CHANGED
|
@@ -28,7 +28,7 @@ _loki_completion() {
|
|
|
28
28
|
# If the word starts with a dash, show flags
|
|
29
29
|
# Rule: list every flag bin/loki routes (Bun/engine10 ones such as --model, --max-cost, --spec, --no-pr too), not only cmd_start's own.
|
|
30
30
|
if [[ "$cur" == -* ]]; then
|
|
31
|
-
local flags="--provider --max-iterations --parallel --background --bg --simple --complex --github --no-dashboard --sandbox --skip-memory --cost --spec --spec-first --yes --budget --attempts --model --isolation --max-cost --no-pr --explain-route --brief --worktree --pr --ship --detach --workspace --deploy --health-url --auto-rollback --destination --canary --domain --env-file --resume --help"
|
|
31
|
+
local flags="--provider --max-iterations --parallel --background --bg --simple --complex --github --no-dashboard --sandbox --skip-memory --cost --spec --spec-first --dry-run --yes --budget --attempts --model --isolation --max-cost --no-pr --explain-route --brief --worktree --pr --ship --detach --workspace --deploy --health-url --auto-rollback --destination --canary --domain --env-file --resume --help"
|
|
32
32
|
COMPREPLY=( $(compgen -W "${flags}" -- "$cur") )
|
|
33
33
|
return 0
|
|
34
34
|
fi
|
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.54. 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.54
|
|
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
|
@@ -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 |
|
|
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 | released v11.17.54 | 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). |
|
|
@@ -1336,33 +1336,63 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
|
|
|
1336
1336
|
| TEN-ADOPTION-33 | feature: registry memory list and memory lessons list the --json flag | loki-ts/src/cli/registry.ts, docs/v10/CLI-MODERN.md, loki-ts/tests/cli/registry_guard.test.ts | LOW | red: cd loki-ts && bun test tests/cli/registry_guard.test.ts -t "memory json" fails; green: passes | released v11.17.53 | Gap: registry.ts:104-117 list and lessons have no flags; memory.ts:126 and :155 accept --json. Serialize after TEN-ADOPTION-32 |
|
|
1337
1337
|
| TEN-DEPLOY-24 | fix: rollback deploy hint matches only the first token, so flyctl deploy, npx vercel --prod and bunx wrangler get no rollback command; skip npx, bunx, pnpm dlx, yarn dlx wrappers and alias flyctl to fly | loki-ts/src/commands/rollback.ts, loki-ts/tests/commands/rollback.test.ts | LOW | red: cd loki-ts && bun test tests/commands/rollback.test.ts -t "wrapped deploy" fails; green: passes | released v11.17.53 | Gap: rollback.ts printDeployRollback const first = command.split(/\s+/)[0] then DEPLOY_ROLLBACKS.find(r => r.prefix === first). Chain DEPLOY-24, DEPLOY-25 |
|
|
1338
1338
|
| TEN-DEPLOY-25 | feature: loki rollback deploy accepts --json and prints the matched rollback command as a JSON object | loki-ts/src/commands/rollback.ts, loki-ts/tests/commands/rollback.test.ts | LOW | red: cd loki-ts && bun test tests/commands/rollback.test.ts -t "deploy json" fails; green: passes | released v11.17.53 | Gap: rollback.ts:65 allowed flags are [] for deploy. Serialize after TEN-DEPLOY-24 |
|
|
1339
|
-
| TEN-SPEED-17 | feature: engine10 intake reuses the tree-keyed repomap and testmap cache (cachedRepoMap and cachedTestMap) instead of rebuilding both on every run, so a second run on an unchanged tree skips the repo walk and test detection | loki-ts/src/engine10/stages/intake.ts, loki-ts/tests/engine10/intake.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/intake.test.ts -t "tree cache" fails; green: passes |
|
|
1340
|
-
| TEN-SPEED-18 | feature: verify runs the selected test files with bounded concurrency (LOKI_E10_VERIFY_JOBS, default 1 so behavior is unchanged) and records checks in the original failed-first order; protect, cwd and interpreter handling stay per test | loki-ts/src/engine10/stages/verify.ts, loki-ts/tests/engine10/verify.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/verify.test.ts -t "verify jobs" fails; green: passes |
|
|
1341
|
-
| TEN-SPEED-19 | feature: the Wall base-tree test run executes wall test files with bounded concurrency (LOKI_E10_BASE_JOBS, default 1) with the same pass/fail/not_run counts and lastNotRunFiles order | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall_runner.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/wall_runner.test.ts -t "base jobs" fails; green: passes |
|
|
1342
|
-
| TEN-SPEED-20 | feature: a group suite-fix unit reuses the failing-suite output integrate already captured instead of re-running the whole suite (up to 600s) just to build the fix brief | loki-ts/src/features/speed/fix_units.ts, loki-ts/src/engine10/integrate.ts, loki-ts/tests/features/speed/fix_units.test.ts | MEDIUM | red: cd loki-ts && bun test tests/features/speed/fix_units.test.ts -t "suite fix reuses output" fails; green: passes |
|
|
1343
|
-
| TEN-UX-45 | feature: loki start --dry-run parses and validates every flag, runs the preflight and prints the provider, model and cost cap it would use, then exits 0 without spending a token | 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 "dry-run" fails; green: passes |
|
|
1344
|
-
| TEN-UX-46 | feature: loki start unknown-flag error suggests the closest valid flag (suggestWord) and stops naming LOKI_SDK_LOOP internals to first-run users | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | LOW | red: cd loki-ts && bun test tests/commands/start.test.ts -t "unknown flag suggestion" fails; green: passes |
|
|
1345
|
-
| TEN-COST-54 | feature: LOKI_PRICE_TABLE=<json file> overrides or extends PRICE_TABLE entries so a stale vendor price is fixable without a release; invalid file falls back to the built-in table | loki-ts/src/providers/price_table.ts, loki-ts/tests/providers/price_table.test.ts (new: no test file owns price_table.ts, grep of tests for priceFor and usdFor finds none) | LOW | red: cd loki-ts && bun test tests/providers/price_table.test.ts -t "price table override" fails; green: passes |
|
|
1346
|
-
| TEN-COST-55 | feature: opencode runs get a size-estimate cost record (estimated=true, cost_basis size-estimate) when the model id is priced, instead of an unmeasured cost, so the cost cap and loki cost cover all 5 providers | loki-ts/src/providers/provider_cost.ts, loki-ts/tests/engine10/budget_cap.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/budget_cap.test.ts -t "opencode estimate" fails; green: passes |
|
|
1347
|
-
| TEN-QUALITY-32 | feature: impactedRefs maps a changed Python package __init__.py and Rust mod.rs to the package directory name so tests that import the package are selected | loki-ts/src/engine10/testmap.ts, loki-ts/tests/engine10/testmap.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/testmap.test.ts -t "package init maps to directory" fails; green: passes |
|
|
1348
|
-
| TEN-STABILITY-56 | feature: the supervisor forwards SIGHUP (terminal closed) to the detached worker process group, the same way it forwards SIGINT and SIGTERM, so closing the terminal does not orphan a paid worker | loki-ts/src/runner/worker_proc.ts, loki-ts/tests/engine10/supervisor_signal.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/supervisor_signal.test.ts -t "sighup" fails; green: passes |
|
|
1349
|
-
| TEN-SPEED-21 | enhancement: the 30-second session heartbeat lists untracked files once and shares the list between the shortstat and the signature | loki-ts/src/engine10/session.ts, loki-ts/tests/engine10/session.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/session.test.ts -t "heartbeat single ls-files" fails; green: passes |
|
|
1350
|
-
| TEN-SPEED-22 | enhancement: buildTestMap reads each JS test file once (the node:test probe and the reference scan share one read) and stops probing for node:test once node is marked | loki-ts/src/engine10/testmap.ts, loki-ts/tests/engine10/testmap.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/testmap.test.ts -t "single read per test file" fails; green: passes |
|
|
1351
|
-
| TEN-SPEED-23 | enhancement: repomap topLevelSymbols reads only the first MAX_SCAN_BYTES bytes of each file instead of the whole file | loki-ts/src/engine10/repomap.ts, loki-ts/tests/engine10/repomap.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/repomap.test.ts -t "bounded read" fails; green: passes |
|
|
1352
|
-
| TEN-QUALITY-33 | enhancement: enable noImplicitReturns in loki-ts/tsconfig.json and fix the one violation | loki-ts/tsconfig.json, loki-ts/src/contrib/slack_inbound.ts | LOW | red: cd loki-ts && bun run --bun tsc --noEmit --noImplicitReturns fails (exit non-zero); green: cd loki-ts && bun run typecheck && bun test tests/features/slack_inbound.test.ts passes |
|
|
1353
|
-
| TEN-QUALITY-34 | enhancement: handleSlackEvent takes payload as unknown and narrows it, removing the any | loki-ts/src/contrib/slack_inbound.ts, loki-ts/tests/features/slack_inbound.test.ts | LOW | red: cd loki-ts && bun test tests/features/slack_inbound.test.ts -t "malformed payload" fails; green: passes |
|
|
1354
|
-
| TEN-QUALITY-35 | enhancement: add optional stderrTail to SessionResult and drop the double-cast at both call sites | loki-ts/src/engine10/types.ts, loki-ts/src/engine10/stages/implement.ts, loki-ts/src/engine10/stages/plan.ts | LOW | red: cd loki-ts && grep -c "as unknown as { stderrTail" src/engine10/stages/implement.ts src/engine10/stages/plan.ts prints non-zero counts; green: both counts are 0 and cd loki-ts && bun run typecheck && bun test tests/engine10/implement.test.ts tests/engine10/plan.test.ts passes |
|
|
1355
|
-
| TEN-UX-47 | enhancement: loki start unknown --provider error lists the valid providers, as loki estimate already does | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | LOW | red: cd loki-ts && bun test tests/commands/start.test.ts -t "unknown provider lists valid" fails; green: passes |
|
|
1356
|
-
| TEN-QUALITY-36 | enhancement: characterization tests for fix_units effectiveDag, integrateWithFixes and fixEnabled (conflict fix, suite fix, MAX_FIX_UNITS cap, LOKI_GROUP_FIX_UNITS=0) | loki-ts/tests/features/speed/fix_units.test.ts (new: no test file imports fix_units.ts) | MEDIUM | red: cd loki-ts && test -f tests/features/speed/fix_units.test.ts fails; green: bun test tests/features/speed/fix_units.test.ts passes |
|
|
1357
|
-
| TEN-QUALITY-37 | enhancement: unit tests for compound_match linkedHits (compound keyword, suffix word rejected, vendored path skipped, import line required) | loki-ts/tests/e10ext/compound_match.test.ts (new: no test file imports compound_match.ts) | LOW | red: cd loki-ts && test -f tests/e10ext/compound_match.test.ts fails; green: bun test tests/e10ext/compound_match.test.ts passes |
|
|
1358
|
-
| TEN-QUALITY-38 | enhancement: unit tests for buildOpencodeArgv (default cli, LOKI_OPENCODE_CLI, LOKI_OPENCODE_MODEL, LOKI_OPENCODE_FLAGS whitespace split, commit hygiene prefix) | loki-ts/tests/runner/provider_opencode.test.ts (new: no test file imports provider_opencode.ts) | LOW | red: cd loki-ts && test -f tests/runner/provider_opencode.test.ts fails; green: bun test tests/runner/provider_opencode.test.ts passes |
|
|
1359
|
-
| TEN-QUALITY-39 | fix: impactedRefs returns no tests for a changed index.ts/index.js because the source is keyed as "index" while tests import the directory name | loki-ts/src/engine10/testmap.ts, loki-ts/tests/engine10/testmap.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/testmap.test.ts -t "index source maps to directory" fails; green: passes |
|
|
1360
|
-
| TEN-COST-56 | fix: usdFor returns NaN for non-finite or negative tokens and bills cached tokens in full when cached exceeds input; clamp to finite non-negative and cap cached at input | loki-ts/src/providers/price_table.ts, loki-ts/tests/providers/price_table.test.ts (new: see TEN-COST-54) | MEDIUM | red: cd loki-ts && bun test tests/providers/price_table.test.ts -t "usdFor clamps" fails; green: passes |
|
|
1361
|
-
| TEN-COST-57 | fix: loki estimate --model followed by another flag swallows that flag as the model id, and --model= (empty) is accepted; require a non-empty value that does not start with a dash | 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 "model needs a value" fails; green: passes |
|
|
1362
|
-
| TEN-COST-58 | fix: PRICE_TABLE prices gpt-4o-mini, gpt-4.1-mini, gpt-4.1-nano, gpt-5-mini and gpt-5-nano at the full gpt-4o, gpt-4.1 and gpt-5 rates, overstating cost and tripping the cost cap early; add their own entries from the vendor price page (cite the page in a comment) | loki-ts/src/providers/price_table.ts, loki-ts/tests/providers/price_table.test.ts (new: see TEN-COST-54) | LOW | red: cd loki-ts && bun test tests/providers/price_table.test.ts -t "mini and nano priced separately" fails; green: passes |
|
|
1363
|
-
| TEN-UX-48 | fix: loki start --provider, --session-model, --cost and --spec with a missing or empty value are silently ignored and the run starts with defaults; fail with "needs a value" like the text flags | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | LOW | red: cd loki-ts && bun test tests/commands/start.test.ts -t "value flags need a value" fails; green: passes |
|
|
1364
|
-
| TEN-UX-50 | fix: a PRD path containing a space (for example "My Docs/prd.md") that does not exist is treated as a brief and starts a paid run; treat a slash-containing token ending in a doc extension as a path even with spaces | 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 "spaced prd path" fails; green: passes |
|
|
1365
|
-
| TEN-DEPLOY-26 | fix: loki start --health-url, --domain, --destination and --env-file given with no value pass deployFlagError silently, so the deploy step is skipped or runs without the setting; report a missing value before the paid build | 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 flag missing value" fails; green: passes |
|
|
1366
|
-
| TEN-UX-51 | fix: a first-run folder that holds only .DS_Store (macOS Finder) is refused as non-empty; ignore .DS_Store and other OS metadata files when deciding the folder is empty | loki-ts/src/util/first_run_repo.ts, loki-ts/tests/engine10/preflight.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/preflight.test.ts -t "ds_store only folder" fails; green: passes |
|
|
1367
|
-
| TEN-STABILITY-57 | fix: appendRunOutcome is a read-modify-write, so two concurrent runs on one repo lose an outcome; serialize with a lock file or append-only records | loki-ts/src/runner/router/history_store.ts, loki-ts/tests/runner/router_history.test.ts | MEDIUM | red: cd loki-ts && bun test tests/runner/router_history.test.ts -t "concurrent append keeps all" fails; green: passes |
|
|
1368
|
-
| TEN-SECURITY-22 | fix: secure-scan silently skips untracked files larger than 1 MB, so a secret in a large new file passes the gate unreported; scan them line by line up to a hard cap and list anything above the cap as an explicit skipped file | loki-ts/src/util/secure_scan.ts, loki-ts/tests/util/secure_scan.test.ts | HIGH | red: cd loki-ts && bun test tests/util/secure_scan.test.ts -t "oversized untracked file" fails; green: passes |
|
|
1339
|
+
| TEN-SPEED-17 | feature: engine10 intake reuses the tree-keyed repomap and testmap cache (cachedRepoMap and cachedTestMap) instead of rebuilding both on every run, so a second run on an unchanged tree skips the repo walk and test detection | loki-ts/src/engine10/stages/intake.ts, loki-ts/tests/engine10/intake.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/intake.test.ts -t "tree cache" fails; green: passes | released v11.17.54 | Gap: cache.ts:66-67 defines cachedRepoMap and cachedTestMap but no src caller exists outside cache.ts; intake.ts:93-95 calls buildRepoMap and ctx.tests.detect every run; sizing.ts:40 and context.ts:46 read repomap2-<tree>.json that nothing writes |
|
|
1340
|
+
| TEN-SPEED-18 | feature: verify runs the selected test files with bounded concurrency (LOKI_E10_VERIFY_JOBS, default 1 so behavior is unchanged) and records checks in the original failed-first order; protect, cwd and interpreter handling stay per test | loki-ts/src/engine10/stages/verify.ts, loki-ts/tests/engine10/verify.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/verify.test.ts -t "verify jobs" fails; green: passes | released v11.17.54 | Gap: verify.ts:284 `for (const t of tests) { await runCheck(...) }` runs one test process at a time; no jobs knob exists. Serialize after any open verify.ts row |
|
|
1341
|
+
| TEN-SPEED-19 | feature: the Wall base-tree test run executes wall test files with bounded concurrency (LOKI_E10_BASE_JOBS, default 1) with the same pass/fail/not_run counts and lastNotRunFiles order | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall_runner.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/wall_runner.test.ts -t "base jobs" fails; green: passes | released v11.17.54 | Gap: wall.ts:39 `for (const f of files)` with a synchronous spawnSync per file in RealBaseTestRunner.run, one process at a time |
|
|
1342
|
+
| TEN-SPEED-20 | feature: a group suite-fix unit reuses the failing-suite output integrate already captured instead of re-running the whole suite (up to 600s) just to build the fix brief | loki-ts/src/features/speed/fix_units.ts, loki-ts/src/engine10/integrate.ts, loki-ts/tests/features/speed/fix_units.test.ts | MEDIUM | red: cd loki-ts && bun test tests/features/speed/fix_units.test.ts -t "suite fix reuses output" fails; green: passes | released v11.17.54 | Gap: fix_units.ts:41 suiteTail does spawnSync of the full test command (timeout 600000) after integrate already ran it; integrate.ts:22 IntegrateResult has no output field. Chain TEN-QUALITY-36, TEN-SPEED-20 (same test file); serialize after TEN-QUALITY-36 |
|
|
1343
|
+
| TEN-UX-45 | feature: loki start --dry-run parses and validates every flag, runs the preflight and prints the provider, model and cost cap it would use, then exits 0 without spending a token | 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 "dry-run" fails; green: passes | released v11.17.54 | Gap: grep -n "dry-run" loki-ts/src/commands/start.ts returns nothing, so --dry-run is an unknown flag today (start.ts:229 error); a first-run user cannot check setup without a paid run. Chain TEN-UX-48, TEN-UX-50, TEN-DEPLOY-26, TEN-UX-47, TEN-UX-46, TEN-UX-45 (same files); serialize after TEN-UX-46 |
|
|
1344
|
+
| TEN-UX-46 | feature: loki start unknown-flag error suggests the closest valid flag (suggestWord) and stops naming LOKI_SDK_LOOP internals to first-run users | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | LOW | red: cd loki-ts && bun test tests/commands/start.test.ts -t "unknown flag suggestion" fails; green: passes | released v11.17.54 | Gap: start.ts:229 prints "flag --bogus is not supported by the Bun (LOKI_SDK_LOOP) runner ... run without LOKI_SDK_LOOP" (reproduced with parseStartArgs(["x","--bogus"])); cli/registry.ts:346 exports suggestWord and start does not use it. Serialize after TEN-UX-47 |
|
|
1345
|
+
| TEN-COST-54 | feature: LOKI_PRICE_TABLE=<json file> overrides or extends PRICE_TABLE entries so a stale vendor price is fixable without a release; invalid file falls back to the built-in table | loki-ts/src/providers/price_table.ts, loki-ts/tests/providers/price_table.test.ts (new: no test file owns price_table.ts, grep of tests for priceFor and usdFor finds none) | LOW | red: cd loki-ts && bun test tests/providers/price_table.test.ts -t "price table override" fails; green: passes | released v11.17.54 | Gap: price_table.ts:7 comment says "Update as vendors publish new prices" and the table is a frozen constant (line 8) with no env override. Chain TEN-COST-56, TEN-COST-58, TEN-COST-54 (same files); serialize after TEN-COST-58 |
|
|
1346
|
+
| TEN-COST-55 | feature: opencode runs get a size-estimate cost record (estimated=true, cost_basis size-estimate) when the model id is priced, instead of an unmeasured cost, so the cost cap and loki cost cover all 5 providers | loki-ts/src/providers/provider_cost.ts, loki-ts/tests/engine10/budget_cap.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/budget_cap.test.ts -t "opencode estimate" fails; green: passes | released v11.17.54 | Gap: provider_cost.ts:71 ESTIMATED_PROVIDERS is codex, cline, aider only, so buildProviderCost returns null for opencode (line 86); provider_opencode.ts:5-7 states cost is not measured |
|
|
1347
|
+
| TEN-QUALITY-32 | feature: impactedRefs maps a changed Python package __init__.py and Rust mod.rs to the package directory name so tests that import the package are selected | loki-ts/src/engine10/testmap.ts, loki-ts/tests/engine10/testmap.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/testmap.test.ts -t "package init maps to directory" fails; green: passes | released v11.17.54 | Gap: reproduced on a repo with pkg/search/__init__.py and tests/test_search.py (from pkg.search import a): buildTestMap yields sourceRefs {search:[tests/test_search.py]} and impactedRefs(map,["pkg/search/__init__.py"]) returns []; testmap.ts:178 keys on basename of the file. Chain TEN-QUALITY-39, TEN-QUALITY-32, TEN-SPEED-22 (same files); serialize after TEN-QUALITY-39 |
|
|
1348
|
+
| TEN-STABILITY-56 | feature: the supervisor forwards SIGHUP (terminal closed) to the detached worker process group, the same way it forwards SIGINT and SIGTERM, so closing the terminal does not orphan a paid worker | loki-ts/src/runner/worker_proc.ts, loki-ts/tests/engine10/supervisor_signal.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/supervisor_signal.test.ts -t "sighup" fails; green: passes | released v11.17.54 | Gap: grep -rn SIGHUP loki-ts/src returns nothing; worker_proc.ts:35-36 registers only SIGINT and SIGTERM and spawns the worker detached (line 17) so a SIGHUP kills the supervisor and leaves the worker group running |
|
|
1349
|
+
| TEN-SPEED-21 | enhancement: the 30-second session heartbeat lists untracked files once and shares the list between the shortstat and the signature | loki-ts/src/engine10/session.ts, loki-ts/tests/engine10/session.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/session.test.ts -t "heartbeat single ls-files" fails; green: passes | released v11.17.54 | Gap: session.ts:88 (diffShortstat) and session.ts:104 (diffSignature) each run safeGit ls-files -z --others --exclude-standard on the same tick |
|
|
1350
|
+
| TEN-SPEED-22 | enhancement: buildTestMap reads each JS test file once (the node:test probe and the reference scan share one read) and stops probing for node:test once node is marked | loki-ts/src/engine10/testmap.ts, loki-ts/tests/engine10/testmap.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/testmap.test.ts -t "single read per test file" fails; green: passes | released v11.17.54 | Gap: testmap.ts:115 readText(full) for every JS test file in the first loop and testmap.ts:143 readText(join(root, t.path)) again in the tests loop. Serialize after TEN-QUALITY-32 |
|
|
1351
|
+
| TEN-SPEED-23 | enhancement: repomap topLevelSymbols reads only the first MAX_SCAN_BYTES bytes of each file instead of the whole file | loki-ts/src/engine10/repomap.ts, loki-ts/tests/engine10/repomap.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/repomap.test.ts -t "bounded read" fails; green: passes | released v11.17.54 | Gap: repomap.ts:44 `readFileSync(absPath, "utf8").slice(0, MAX_SCAN_BYTES)` loads the full file (and decodes it) before slicing |
|
|
1352
|
+
| TEN-QUALITY-33 | enhancement: enable noImplicitReturns in loki-ts/tsconfig.json and fix the one violation | loki-ts/tsconfig.json, loki-ts/src/contrib/slack_inbound.ts | LOW | red: cd loki-ts && bun run --bun tsc --noEmit --noImplicitReturns fails (exit non-zero); green: cd loki-ts && bun run typecheck && bun test tests/features/slack_inbound.test.ts passes | released v11.17.54 | Gap: tsc --noImplicitReturns reports exactly 1 error, slack_inbound.ts(217,10) TS7030 in the slackPoster async lambda; tsconfig.json has strict and noUncheckedIndexedAccess (line 9) but not noImplicitReturns. Chain TEN-QUALITY-33, TEN-QUALITY-34 (same file) |
|
|
1353
|
+
| TEN-QUALITY-34 | enhancement: handleSlackEvent takes payload as unknown and narrows it, removing the any | loki-ts/src/contrib/slack_inbound.ts, loki-ts/tests/features/slack_inbound.test.ts | LOW | red: cd loki-ts && bun test tests/features/slack_inbound.test.ts -t "malformed payload" fails; green: passes | released v11.17.54 | Gap: slack_inbound.ts:100 `payload: any`. Serialize after TEN-QUALITY-33 |
|
|
1354
|
+
| TEN-QUALITY-35 | enhancement: add optional stderrTail to SessionResult and drop the double-cast at both call sites | loki-ts/src/engine10/types.ts, loki-ts/src/engine10/stages/implement.ts, loki-ts/src/engine10/stages/plan.ts | LOW | red: cd loki-ts && grep -c "as unknown as { stderrTail" src/engine10/stages/implement.ts src/engine10/stages/plan.ts prints non-zero counts; green: both counts are 0 and cd loki-ts && bun run typecheck && bun test tests/engine10/implement.test.ts tests/engine10/plan.test.ts passes | released v11.17.54 | Gap: implement.ts:180 and plan.ts:101 cast `session as unknown as { stderrTail?: string }`; types.ts:98 SessionResult lacks the field that session.ts:176 returns |
|
|
1355
|
+
| TEN-UX-47 | enhancement: loki start unknown --provider error lists the valid providers, as loki estimate already does | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | LOW | red: cd loki-ts && bun test tests/commands/start.test.ts -t "unknown provider lists valid" fails; green: passes | released v11.17.54 | Gap: start.ts:292 prints only "unknown --provider 'gemini'"; cost_preview.ts:144 exports VALID_PROVIDERS and cost_preview.ts:161 lists them. Serialize after TEN-DEPLOY-26 |
|
|
1356
|
+
| TEN-QUALITY-36 | enhancement: characterization tests for fix_units effectiveDag, integrateWithFixes and fixEnabled (conflict fix, suite fix, MAX_FIX_UNITS cap, LOKI_GROUP_FIX_UNITS=0) | loki-ts/tests/features/speed/fix_units.test.ts (new: no test file imports fix_units.ts) | MEDIUM | red: cd loki-ts && test -f tests/features/speed/fix_units.test.ts fails; green: bun test tests/features/speed/fix_units.test.ts passes | released v11.17.54 | Gap: fix_units.ts has no direct test; only the LOKI_GROUP_FIX_UNITS name appears in seal_group.test.ts. Chain TEN-QUALITY-36, TEN-SPEED-20 |
|
|
1357
|
+
| TEN-QUALITY-37 | enhancement: unit tests for compound_match linkedHits (compound keyword, suffix word rejected, vendored path skipped, import line required) | loki-ts/tests/e10ext/compound_match.test.ts (new: no test file imports compound_match.ts) | LOW | red: cd loki-ts && test -f tests/e10ext/compound_match.test.ts fails; green: bun test tests/e10ext/compound_match.test.ts passes | released v11.17.54 | Gap: compound_match.ts:45 linkedHits is covered only indirectly through already_done tests |
|
|
1358
|
+
| TEN-QUALITY-38 | enhancement: unit tests for buildOpencodeArgv (default cli, LOKI_OPENCODE_CLI, LOKI_OPENCODE_MODEL, LOKI_OPENCODE_FLAGS whitespace split, commit hygiene prefix) | loki-ts/tests/runner/provider_opencode.test.ts (new: no test file imports provider_opencode.ts) | LOW | red: cd loki-ts && test -f tests/runner/provider_opencode.test.ts fails; green: bun test tests/runner/provider_opencode.test.ts passes | released v11.17.54 | Gap: provider_opencode.ts:25 buildOpencodeArgv is documented "unit-testable without spawning" yet grep of loki-ts/tests and tests/ finds no reference |
|
|
1359
|
+
| TEN-QUALITY-39 | fix: impactedRefs returns no tests for a changed index.ts/index.js because the source is keyed as "index" while tests import the directory name | loki-ts/src/engine10/testmap.ts, loki-ts/tests/engine10/testmap.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/testmap.test.ts -t "index source maps to directory" fails; green: passes | released v11.17.54 | Gap: reproduced on a repo with src/search/index.ts and tests/search.test.ts (import from "../src/search"): buildTestMap finds the bun runner and the test, impactedRefs(map,["src/search/index.ts"]) returns []; testmap.ts:178 uses basename(rel, extname(rel)) = "index", so the verifier under-selects tests. Chain TEN-QUALITY-39, TEN-QUALITY-32, TEN-SPEED-22 (same files) |
|
|
1360
|
+
| TEN-COST-56 | fix: usdFor returns NaN for non-finite or negative tokens and bills cached tokens in full when cached exceeds input; clamp to finite non-negative and cap cached at input | loki-ts/src/providers/price_table.ts, loki-ts/tests/providers/price_table.test.ts (new: see TEN-COST-54) | MEDIUM | red: cd loki-ts && bun test tests/providers/price_table.test.ts -t "usdFor clamps" fails; green: passes | released v11.17.54 | Gap: reproduced usdFor("gpt-5",NaN,10) = NaN and usdFor("gpt-5",100,0,500) = 0.000063 (500 cached tokens billed against 100 input); price_table.ts:40-45; provider_cost.ts:94 feeds it. Chain TEN-COST-56, TEN-COST-58, TEN-COST-54 (same files) |
|
|
1361
|
+
| TEN-COST-57 | fix: loki estimate --model followed by another flag swallows that flag as the model id, and --model= (empty) is accepted; require a non-empty value that does not start with a dash | 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 "model needs a value" fails; green: passes | released v11.17.54 | Gap: reproduced runEstimate(["--provider","codex","--model","--json"]) returns 0 and prints text (--json consumed as the model); runEstimate(["--provider","codex","--model="]) returns 0; cost_preview.ts:155 `args[++i]` only rejects an absent value, line 157 has no empty check |
|
|
1362
|
+
| TEN-COST-58 | fix: PRICE_TABLE prices gpt-4o-mini, gpt-4.1-mini, gpt-4.1-nano, gpt-5-mini and gpt-5-nano at the full gpt-4o, gpt-4.1 and gpt-5 rates, overstating cost and tripping the cost cap early; add their own entries from the vendor price page (cite the page in a comment) | loki-ts/src/providers/price_table.ts, loki-ts/tests/providers/price_table.test.ts (new: see TEN-COST-54) | LOW | red: cd loki-ts && bun test tests/providers/price_table.test.ts -t "mini and nano priced separately" fails; green: passes | released v11.17.54 | Gap: priceFor uses longest-substring match (price_table.ts:28-32) and the table (lines 11-13) has no mini or nano keys, so "gpt-5-mini" resolves to the "gpt-5" entry. Chain TEN-COST-56, TEN-COST-58, TEN-COST-54; serialize after TEN-COST-56 |
|
|
1363
|
+
| TEN-UX-48 | fix: loki start --provider, --session-model, --cost and --spec with a missing or empty value are silently ignored and the run starts with defaults; fail with "needs a value" like the text flags | loki-ts/src/commands/start.ts, loki-ts/tests/commands/start.test.ts | LOW | red: cd loki-ts && bun test tests/commands/start.test.ts -t "value flags need a value" fails; green: passes | released v11.17.54 | Gap: reproduced parseStartArgs(["x","--provider"]), ["x","--session-model"], ["x","--cost"], ["x","--spec"] all return {prdPath:"x"} with no error and ["x","--provider=","--simple"] yields provider ""; start.ts:57 TEXT_VALUE_FLAGS lists only 6 free-text flags. First in the start.ts chain |
|
|
1364
|
+
| TEN-UX-50 | fix: a PRD path containing a space (for example "My Docs/prd.md") that does not exist is treated as a brief and starts a paid run; treat a slash-containing token ending in a doc extension as a path even with spaces | 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 "spaced prd path" fails; green: passes | released v11.17.54 | Gap: reproduced missingPrdMessage(["My Docs/prd.md"],"My Docs/prd.md",()=>false) = null while "docs/spec.pdf" and "prd.md" give "PRD file not found"; start.ts:384 pathShaped rejects any \s. Serialize after TEN-UX-48 |
|
|
1365
|
+
| TEN-DEPLOY-26 | fix: loki start --health-url, --domain, --destination and --env-file given with no value pass deployFlagError silently, so the deploy step is skipped or runs without the setting; report a missing value before the paid build | 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 flag missing value" fails; green: passes | released v11.17.54 | Gap: reproduced deployFlagError(["x","--health-url"]), ["x","--destination"], ["x","--env-file"] and ["x","--domain","--simple"] all return null; start.ts:437-447 val() returns undefined for an absent or dash-leading value and the checks only run when val is defined. Serialize after TEN-UX-50 |
|
|
1366
|
+
| TEN-UX-51 | fix: a first-run folder that holds only .DS_Store (macOS Finder) is refused as non-empty; ignore .DS_Store and other OS metadata files when deciding the folder is empty | loki-ts/src/util/first_run_repo.ts, loki-ts/tests/engine10/preflight.test.ts | LOW | red: cd loki-ts && bun test tests/engine10/preflight.test.ts -t "ds_store only folder" fails; green: passes | released v11.17.54 | Gap: reproduced initEmptyRepo(dirWithOnly.DS_Store) returns {fatal:"not a git repository ... "}; first_run_repo.ts:12 `readdirSync(dir).length === 0` counts dotfiles |
|
|
1367
|
+
| TEN-STABILITY-57 | fix: appendRunOutcome is a read-modify-write, so two concurrent runs on one repo lose an outcome; serialize with a lock file or append-only records | loki-ts/src/runner/router/history_store.ts, loki-ts/tests/runner/router_history.test.ts | MEDIUM | red: cd loki-ts && bun test tests/runner/router_history.test.ts -t "concurrent append keeps all" fails; green: passes | released v11.17.54 | Gap: history_store.ts:70 reads the history, appends in memory, then renames a pid-named temp file over the target (lines 73-77); the atomic rename prevents truncation but not a lost update between two processes |
|
|
1368
|
+
| TEN-SECURITY-22 | fix: secure-scan silently skips untracked files larger than 1 MB, so a secret in a large new file passes the gate unreported; scan them line by line up to a hard cap and list anything above the cap as an explicit skipped file | loki-ts/src/util/secure_scan.ts, loki-ts/tests/util/secure_scan.test.ts | HIGH | red: cd loki-ts && bun test tests/util/secure_scan.test.ts -t "oversized untracked file" fails; green: passes | released v11.17.54 | Gap: secure_scan.ts:49 MAX_ADDED_FILE_BYTES = 1_000_000 and secure_scan.ts:237 `if (!st.isFile() \|\| st.size > MAX_ADDED_FILE_BYTES) continue;` drops the file with no finding, no error and no skipped count; grep for skipped or unscanned in the file finds nothing |
|
|
1369
|
+
| TEN-COST-59 | fix: parseCapUsd accepts ".5" and "5." as dollar caps instead of returning null (which silently drops the cap to the default) | loki-ts/src/e10ext/budget_cap.ts, loki-ts/tests/engine10/budget_cap.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/budget_cap.test.ts -t "bare decimal cap" fails; green: passes | ready@2026-10-17T12:00Z | Gap: budget_cap.ts parseCapUsd regex ^\$?\d+(\.\d+)?$ rejects .5 and 5.; probed: both return null. Chain COST-59, COST-60 (same file); serialize after none |
|
|
1370
|
+
| TEN-COST-60 | fix: hasApiKey also counts OPENROUTER_API_KEY and LOKI_MODEL_API_KEY so a run billed through a model route gets a cap instead of source subscription with usd 0 (no cap) | loki-ts/src/e10ext/budget_cap.ts, loki-ts/tests/engine10/budget_cap.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/budget_cap.test.ts -t "route key cap" fails; green: passes | ready@2026-10-17T12:00Z | Gap: budget_cap.ts hasApiKey checks only ANTHROPIC_API_KEY and OPENAI_API_KEY; model_routes.ts:17 and :49 read the other two token vars; probed: only OPENROUTER_API_KEY set resolves {usd:0, source:subscription}. Chain COST-59, COST-60 (same file); serialize after COST-59 |
|
|
1371
|
+
| TEN-COST-61 | fix: resolveRunCapS reads the first loki.yaml/loki.yml like resolveCap and cost.profile do, not the last | loki-ts/src/util/run_cap.ts, loki-ts/tests/engine10/fc21_cap.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/fc21_cap.test.ts -t "yaml precedence" fails; green: passes | ready@2026-10-17T12:00Z | Gap: run_cap.ts resolveRunCapS uses texts[texts.length-1] while resolveCap and start.ts cost.profile use the first, so one repo with both files gets two different caps |
|
|
1372
|
+
| TEN-COST-62 | feature: priorFor returns a cost prior for opus models so the pre-run estimate is shown for opus-routed runs instead of nothing | loki-ts/src/runner/router/cost_preview.ts, loki-ts/tests/runner/cost_preview.test.ts | MEDIUM | red: cd loki-ts && bun test tests/runner/cost_preview.test.ts -t "opus prior" fails; green: passes | ready@2026-10-17T12:00Z | Gap: cost_preview.ts:38 tier is only haiku or sonnet, else null, so a start with an opus model prints no estimate |
|
|
1373
|
+
| TEN-SECURITY-23 | fix: redact GOOGLE_KEY rule requires the AIza prefix shape so ordinary identifiers starting with AI are not rewritten in logs and receipts | loki-ts/src/util/redact.ts, loki-ts/tests/util/redact.test.ts | HIGH | red: cd loki-ts && bun test tests/util/redact.test.ts -t "google key shape" fails; green: passes | ready@2026-10-17T12:00Z | Gap: redact.ts GOOGLE_KEY /AI[a-zA-Z0-9_-]{30,}/g matches any 32+ char identifier starting AI (over-redaction corrupts evidence). Chain SECURITY-23, 24, 25 (same file); serialize after none |
|
|
1374
|
+
| TEN-SECURITY-24 | feature: redact adds Slack webhook URLs, sk_test_ and rk_ Stripe keys, and whsec_ webhook secrets | loki-ts/src/util/redact.ts, loki-ts/tests/util/redact.test.ts | HIGH | red: cd loki-ts && bun test tests/util/redact.test.ts -t "slack stripe redact" fails; green: passes | ready@2026-10-17T12:00Z | Gap: redact.ts RULES has no pattern for hooks.slack.com/services, sk_test_, or whsec_; a pasted token reaches events and receipts unredacted. Chain SECURITY-23, 24, 25; serialize after SECURITY-23 |
|
|
1375
|
+
| TEN-SECURITY-25 | feature: redact masks the value of key=value and key: value assignments for password, secret, token and api_key names | loki-ts/src/util/redact.ts, loki-ts/tests/util/redact.test.ts | HIGH | red: cd loki-ts && bun test tests/util/redact.test.ts -t "assignment redact" fails; green: passes | ready@2026-10-17T12:00Z | Gap: redact.ts RULES match only token-shaped literals; password=hunter2 passes through unchanged. Chain SECURITY-23, 24, 25; serialize after SECURITY-24 |
|
|
1376
|
+
| TEN-STABILITY-58 | fix: yamlKey reads flow-style maps such as budgets: { per_run: 5 } instead of ignoring them (the default 100 dollar cap then applies silently) | loki-ts/src/util/yaml_key.ts, loki-ts/tests/util/yaml_key.test.ts | MEDIUM | red: cd loki-ts && bun test tests/util/yaml_key.test.ts -t "flow style" fails; green: passes | ready@2026-10-17T12:00Z | Gap: yaml_key.ts yamlKey handles block style only; probed: flow style returns undefined so resolve falls to the default cap |
|
|
1377
|
+
| TEN-STABILITY-59 | fix: loki undo validates the run id before the LOKI_UNDO gate so a bad id reports usage, not the gate message | loki-ts/src/commands/undo.ts, loki-ts/tests/commands/undo.test.ts | MEDIUM | red: cd loki-ts && bun test tests/commands/undo.test.ts -t "undo id before gate" fails; green: passes | ready@2026-10-17T12:00Z | Gap: undo.ts runUndo checks the LOKI_UNDO gate (line 239) before loadPlan validates the run id (isRunId, line 44) |
|
|
1378
|
+
| TEN-STABILITY-60 | enhancement: pauseTimeoutMs warns once on stderr when the pause timeout env is set but not a positive number, then uses the default | loki-ts/src/util/run_control.ts, loki-ts/tests/util/run_control.test.ts | MEDIUM | red: cd loki-ts && bun test tests/util/run_control.test.ts -t "pause timeout warn" fails; green: passes | ready@2026-10-17T12:00Z | Gap: run_control.ts pauseTimeoutMs falls back silently on garbage. Chain STABILITY-60, 61 (same file); serialize after none |
|
|
1379
|
+
| TEN-STABILITY-61 | enhancement: runControlBoundary records reason timeout_abandon on the cancel event when a pause expires, distinct from a user cancel | loki-ts/src/util/run_control.ts, loki-ts/tests/util/run_control.test.ts | MEDIUM | red: cd loki-ts && bun test tests/util/run_control.test.ts -t "timeout abandon event" fails; green: passes | ready@2026-10-17T12:00Z | Gap: run_control.ts runControlBoundary emits identical cancel events for a user cancel and a timeout abandon. Chain STABILITY-60, 61; serialize after STABILITY-60 |
|
|
1380
|
+
| TEN-STABILITY-62 | fix: queue add rejects issue number 0 for owner/repo#0 and bare 0 | 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 "queue zero issue" fails; green: passes | ready@2026-10-17T12:00Z | Gap: queue.ts accepts queue add 0 and a/b#0; probed: both exit 0 and enqueue an unrunnable item |
|
|
1381
|
+
| TEN-STABILITY-63 | fix: engine10 supervisor main exits 2 with a usage line when --spec or --max-cost has no value, instead of treating it as an empty string | loki-ts/src/engine10/supervisor.ts, loki-ts/tests/engine10/supervisor_signal.test.ts | MEDIUM | red: cd loki-ts && bun test tests/engine10/supervisor_signal.test.ts -t "missing flag value" fails; green: passes | ready@2026-10-17T12:00Z | Gap: supervisor.ts main arg parser turns --spec and --max-cost with a missing value into ""; the git-repo check then runs before resolveCap so the user sees an unrelated error |
|
|
1382
|
+
| TEN-STABILITY-65 | fix: internal handoff requires an explicit positive consecutive-failure count instead of defaulting a missing count to 0 | loki-ts/src/commands/internal_phase1.ts, loki-ts/tests/commands/internal_phase1.test.ts | LOW | red: cd loki-ts && bun test tests/commands/internal_phase1.test.ts -t "handoff count" fails; green: passes | ready@2026-10-17T12:00Z | Gap: internal_phase1.ts runHandoff: parseInt(argv[1] ?? "0") makes a missing count 0 and Number.isFinite accepts it and negatives |
|
|
1383
|
+
| TEN-UX-52 | fix: loki provider show with an unknown provider exits 2 and lists valid providers | loki-ts/src/commands/provider.ts, loki-ts/tests/commands/provider.test.ts | LOW | red: cd loki-ts && bun test tests/commands/provider.test.ts -t "unknown provider" fails; green: passes | ready@2026-10-17T12:00Z | Gap: provider.ts runProviderShow accepts an unknown provider with exit 0 |
|
|
1384
|
+
| TEN-UX-53 | enhancement: loki --version and loki version reject extra positional arguments with exit 2 | 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 "version extra args" fails; green: passes | ready@2026-10-17T12:00Z | Gap: version.ts ignores extra positionals; probed: loki version bogus prints the version and exits 0 |
|
|
1385
|
+
| TEN-UX-54 | fix: loki stats writes the Unknown option message to stderr, not stdout, so --json consumers get clean output | 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 "stats unknown to stderr" fails; green: passes | ready@2026-10-17T12:00Z | Gap: stats.ts computeStats returns the Unknown option text as stdout with exitCode 2 (lines 491-497) |
|
|
1386
|
+
| TEN-UX-55 | feature: preflight fails early with a one-line fix when the repo directory is not writable | 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 "repo writable" fails; green: passes | ready@2026-10-17T12:00Z | Gap: preflight.ts checkPreflight has no writability probe, so a read-only checkout fails mid-run on the first write. Chain ADOPTION-34, UX-55 (same file); serialize after ADOPTION-34 |
|
|
1387
|
+
| TEN-ADOPTION-34 | feature: preflight probes login state for codex, cline, aider and opencode like it does for claude, so loki start names the missing login before spending | 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 "provider login probe" fails; green: passes | ready@2026-10-17T12:00Z | Gap: preflight.ts checkPreflight has login probes only for claude. Chain ADOPTION-34, UX-55; serialize after none |
|
|
1388
|
+
| TEN-UX-56 | fix: loki start rejects a repeated single-value flag (--cap, --provider) with exit 2 instead of silently using the first | 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 "duplicate flag" fails; green: passes | ready@2026-10-17T12:00Z | Gap: start.ts argVal is first-occurrence-wins, so loki start p.md --cap 1 --cap 50 runs with 1 and says nothing. Serialize after the AQ start.ts chain (TEN-UX-48, 50, DEPLOY-26, UX-47, 46, 45) |
|
|
1389
|
+
| TEN-SPEED-24 | enhancement: run_status pickRun orders runs by events.jsonl mtime and reads only the newest, instead of reading every run's events file | loki-ts/src/commands/run_status.ts, loki-ts/tests/commands/run_status.test.ts | MEDIUM | red: cd loki-ts && bun test tests/commands/run_status.test.ts -t "pickRun mtime" fails; green: passes | ready@2026-10-17T12:00Z | Gap: run_status.ts pickRun reads every run's events.jsonl, so loki status gets slower with each run |
|
|
1390
|
+
| TEN-UX-57 | fix: loki status rejects unknown flags that follow a valid one (--json --bogus) with exit 1 like a leading unknown flag | loki-ts/src/commands/status.ts, loki-ts/tests/commands/status.test.ts | LOW | red: cd loki-ts && bun test tests/commands/status.test.ts -t "status trailing flag" fails; green: passes | ready@2026-10-17T12:00Z | Gap: status.ts runStatus returns on the first recognised flag (lines 1038-1047), so later flags are never checked |
|
|
1391
|
+
| TEN-ADOPTION-35 | enhancement: doctor --fix seeds the default provider from the first installed provider CLI instead of hardcoding claude | loki-ts/src/commands/doctor_fix.ts, loki-ts/tests/commands/doctor.test.ts | MEDIUM | red: cd loki-ts && bun test tests/commands/doctor.test.ts -t "seed provider" fails; green: passes | ready@2026-10-17T12:00Z | Gap: doctor_fix.ts step 2 writes {provider: claude} even when only codex is installed. Chain ADOPTION-35, UX-58 (same file); serialize after none |
|
|
1392
|
+
| TEN-UX-58 | enhancement: doctor --fix backs up an invalid .loki/config/settings.json and rewrites defaults when consent is given, instead of only printing a manual line | loki-ts/src/commands/doctor_fix.ts, loki-ts/tests/commands/doctor.test.ts | MEDIUM | red: cd loki-ts && bun test tests/commands/doctor.test.ts -t "repair settings" fails; green: passes | ready@2026-10-17T12:00Z | Gap: doctor_fix.ts lines 120-124 push a manual line for invalid JSON and never repair it. Chain ADOPTION-35, UX-58; serialize after ADOPTION-35 |
|
|
1393
|
+
| TEN-QUALITY-40 | enhancement: doctor.ts uses one shared version comparator instead of three copies | loki-ts/src/commands/doctor.ts, loki-ts/tests/commands/doctor.test.ts | LOW | red: cd loki-ts && bun test tests/commands/doctor.test.ts -t "one semver compare" fails; green: passes | ready@2026-10-17T12:00Z | Gap: doctor.ts has three hand-rolled comparators (lines 98, 318, 567); extend-never-duplicate. Serialize after ADOPTION-35, UX-58 (shared doctor.test.ts) |
|
|
1394
|
+
| TEN-SPEED-25 | fix: resolveLatest caches a failed registry fetch for a short period so an offline machine does not wait on the network every command | loki-ts/src/util/update_check.ts, loki-ts/tests/util/update_check.test.ts | LOW | red: cd loki-ts && bun test tests/util/update_check.test.ts -t "negative cache" fails; green: passes | ready@2026-10-17T12:00Z | Gap: update_check.ts resolveLatest returns null at the failed fetch without writeCache (line 129-130), so offline runs retry each time. Chain SPEED-25, DEPLOY-27 (same file); serialize after none |
|
|
1395
|
+
| TEN-DEPLOY-27 | feature: updateCommandFor returns pnpm and yarn global upgrade hints for pnpm and yarn installs | loki-ts/src/util/update_check.ts, loki-ts/tests/util/update_check.test.ts | LOW | red: cd loki-ts && bun test tests/util/update_check.test.ts -t "pnpm yarn hint" fails; green: passes | ready@2026-10-17T12:00Z | Gap: update_check.ts updateCommandFor knows brew, bun and npm paths only; pnpm and yarn installs get the bun hint. Chain SPEED-25, DEPLOY-27; serialize after SPEED-25 |
|
|
1396
|
+
| TEN-GATES-31 | fix: policyGate with LOKI_POLICY_REQUIRE_NODE=0 and no node says policy was NOT evaluated in the allow reason so prGate output shows it | loki-ts/src/util/run_outputs.ts, loki-ts/tests/engine10/policy_gate.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/policy_gate.test.ts -t "policy not evaluated" fails; green: passes | ready@2026-10-17T12:00Z | Gap: run_outputs.ts:449 returns allow when the env opt-out is set and node is missing; the reason is easy to miss. Chain GATES-31, 32 (same file); serialize after none |
|
|
1397
|
+
| TEN-GATES-32 | fix: policyGate reports a check.js timeout as a timeout, not as node being unavailable | loki-ts/src/util/run_outputs.ts, loki-ts/tests/engine10/policy_gate.test.ts | HIGH | red: cd loki-ts && bun test tests/engine10/policy_gate.test.ts -t "policy timeout reason" fails; green: passes | ready@2026-10-17T12:00Z | Gap: run_outputs.ts:452-453 spawnSync timeout 30000 sets r.error and the deny reason says node is unavailable. Chain GATES-31, 32; serialize after GATES-31 |
|
|
1398
|
+
| TEN-ADOPTION-36 | fix: loki issues run --limit and --parallel accept only plain decimal digits (reject 1e1 and 0x10) | 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 "strict int flags" fails; green: passes | ready@2026-10-17T12:00Z | Gap: issues_run.ts:96 Number(val()) accepts 1e1 and 0x10 as integers. Serialize after TEN-STABILITY-54 (same file) |
|
package/docs/v10/PROGRESS.md
CHANGED
|
@@ -2539,3 +2539,6 @@ v11.17.21 published (Release success on 462fbc40a; npm latest 11.17.21, next 11.
|
|
|
2539
2539
|
|
|
2540
2540
|
## 2026-10-17T13:56Z (CoS) v11.17.53
|
|
2541
2541
|
- Wave AP released (30 rows, 19 chains, each reviewer APPROVE by SHA); evidence in ~/loki-ci-logs/ap-check.log (tsc, bun test, secure-scan, drift guards, cost_claim pytest).
|
|
2542
|
+
|
|
2543
|
+
## 2026-10-17T14:35Z (CoS) v11.17.54
|
|
2544
|
+
- Wave AQ released (30 rows, 19 chains, every reviewer APPROVE by SHA, ancestry checked) plus Q18-03e (opus round 5 APPROVE e41ef40b2 after 5 BLOCK rounds); evidence in ~/loki-ci-logs/aq-check.log.
|