loki-mode 9.65.0 → 9.67.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/completion-council.sh +18 -1
- package/autonomy/lib/done-recognition.sh +12 -0
- package/autonomy/loki +101 -9
- package/autonomy/run.sh +38 -7
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/ARCHITECT-CUTS.md +89 -0
- package/docs/v10/BOARD.md +52 -31
- package/docs/v10/METRICS.md +57 -0
- package/docs/v10/PROGRESS.md +9 -0
- package/loki-ts/dist/loki.js +2 -2
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-Oyx-w2Ch.js → AdminPage-ChUvLzkF.js} +1 -1
- package/web-app/dist/assets/{Avatar-D60m65JB.js → Avatar-Dpy96tAc.js} +1 -1
- package/web-app/dist/assets/{Badge-CqfZNaem.js → Badge-BOHHYZTu.js} +1 -1
- package/web-app/dist/assets/{Button-BqjzE4fz.js → Button-B_XqEF7a.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-Czk7o_ou.js → CockpitPage-C0z5QwNJ.js} +1 -1
- package/web-app/dist/assets/{ComparePage-BEfTrTb1.js → ComparePage-KWL6acQk.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BrLk5nkO.js → ErrorBoundary-BbyBJ4ZP.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-9vEpi5ir.js → EvidenceReceiptPanel-Btblkwfr.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-D6izZx0w.js → GitHubIssuesPanel-7Bi1t04Q.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-BTkG2FgA.js → GitHubPRsPanel-BxZtNprq.js} +1 -1
- package/web-app/dist/assets/{HomePage-nsr4kpN1.js → HomePage-BxDh3-CD.js} +1 -1
- package/web-app/dist/assets/{LoginPage-BVblQrr9.js → LoginPage-DpXq4rQe.js} +1 -1
- package/web-app/dist/assets/{MagicPage-CmnSyLq7.js → MagicPage-DP2k0ioE.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-BVfwU81j.js → MetricsPage-Dus04BUR.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-AYQ6uqqI.js → NotFoundPage--54yr9Cy.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-DMnbw9X9.js → ProjectPage-Cs6LOI7R.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-CNVTAF2N.js → ProjectsPage-5cpa0X1d.js} +1 -1
- package/web-app/dist/assets/SettingsPage-Duc5ApRj.js +10 -0
- package/web-app/dist/assets/{ShowcasePage-2dBCjLXn.js → ShowcasePage-C1wrPZgl.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-Djo6IE4u.js → SystemSettingsPage-CoD3LARj.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-CY8p-yxD.js → TeamsPage-GuQ4YDV5.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-B6iFgH6t.js → TemplatesPage-CvWecmzl.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-B3yzZe-h.js → TerminalOutput-DFZw34kD.js} +1 -1
- package/web-app/dist/assets/{activity-CNfAjtRv.js → activity-BvHkXBYj.js} +1 -1
- package/web-app/dist/assets/{bell-CMETsHPH.js → bell-Bw2j-HI7.js} +1 -1
- package/web-app/dist/assets/{bot-C9kXvk1i.js → bot-BRuEmshQ.js} +1 -1
- package/web-app/dist/assets/{check-BRK-zLB5.js → check-B5uToWdF.js} +1 -1
- package/web-app/dist/assets/{chevron-left-CxI5uD4g.js → chevron-left-D-tXeEPI.js} +1 -1
- package/web-app/dist/assets/{circle-alert-CVFRPWpv.js → circle-alert-p3-Bg3sx.js} +1 -1
- package/web-app/dist/assets/{clock-CLYV8a_x.js → clock-CJc_91vp.js} +1 -1
- package/web-app/dist/assets/{cloud-CiISiIOa.js → cloud-lhmojUN8.js} +1 -1
- package/web-app/dist/assets/{code-xml-DHsgqwV-.js → code-xml-DMvQ2jw1.js} +1 -1
- package/web-app/dist/assets/{database-DbvUqtz3.js → database-EdwkplCN.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-Ct0lRPHw.js → dollar-sign-BQiPo9Co.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-D1sjFEh7.js → file-code-corner-CXUzs2z1.js} +1 -1
- package/web-app/dist/assets/{file-plus-DnmX18Fi.js → file-plus-hS0xkTL5.js} +1 -1
- package/web-app/dist/assets/{globe-bSpDNgoA.js → globe-B6Xk69Fj.js} +1 -1
- package/web-app/dist/assets/{hammer-Bj41Kvlq.js → hammer-B_evoVEr.js} +1 -1
- package/web-app/dist/assets/{index-CxajNJVu.js → index-XZrgDphJ.js} +2 -2
- package/web-app/dist/assets/{layers-BNtBwYER.js → layers-Bb295b4u.js} +1 -1
- package/web-app/dist/assets/{loader-circle-YY_VZofG.js → loader-circle-C8cKZhjP.js} +1 -1
- package/web-app/dist/assets/{lock-rpjEPVoC.js → lock-DcC9B8sE.js} +1 -1
- package/web-app/dist/assets/{package-desXU6XA.js → package-BFz4FYcR.js} +1 -1
- package/web-app/dist/assets/{plus-7AoOU-I9.js → plus-aS4YpFPG.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-oNj-Xn4B.js → refresh-cw-B9_ksndc.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-DeiFjfVO.js → rotate-ccw-CBogZEoT.js} +1 -1
- package/web-app/dist/assets/{scroll-text-Q9AzWiNV.js → scroll-text-DMGgO6uq.js} +1 -1
- package/web-app/dist/assets/{server-DKgVwfek.js → server-CsEqUM8R.js} +1 -1
- package/web-app/dist/assets/{shield-alert-G6x-bS-I.js → shield-alert-Btnj6tmQ.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-Qhk0yvw0.js → thumbs-up-C_NLSPqa.js} +1 -1
- package/web-app/dist/assets/{trash-2-D23gvznl.js → trash-2-zqZc9cSK.js} +1 -1
- package/web-app/dist/assets/{trending-down-CSQClPrr.js → trending-down-BGQh2rVE.js} +1 -1
- package/web-app/dist/assets/{trending-up-sjMSd1wc.js → trending-up-C31TrzUt.js} +1 -1
- package/web-app/dist/assets/{upload-Dchovhld.js → upload-CLwWKjCG.js} +1 -1
- package/web-app/dist/assets/{usePolling-DwLceXwF.js → usePolling-8wwOP53Y.js} +1 -1
- package/web-app/dist/assets/{user-BqZM8CmD.js → user-DUkbxibF.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/web-app/dist/assets/SettingsPage-D1_qasFD.js +0 -10
package/docs/v10/BOARD.md
CHANGED
|
@@ -104,49 +104,70 @@ set is declared to avoid overlap with those and with each other.
|
|
|
104
104
|
| S-85 | CEO Part C item 8: Docker arm64 on a native ubuntu-24.04-arm runner instead of QEMU (release.yml:665-687); no gha cache in publish jobs (:54-56) | release.yml publish-docker job and cache config | MEDIUM | multi-arch image still published for amd64 and arm64; publish jobs restore no cache | released@2026-09-27T16:40Z | release.yml: own train (D22). Different region from S-84 and S-83. Built and committed d8f98328 (native amd64/arm64 by digest plus manifest merge job, qemu removed, cache-binary false; provenance 11/11, SBOM 9/9, P9 4/4). 2 reviewers dispatched 14:29. Own train (D22). 2/2 APPROVE. Manifest-digest technique checked against a real multi-arch index (alpine:latest): sha256 of imagetools --raw equals the registry index digest. Missing arch fails closed (needs + count guard). Non-blocking: stale comment in publish-npm names publish-docker for the dist assert (now in publish-docker-build). Only a real release proves the arm64 runner and timing. Train 3: 3a372c8e, release commit c2eccb21 (v9.58.0) pushed 15:53:26Z, ls-remote verified; released when publish-npm succeeds. Released in v9.59.0 (Release run 36332036567 publish-npm success; v9.58.0 itself never published, superseded). |
|
|
105
105
|
| S-86 | CEO Part C item 9: pytest -n auto (test.yml:73), all 4 Python versions still required; fix any order-dependent tests it exposes | test.yml python job, the tests it exposes | MEDIUM | python job wall time drops; 4 versions still required; no test skipped to get green | released@2026-09-27T16:40Z | Built 0b82b63e: python suite 261.9s serial -> 79-82s with -n auto (14 cores, 3 runs, identical counts 3469/22); one racy test given a private TMPDIR, assertion unchanged. 2 reviewers dispatched 14:37 (asked to verify at -n 4, the CI core count). 2/2 APPROVE: assertion mutation-tested (still red when the tool leaks a scratch dir); no other shared-tempdir hazards; -n 4 x3 deterministic (109-121s on 14 cores). Follow-ups: local-ci/pre-push still serial; pytest-xdist unpinned (matches file convention). Train 2: 6c35aac0. In train 2 release commit 5332bfc3 (v9.57.0), pushed 15:50:12Z (ls-remote verified); becomes released when publish-npm succeeds (D27). Correction 15:54: I had marked this released too early. Released in v9.57.0 (Release run 36331009098 publish-npm success). |
|
|
106
106
|
| S-87 | CEO Part C item 10a: remove built-in waits (review-tail stub blocks on a FIFO and drop the 4x scale at :388-390; mock vectors setup in test-e2e-features.sh:344; go-gate stub sleep 60 to 2s; test-dashboard-multiproject.sh:160 poll instead of sleep 25; pytest-gate fixture sleep 10 to 1) | the named test files only | MEDIUM | each named suite is faster, measured before and after; none weakened (mutation check per change) | released@2026-09-27T16:40Z | OVER BUDGET 14:56 (33.5 min vs 30): told to stop and commit; the rest gets re-sliced. Committed 7935ed68 (worktree-agent-a6e52768add598d70) at 38 min, over budget: 4 of 5 waits cut (go-cargo 24.9s to 12.9s, pytest-gate 13.3s to 2.0s, multiproject 27.3s to 16.9s, e2e 26.6s to 22.2s; each mutation-checked). Remainder re-sliced as S-95. MEDIUM review (with a load-flake check) dispatched 15:05. 1/1 APPROVE: 4 mutations red; 12 runs under 4-way CPU load, 0 flakes. Cherry-picked 11c9df0c. In train 2 release commit 5332bfc3 (v9.57.0), pushed 15:50:12Z (ls-remote verified); becomes released when publish-npm succeeds (D27). Correction 15:54: I had marked this released too early. Released in v9.57.0 (Release run 36331009098 publish-npm success). |
|
|
107
|
-
| S-88 | CEO Part C item 10b: parallelize moat P6, P9 and P5 internally | tests/moat/p6-*.sh, p9-rule-of-two.sh, p5-*.sh | MEDIUM | moat suite wall time drops; same cases, same verdicts |
|
|
107
|
+
| S-88 | CEO Part C item 10b: parallelize moat P6, P9 and P5 internally | tests/moat/p6-*.sh, p9-rule-of-two.sh, p5-*.sh | MEDIUM | moat suite wall time drops; same cases, same verdicts | released@2026-09-27T18:12Z | SEQUENCING: p9-rule-of-two.sh is in S-18's file set; start only after S-18 merges. Batch 1 (build then review), dispatched 17:06. Train 5, pushed 51ae52fe at 17:52:16Z (ls-remote verified); approved by review. S-88: P9 4/4 in 43s (was about 90s). S-130: web-app dist rebuilt. S-111: pytest -n auto back on after S-102. Released in v9.66.0 (release commit 0a69d19b, pushed 18:03:32Z). |
|
|
108
108
|
| S-89 | CEO Part C item 11: pip and bun install caches on read-only test jobs | test.yml cache steps only | LOW | cache hits on a second run; never on a job holding a write token or publish secret (P9) | released@2026-09-27T16:40Z | Dispatched 15:00 (workflow wf_29a75a9c-652, slice-card brief). Built e85a23d4. Reviewer dispatched 15:16. CONCERN: the fixed -A5 permissions window misses a late contents: write. Rework sent 15:28 (parse the YAML). Rework ab32c540: YAML-parsed permissions, 15/15. Re-review dispatched 15:40. 1/1 APPROVE. Train 4. Cherry-picked onto main for train 4 (2 commits); D27 checks green except tests/test-select-tests.sh, which hit the 60s cap (rc=124; CI runs it in full; reviewer ran 38/38). Train 4 release commit 08d64f4e (v9.59.0) pushed 16:07:02Z, ls-remote verified. Released in v9.59.0 (Release run 36332036567 publish-npm success; v9.58.0 itself never published, superseded). |
|
|
109
109
|
| S-90 | CEO Part C item 12: move bun=latest, macOS bun and hyperfine to nightly (test.yml:303-312, 390-400) | test.yml those jobs, a nightly workflow | LOW | those jobs no longer run on push; they run on a nightly schedule | released@2026-09-27T16:40Z | Built 93482497 (bun matrix 4->1 on push; nightly.yml runs the other 3 plus hyperfine). Reviewer dispatched 14:24. 1/1 APPROVE. Non-blocking: release gate now requires only the pinned bun combo (intended); hyperfine no longer runs for the pinned combo anywhere; macOS-only branches in a few test files now run nightly only. Train 2: 329882d7. In train 2 release commit 5332bfc3 (v9.57.0), pushed 15:50:12Z (ls-remote verified); becomes released when publish-npm succeeds (D27). Correction 15:54: I had marked this released too early. Released in v9.57.0 (Release run 36331009098 publish-npm success). |
|
|
110
110
|
| S-91 | CEO Part C item 13: Tier A diff-selected tests with selection rules R0-R7; anything touching tests/lib, run-all-tests.sh, package.json, requirements*, loki-ts/dist, VERSION or .github/workflows runs everything | a selection script, a Tier A workflow or job | MEDIUM | Tier A finishes in 2 min or less on a typical change; the run-everything triggers are honored; Tier A never replaces Tier B | released@2026-09-27T16:40Z | OVER BUDGET 14:56 (33.5 min vs 30): told to stop and commit; the rest gets re-sliced. Committed cb8ddb07 at 39 min (over budget): R0-R7 done, 29/29, P9 4/4 on tier-a.yml, real-commit runs 25s/86s/5s. Remainder re-sliced as S-96. Tech Lead review dispatched 15:08. REJECT: the .py-suffixed grep misses Python imports (workspace_diff.py, fast_verify.py moat miss); R5 targets tests/dashboard only; no dashboard-ui rule. Round 2 sent 15:23. Round 2 52a58e86: import needles, dashboard-ui rule, node match kind; 38/38. Re-review dispatched 15:46. Round 2: 1/1 APPROVE (all 4 misses reproduced as fixed, 38/38, shellcheck clean). Advisory: generic stems (base.py) over-select (bloat, not a miss). Train 4. Cherry-picked onto main for train 4 (3ee19595+10090cd3); D27 checks green except tests/test-select-tests.sh, which hit the 60s cap (rc=124; CI runs it in full; reviewer ran 38/38). Train 4 release commit 08d64f4e (v9.59.0) pushed 16:07:02Z, ls-remote verified. Released in v9.59.0 (Release run 36332036567 publish-npm success; v9.58.0 itself never published, superseded). |
|
|
111
111
|
| S-92 | CEO Part C item 14: tests/quarantine.txt (suite, owner, expiry max 7 days, issue); quarantined suites still run but do not block; moat and review suites can never be quarantined; no retry loops | tests/quarantine.txt, tests/run-all-tests.sh (quarantine handling) | LOW | a listed suite's failure is reported but non-blocking; an expired or moat entry is rejected | merged@2026-09-27T16:35Z | SEQUENCING: after S-79 and S-81 merge (same runner file). Dispatched 15:49 on top of S-79+S-81. Train 7 (release 9218ea04, v9.62.0, pushed 16:29:17Z, ls-remote and tag ^{} verified), unreviewed (founder "release everything"). The v9.62.0 Release run was cancelled at 16:30 (the tree carries the S-18 P9 regression). |
|
|
112
112
|
| S-93 | CEO Part C item 15: the 38 unregistered test files: register each or delete it with a reason | tests/run-all-tests.sh registrations, the files | LOW | zero unregistered test files; each deletion has a stated reason | merged@2026-09-27T16:35Z | SEQUENCING: after S-79 and S-81 merge (same runner file). Dispatched 15:49 on top of S-79+S-81. Train 7 (release 9218ea04, v9.62.0, pushed 16:29:17Z, ls-remote and tag ^{} verified), unreviewed (founder "release everything"). The v9.62.0 Release run was cancelled at 16:30 (the tree carries the S-18 P9 regression). |
|
|
113
|
-
| S-94 | Worktree follow-up: triage the 27 worktrees whose branches hold commits not on main (merge, record in BOARD, or discard with a reason), check the 3 with an uncommitted edit to tests/moat/p7-no-fabricated-data.sh, and add a pulse violation for more than 15 worktrees | scripts/v10-pulse.sh, tests/test-v10-pulse.sh (violation only); triage is a Captain decision per branch | LOW | worktree count at or below 10 with no unmerged work lost; the new violation fires above 15 with a fixture |
|
|
113
|
+
| S-94 | Worktree follow-up: triage the 27 worktrees whose branches hold commits not on main (merge, record in BOARD, or discard with a reason), check the 3 with an uncommitted edit to tests/moat/p7-no-fabricated-data.sh, and add a pulse violation for more than 15 worktrees | scripts/v10-pulse.sh, tests/test-v10-pulse.sh (violation only); triage is a Captain decision per branch | LOW | worktree count at or below 10 with no unmerged work lost; the new violation fires above 15 with a fixture | released@2026-09-27T17:53Z | SEQUENCING: the pulse change waits for S-75 (same file). Triage list: scratchpad/s72-classification.tsv. Dispatched 15:00 (workflow wf_29a75a9c-652, slice-card brief). Built ad60e018 (WORKTREE_COUNT violation). Reviewer dispatched 15:16; worktree triage still pending (orchestrator). CONCERN: git merge-tree with S-76 (30ed0f19) conflicts in both files (adjacent inserts). Rebase onto S-76 after its rework lands. Back to ready: ad60e018 must be rebuilt on main after S-109 lands (both edit v10-pulse.sh); fold WORKTREE_COUNT in then. Batch 1 (build then review), dispatched 17:06. In v9.65.0 (release commit 0103adfa, pushed 17:45:33Z; required-ci success). |
|
|
114
114
|
| S-95 | S-87 remainder (CEO Part C item 10): tests/test-review-assurance-tail.sh, which did not finish in 120s on its own (rc=124). Replace the DA-block poll with a FIFO wake, check for orphaned sleep 30/120 children, and drop the 4x LOKI_TEST_SHARD scale only if it is proven safe under 4-way contention | tests/test-review-assurance-tail.sh only | MEDIUM | the suite finishes under 60s alone and under 4-way load 3 times in a row; mutating the code under test still turns it red | merged@2026-09-27T16:35Z | Known load-flaky (memory: review-assurance-tail). Measure before optimizing. Dispatched 15:49. Train 7 (release 9218ea04, v9.62.0, pushed 16:29:17Z, ls-remote and tag ^{} verified), unreviewed (founder "release everything"). The v9.62.0 Release run was cancelled at 16:30 (the tree carries the S-18 P9 regression). |
|
|
115
|
-
| S-96 | S-91 remainder: re-collect the last-10-main-code-commits Tier A selection report (time and selected tests per commit), add bun/pip/npm install caches to tier-a.yml, and set an explicit timeout-minutes on its R0 full-suite path | .github/workflows/tier-a.yml, docs/v10/METRICS.md | LOW | the METRICS.md table shows 10 real commits each under 120s or labeled R0; caches never on a job with write permissions or secrets (P9) |
|
|
115
|
+
| S-96 | S-91 remainder: re-collect the last-10-main-code-commits Tier A selection report (time and selected tests per commit), add bun/pip/npm install caches to tier-a.yml, and set an explicit timeout-minutes on its R0 full-suite path | .github/workflows/tier-a.yml, docs/v10/METRICS.md | LOW | the METRICS.md table shows 10 real commits each under 120s or labeled R0; caches never on a job with write permissions or secrets (P9) | merged@2026-09-27T18:12Z | After S-91 merges. Batch 1 (build then review), dispatched 17:06. Review CONCERN/REJECT; rework plus re-review dispatched 17:49 (workflow wf_b1414df6-a66) with the reviewer findings. Rework re-review APPROVE (workflow wf_b1414df6-a66); train 6 pushed 0bd45144 at 18:10:14Z (ls-remote verified). |
|
|
116
116
|
| S-97 | D27 item 2: .githooks/pre-push becomes identity check + bash -n + red-main warning only; remove the pytest run; target under 5s; update docs/dev/release-checklist.md to retire the local-CI mandate | .githooks/pre-push, its test, docs/dev/release-checklist.md | LOW | the hook finishes under 5s on this repo (timed 3x); a wrong identity and a bash -n error still block; no pytest invocation remains | merged@2026-09-27T16:27Z | Train 3. Built b72e9ab7: hook runs in 0.78-0.89s (3 runs), 7/7, 4 mutations red. Review dispatched 16:07. Train 5 (1cde81a7), unreviewed (founder instruction). Live: the tag push at 16:25 ran only the identity and bash -n checks. |
|
|
117
117
|
| S-98 | D27 items 3 and 6: TRAIN_LATE pulse violation (more than 25 min since the last train push while merged-unreleased commits exist) and a push helper in scripts/v10-ops.sh that pushes without a pipe and succeeds only when git ls-remote equals HEAD | scripts/v10-pulse.sh, scripts/v10-ops.sh, their tests | LOW | fixtures: TRAIN_LATE fires at 26 min with an unreleased merge and not at 24 min or with none; the push helper returns non-zero when the remote does not match | merged@2026-09-27T16:27Z | Train 3. Last train push time comes from git reflog or the push log, not the release tag. Built b44571ba: pulse 61/61, ops 60/60, mutations red. Review dispatched 16:07. Train 5 (1cde81a7), unreviewed (founder instruction). |
|
|
118
|
-
| S-99 | S-73 follow-ups (non-blocking review findings): carry quote state across lines in strip_heredocs; exact terminator whitespace; a quoted ">" must not hide an rm target; sed -i, cp, tee, perl -pi or python open() writes to BOARD.md chained before a commit set the pending flag | scripts/v10-guard.sh, tests/test-v10-guard.sh | MEDIUM | each reviewer repro becomes a blocked fixture; no everyday command becomes blocked |
|
|
119
|
-
| S-100 | S-18 follow-up (reviewer A F1): record the origin URL before the first agent iteration and refuse the trusted push if it changed; also refuse the repo default branch, not just main and master | autonomy/run.sh (trusted push only), a test | HIGH | an agent that repoints origin to another github.com repo gets a refused push with a visible warning |
|
|
118
|
+
| S-99 | S-73 follow-ups (non-blocking review findings): carry quote state across lines in strip_heredocs; exact terminator whitespace; a quoted ">" must not hide an rm target; sed -i, cp, tee, perl -pi or python open() writes to BOARD.md chained before a commit set the pending flag | scripts/v10-guard.sh, tests/test-v10-guard.sh | MEDIUM | each reviewer repro becomes a blocked fixture; no everyday command becomes blocked | merged@2026-09-27T18:12Z | Repros in the S-73 round 3 and 4 reviews. Batch 1 (build then review), dispatched 17:06. Review CONCERN/REJECT; rework plus re-review dispatched 17:49 (workflow wf_b1414df6-a66) with the reviewer findings. Rework re-review APPROVE (workflow wf_b1414df6-a66); train 6 pushed 0bd45144 at 18:10:14Z (ls-remote verified). |
|
|
119
|
+
| S-100 | S-18 follow-up (reviewer A F1): record the origin URL before the first agent iteration and refuse the trusted push if it changed; also refuse the repo default branch, not just main and master | autonomy/run.sh (trusted push only), a test | HIGH | an agent that repoints origin to another github.com repo gets a refused push with a visible warning | merged@2026-09-27T18:12Z | After S-18 merges. Batch 1 (build then review), dispatched 17:06. Review CONCERN/REJECT; rework plus re-review dispatched 17:49 (workflow wf_b1414df6-a66) with the reviewer findings. Rework re-review APPROVE (workflow wf_b1414df6-a66); train 6 pushed 0bd45144 at 18:10:14Z (ls-remote verified). |
|
|
120
120
|
| S-101 | D27 follow-up: scripts/release.sh --bump-only (no prompt, no commit, no push) that bumps every checklist file and rebuilds loki-ts/dist, so the Release Manager no longer edits VERSION with the editor tool | scripts/release.sh, tests/test-release-sh.sh | LOW | --bump-only bumps all 13 files and the dist version and exits without git side effects (asserted via git status and git log in a temp repo) | parked@2026-09-27T16:35Z | Ends the D27 VERSION exception. Superseded by S-108. |
|
|
121
121
|
| S-102 | P0 fix-forward: tests/dashboard/test_build_supervisor.py fails intermittently under pytest -n auto (S-86) with "provider attempt lineage marker is unavailable" (rc 127), raised at autonomy/lib/deadline.py:415. Hit Python 3.11+3.12 on 89e350bd and 3.10+3.11 on c2eccb21 (train 3 Tests run 36331204715, so required-ci failed); identical code passed on 5332bfc3 | autonomy/lib/deadline.py and/or tests/dashboard/test_build_supervisor.py | HIGH | reproduced in Linux docker with -n 4 before the fix; 0 failures over at least 3x the runs after; no assertion loosened, no retry | merged@2026-09-27T16:57Z | Dispatched 16:06 (opus). Train 3 failed jobs rerun at 16:05:48Z. Still running; its container s102-repro-a167 was capped at 16:30 (--cpus 2, 4g, restart=no). pytest -n auto reverted on main (b01bd36c) meanwhile. Real product race: spawn_tracked read /proc/<pid>/environ before exec finished (empty environ on a live child: 4/2000 idle, 22/2000 loaded). Fix 157dc713 (a ready byte after exec, 30s cap, fail closed). Linux, -n 4, 2x load: 20/20 runs failed before, 0/30 after; direct launches 54/1000 failed before, 0/3000 after. Cherry-picked onto main 16:57. Item 9 (-n auto) can return. |
|
|
122
122
|
| S-103 | Founder directive: tests and agent runs are headless; no code path opens a browser to the dashboard when LOKI_NO_BROWSER=1, CI, a test marker or a non-TTY holds; every test runner exports LOKI_NO_BROWSER=1 | autonomy/run.sh, autonomy/loki (open sites), loki-ts/src if any, tests/run-all-tests.sh, a guard test | MEDIUM | a stub open on PATH records zero calls under every runner; a grep test proves every open site uses the guard | merged@2026-09-27T16:35Z | Dispatched 16:23 after dozens of stray "Loki Mode" Chrome tabs. a9792295 cherry-picked as 03d5b515 plus a dist rebuild (11c302bf), pushed 16:34:08Z (ls-remote verified). Cause of the tabs: loki migrate opened its dashboard on port 57376 with a bare open. One guard, loki_browser_allowed/loki_open_url; LOKI_NO_BROWSER=1 in every runner; tests/test-browser-open-guard.sh 15/15. |
|
|
123
|
-
| S-104 | Founder report: the UserPromptSubmit pulse hook timed out at 15s and the ponytail hook at 5s under load. Make scripts/v10-pulse.sh finish under 5s with a cached, background-refreshed network layer and hard 3s timeouts; report the ponytail fix | scripts/v10-pulse.sh, scripts/v10-drift-audit-counter.sh, tests | MEDIUM | pulse under 5s under load (timed); a cached run makes no network call; stale values are labeled stale |
|
|
124
|
-
| S-105 | Release job cannot push its tag when the release changes workflow files: "refusing to allow a GitHub App to create or update workflow .github/workflows/release.yml without workflows permission"; it logs "continuing", then gh release create fails ("tag v9.57.0 exists locally but has not been pushed"). Make the tag step fail loudly and document that the Release Manager pre-pushes the tag, or use a token with workflows permission | .github/workflows/release.yml (tag step) | HIGH | a rejected tag push fails that step with a clear message; a pre-pushed tag is detected and reused |
|
|
125
|
-
| S-106 | tests/test-runtime-gate-port-scoping.sh positive control races its own background listener ("lsof cannot enumerate the own-tree decoy listener"); failed shard 0 in train 1 and train 4. Wait for the port to be LISTENing before the positive control | tests/test-runtime-gate-port-scoping.sh | LOW | 20/20 green in Linux docker under 4-way load; the positive control still fails when the listener never starts |
|
|
123
|
+
| S-104 | Founder report: the UserPromptSubmit pulse hook timed out at 15s and the ponytail hook at 5s under load. Make scripts/v10-pulse.sh finish under 5s with a cached, background-refreshed network layer and hard 3s timeouts; report the ponytail fix | scripts/v10-pulse.sh, scripts/v10-drift-audit-counter.sh, tests | MEDIUM | pulse under 5s under load (timed); a cached run makes no network call; stale values are labeled stale | released@2026-09-27T17:53Z | Stopgap: local hook timeout raised 15 to 45s at 16:24 (settings.local.json, not committed). 5d60a2a8: pulse 2.18s to 0.20s from cache, 64/64. Conflicts with S-76 (T30) on main; S-109 builds on it and resolves. Hook timeout stopgap is 45s locally; the agent recommends 10s after it lands. Ponytail hook: the plugin hooks.json already says 20s (edited today 12:20); sessions started earlier still use 5s; an override outside the plugin cache would survive updates. Being rebased onto main together with S-109 (dispatched 16:48). Cherry-picked (b0f22616) and pushed in cc105687 at 17:05:47Z (ls-remote verified); tests/test-v10-pulse.sh 78/78 on main. In v9.64.0 (Release run 36337270762: publish-npm success). |
|
|
124
|
+
| S-105 | Release job cannot push its tag when the release changes workflow files: "refusing to allow a GitHub App to create or update workflow .github/workflows/release.yml without workflows permission"; it logs "continuing", then gh release create fails ("tag v9.57.0 exists locally but has not been pushed"). Make the tag step fail loudly and document that the Release Manager pre-pushes the tag, or use a token with workflows permission | .github/workflows/release.yml (tag step) | HIGH | a rejected tag push fails that step with a clear message; a pre-pushed tag is detected and reused | released@2026-09-27T17:53Z | Worked around at 16:25: v9.57.0..v9.61.0 pushed by the Release Manager (ls-remote verified), train 2 Release fully rerun. Evidence: Release run 36331009098 release-job log line 5126 "! [remote rejected] v9.57.0 ... without workflows permission" and line 5171 "tag v9.57.0 exists locally but has not been pushed". Batch 1 (build then review), dispatched 17:06. In v9.65.0 (release commit 0103adfa, pushed 17:45:33Z; required-ci success). |
|
|
125
|
+
| S-106 | tests/test-runtime-gate-port-scoping.sh positive control races its own background listener ("lsof cannot enumerate the own-tree decoy listener"); failed shard 0 in train 1 and train 4. Wait for the port to be LISTENing before the positive control | tests/test-runtime-gate-port-scoping.sh | LOW | 20/20 green in Linux docker under 4-way load; the positive control still fails when the listener never starts | released@2026-09-27T17:53Z | Test race, not product code. Suite quarantined until 2026-10-03 (ea8ecf1c); the fix is still needed before expiry. Evidence: Tests run 36332036570, shard 0/8 job 108655699267: "FAIL: positive control failed: lsof cannot enumerate the own-tree decoy listener", "RESULT: 9 passed, 1 failed". Batch 1 (build then review), dispatched 17:06. In v9.65.0 (release commit 0103adfa, pushed 17:45:33Z; required-ci success). |
|
|
126
126
|
| S-107 | P0 moat regression from S-18 (train 5): P9.injection-cannot-reach-token fails on Linux CI only in the opt-out positive control ("the hosts.yml probe is blind under the opt-out"); fails closed but blocks every tree from 1cde81a7 | autonomy/run.sh and/or loki-ts/src/runner/github_token.ts (opt-out path) | HIGH | red then green in a capped Linux container; P9 4/4 in Linux; nested and trusted-push suites still pass | merged@2026-09-27T16:43Z | Dispatched 16:31 (opus, docker --cpus=2 --memory=4g). Root cause in the test harness: the GitHub ubuntu runner sets XDG_CONFIG_HOME, so gh ignored the planted $HOME/.config/gh/hosts.yml; only the opt-out leg (no GH_CONFIG_DIR override) noticed. The default and hosts-only checks were false greens on CI. Fix 445efcba (cherry-picked as 298f027e, pushed 16:43:06Z, ls-remote verified) unsets XDG_CONFIG_HOME and GH_CONFIG_DIR per scenario. Linux container with XDG set: before 3/4, after 4/4 CASE PASS; a product mutation now turns default and hosts-only red. No assertion changed. |
|
|
127
127
|
| S-108 | D28: scripts/release.sh --bump-only (no prompt, commit or push; bumps 13 files and rebuilds dist) plus a guard that refuses any bump unless Tests and Bun Parity are completed-success for HEAD SHA | scripts/release.sh, tests/test-release-sh.sh | MEDIUM | red, no-run and other-SHA cases refuse with exit 3 and no file changed; green bumps; --bump-only leaves no git side effects | merged@2026-09-27T16:48Z | Replaces S-101 and ends the D27 VERSION exception. f5f5f6cf cherry-picked as a537bb22: RELEASE_ON_RED gate (Tests and Bun Parity completed-success for HEAD SHA, else exit 3) and --bump-only; tests/test-release-sh.sh 28/28 on main. |
|
|
128
|
-
| S-109 | D28: pulse violations HIGH_LOAD (load > 28), ORPHAN_TEST (tests/* process with PPID 1 or etime > 30 min), STRAY_CONTAINER (swarm container older than 1h or with a restart policy), RELEASE_ON_RED (newest VERSION bump whose Tests failed), built on S-104 | scripts/v10-pulse.sh, tests/test-v10-pulse.sh | MEDIUM | fire and no-fire fixture per violation; pulse under 1s from cache |
|
|
129
|
-
| S-110 | Fix the 3 suites S-93 newly registered that fail on CI (quarantined until 2026-10-03): test-add-dir-reaches-provider.sh (--add-dir never reaches the provider argv; possibly a real product defect), test-static-analysis-tsconfig.sh (tsc -p . fails on a path-aliased import on CI), test-doctor-json-skills.sh | the three suites and the code each exercises | MEDIUM | each passes on Linux CI (or is deleted with a stated reason) and its quarantine entry is removed |
|
|
130
|
-
| S-
|
|
131
|
-
| S-
|
|
132
|
-
| S-
|
|
133
|
-
| S-
|
|
134
|
-
| S-
|
|
135
|
-
| S-
|
|
136
|
-
| S-
|
|
137
|
-
| S-
|
|
138
|
-
| S-
|
|
139
|
-
| S-
|
|
140
|
-
| S-
|
|
141
|
-
| S-
|
|
142
|
-
| S-
|
|
143
|
-
| S-
|
|
144
|
-
| S-
|
|
145
|
-
| S-
|
|
146
|
-
| S-
|
|
147
|
-
| S-
|
|
148
|
-
| S-
|
|
149
|
-
| S-
|
|
128
|
+
| S-109 | D28: pulse violations HIGH_LOAD (load > 28), ORPHAN_TEST (tests/* process with PPID 1 or etime > 30 min), STRAY_CONTAINER (swarm container older than 1h or with a restart policy), RELEASE_ON_RED (newest VERSION bump whose Tests failed), built on S-104 | scripts/v10-pulse.sh, tests/test-v10-pulse.sh | MEDIUM | fire and no-fire fixture per violation; pulse under 1s from cache | released@2026-09-27T17:53Z | Must resolve the S-76 T30 test-number collision with S-104. First build stopped on the S-104/S-76 T30 collision (as instructed). Re-dispatched 16:48: rebase S-104, then S-109. Cherry-picked (0986ab39) and pushed in cc105687 at 17:05:47Z (ls-remote verified); tests/test-v10-pulse.sh 78/78 on main. In v9.64.0 (Release run 36337270762: publish-npm success). |
|
|
129
|
+
| S-110 | Fix the 3 suites S-93 newly registered that fail on CI (quarantined until 2026-10-03): test-add-dir-reaches-provider.sh (--add-dir never reaches the provider argv; possibly a real product defect), test-static-analysis-tsconfig.sh (tsc -p . fails on a path-aliased import on CI), test-doctor-json-skills.sh | the three suites and the code each exercises | MEDIUM | each passes on Linux CI (or is deleted with a stated reason) and its quarantine entry is removed | released@2026-09-27T18:12Z | Evidence: Tests run 36334599806, jobs 108662926880 and 108662926920. Batch 1 (build then review), dispatched 17:06. Train 4, pushed 08e4a7d4 at 17:48:38Z (ls-remote verified); approved by review (1/1; HIGH for S-116). P2.council-inconclusive-cannot-exit-zero removed from pending.txt (proven). Quarantine list now empty. Released in v9.66.0 (release commit 0a69d19b, pushed 18:03:32Z). |
|
|
130
|
+
| S-111 | Part C item 9 returns: CI python suite runs pytest -n auto again after S-102 | .github/workflows/test.yml, requirements-test.txt | LOW | 10 of 10 capped-container runs of test_build_supervisor.py with -n 4 under load, 0 failures | released@2026-09-27T18:12Z | Train 5 (51ae52fe). Released in v9.66.0 (release commit 0a69d19b, pushed 18:03:32Z). |
|
|
131
|
+
| S-112 | P8 pending: ablation producer writing .loki/quality/ablation.json (load_bearing / not_load_bearing / not_applicable) | autonomy/lib/ablation.py, tests/test-ablation.sh | HIGH | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | ready@2026-09-27T17:14Z | RISKY: rewrites the user working tree in place; needs restore-on-signal. Not wired into run.sh (BACKLOG 34). Held. |
|
|
132
|
+
| S-113 | P8 pending: proof-generator copies ablation.json into facts.ablation; never VERIFIED when not_load_bearing | autonomy/lib/proof-generator.py (collector and _compute_headline), tests/test-proof-ablation-headline.sh | HIGH | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | released@2026-09-27T17:53Z | Batch 2, dispatched 17:14. In v9.65.0 (release commit 0103adfa, pushed 17:45:33Z; required-ci success). |
|
|
133
|
+
| S-114 | P3 pending: check_author.py context (spec-only inputs) | autonomy/lib/check_author.py, tests/test-check-author-context.sh | HIGH | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | ready@2026-09-27T17:14Z | Held: present-but-unwired promotion risk (BACKLOG 34); needs a run.sh wiring slice. |
|
|
134
|
+
| S-115 | P3 pending: checklist-verify.py --freeze (definition digest, hash mismatch on edit) | autonomy/checklist-verify.py, tests/test-checklist-freeze.sh | HIGH | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | ready@2026-09-27T17:14Z | Held: unwired (BACKLOG 34). |
|
|
135
|
+
| S-116 | P2 pending: council must not approve inconclusive evidence on the vote alone | autonomy/completion-council.sh (evidence gate, evaluate), tests/test-council-inconclusive-no-approve.sh | HIGH | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | released@2026-09-27T18:12Z | Batch 2, dispatched 17:14. Train 4, pushed 08e4a7d4 at 17:48:38Z (ls-remote verified); approved by review (1/1; HIGH for S-116). P2.council-inconclusive-cannot-exit-zero removed from pending.txt (proven). Quarantine list now empty. Released in v9.66.0 (release commit 0a69d19b, pushed 18:03:32Z). |
|
|
136
|
+
| S-117 | P4 corpus 1/5: 20 logic-bug seeded defects | benchmarks/seeded-defects/cases/SD-0001..0020, fragments/logic-bug.json | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | ready@2026-09-27T17:14Z | CEO decision: whether to spend 6 slices on the corpus (S-117..S-122). |
|
|
137
|
+
| S-118 | P4 corpus 2/5: 20 spec-miss seeded defects | benchmarks/seeded-defects/cases/SD-0021..0040, fragments/spec-miss.json | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | ready@2026-09-27T17:14Z | CEO decision (corpus). |
|
|
138
|
+
| S-119 | P4 corpus 3/5: 20 test-fitting seeded defects | benchmarks/seeded-defects/cases/SD-0041..0060, fragments/test-fitting.json | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | ready@2026-09-27T17:14Z | CEO decision (corpus). |
|
|
139
|
+
| S-120 | P4 corpus 4/5: 20 mock-abuse seeded defects | benchmarks/seeded-defects/cases/SD-0061..0080, fragments/mock-abuse.json | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | ready@2026-09-27T17:14Z | CEO decision (corpus). |
|
|
140
|
+
| S-121 | P4 corpus 5/5: 20 security seeded defects (hermetic) | benchmarks/seeded-defects/cases/SD-0081..0100, fragments/security.json | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | ready@2026-09-27T17:14Z | CEO decision (corpus). |
|
|
141
|
+
| S-122 | P4 corpus assembler build_manifest.py (schema v2, duplicate/category/count checks) | benchmarks/seeded-defects/build_manifest.py, tests/test-seeded-defects-manifest.sh | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | ready@2026-09-27T17:14Z | CEO decision (corpus). |
|
|
142
|
+
| S-123 | BACKLOG 20: JWKS must be https (loopback http only) | autonomy/loki (attestation check), tests/test-jwks-https-only.sh | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | merged@2026-09-27T18:12Z | Batch 2, dispatched 17:14. Review CONCERN/REJECT; rework plus re-review dispatched 17:49 (workflow wf_b1414df6-a66) with the reviewer findings. Rework re-review APPROVE (workflow wf_b1414df6-a66); train 6 pushed 0bd45144 at 18:10:14Z (ls-remote verified). |
|
|
143
|
+
| S-124 | BACKLOG 79: iteration 0 drops a stale static-analysis.pass | autonomy/run.sh (iteration-0 drop block), tests/test-iteration0-drops-static-analysis.sh | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | merged@2026-09-27T18:12Z | Batch 2, dispatched 17:14. Review CONCERN/REJECT; rework plus re-review dispatched 17:49 (workflow wf_b1414df6-a66) with the reviewer findings. Rework re-review APPROVE (workflow wf_b1414df6-a66); train 6 pushed 0bd45144 at 18:10:14Z (ls-remote verified). |
|
|
144
|
+
| S-125 | BACKLOG 76/89: done-recognition tests_axis zero-test and failed_count honesty | autonomy/lib/done-recognition.sh (tests_axis), tests/test-done-recognition-tests-axis.sh | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | merged@2026-09-27T18:12Z | Batch 2, dispatched 17:14. Review CONCERN/REJECT; rework plus re-review dispatched 17:49 (workflow wf_b1414df6-a66) with the reviewer findings. Rework re-review APPROVE (workflow wf_b1414df6-a66); train 6 pushed 0bd45144 at 18:10:14Z (ls-remote verified). |
|
|
145
|
+
| S-126 | BACKLOG 94a: route walk vacuous on FastAPI >=0.141 in test_all_data_gets_scoped | tests/dashboard/test_all_data_gets_scoped.py | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | merged@2026-09-27T18:12Z | Batch 2, dispatched 17:14. Review CONCERN/REJECT; rework plus re-review dispatched 17:49 (workflow wf_b1414df6-a66) with the reviewer findings. Rework re-review APPROVE (workflow wf_b1414df6-a66); train 6 pushed 0bd45144 at 18:10:14Z (ls-remote verified). |
|
|
146
|
+
| S-127 | BACKLOG 94b: same vacuous walk in 3 dashboard tests | tests/dashboard/test_fleet_observability.py, test_fleet_retry.py, test_memory_read_scope_auth.py | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | released@2026-09-27T17:53Z | Batch 2, dispatched 17:14. In v9.65.0 (release commit 0103adfa, pushed 17:45:33Z; required-ci success). |
|
|
147
|
+
| S-128 | BACKLOG 148: moat baseline detection blind to a symlinked pending.txt | tests/moat/run.sh (read_baselines, unreached_release), tests/test-moat-runner.sh | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | released@2026-09-27T18:12Z | Batch 2, dispatched 17:14. Train 4, pushed 08e4a7d4 at 17:48:38Z (ls-remote verified); approved by review (1/1; HIGH for S-116). P2.council-inconclusive-cannot-exit-zero removed from pending.txt (proven). Quarantine list now empty. Released in v9.66.0 (release commit 0a69d19b, pushed 18:03:32Z). |
|
|
148
|
+
| S-129 | BACKLOG 93: hard-deadline zero-exit leader waits only 0.2s for the PID file | tests/test-hard-deadline-confinement.sh | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | released@2026-09-27T18:12Z | Batch 2, dispatched 17:14. Train 4, pushed 08e4a7d4 at 17:48:38Z (ls-remote verified); approved by review (1/1; HIGH for S-116). P2.council-inconclusive-cannot-exit-zero removed from pending.txt (proven). Quarantine list now empty. Released in v9.66.0 (release commit 0a69d19b, pushed 18:03:32Z). |
|
|
149
|
+
| S-130 | BACKLOG 117: SettingsPage lists deprecated Gemini and a hardcoded build date | web-app/src/pages/SettingsPage.tsx | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | released@2026-09-27T18:12Z | Batch 2, dispatched 17:14. Train 5, pushed 51ae52fe at 17:52:16Z (ls-remote verified); approved by review. S-88: P9 4/4 in 43s (was about 90s). S-130: web-app dist rebuilt. S-111: pytest -n auto back on after S-102. Released in v9.66.0 (release commit 0a69d19b, pushed 18:03:32Z). |
|
|
150
|
+
| S-131 | BACKLOG 106 (Bun): budget warns when capped and spend is unmeasured | loki-ts/src/runner/budget.ts, loki-ts/tests/runner/budget.test.ts | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (17:10Z cut) | released@2026-09-27T17:53Z | Batch 2, dispatched 17:14; CEO note: warn-never-pause default. In v9.65.0 (release commit 0103adfa, pushed 17:45:33Z; required-ci success). |
|
|
151
|
+
| S-132 | Velocity: skip heavy Tests jobs on a version-bump-only commit whose parent Tests run succeeded (eligibility no looser than release.yml STEP 1) | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | HIGH | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
152
|
+
| S-133 | Velocity: release.yml required-ci poll 30s to 10s; fix stale publish-npm comment | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
153
|
+
| S-134 | Velocity: rebuild shard-durations.tsv from a recent successful run; drift test | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
154
|
+
| S-135 | Velocity: parallelize trust-core probe mutations (130s) | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
155
|
+
| S-136 | Velocity: tests/test-select-tests.sh under 30s, same 38 cases | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
156
|
+
| S-137 | S-81 follow-up: shard-coverage T4 enumerates the real runner | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
157
|
+
| S-138 | GUARDS 12: lint so test fixtures never write the real ~/.gitconfig | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
158
|
+
| S-139 | GUARDS 13 + BACKLOG 136: RELEASED_AHEAD_OF_NPM; UNKNOWN on tag/npm disagreement | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
159
|
+
| S-140 | BACKLOG 103: jest "Test Suites N failed" / vitest "Test Files N failed" count as failures | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
160
|
+
| S-141 | S-49 follow-up: remaining council readers (~1425, ~1564, ~4232) use -I -S | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | HIGH | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
161
|
+
| S-142 | S-48 follow-up: convergence-floor NEGATIVE-C for the runner guard | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
162
|
+
| S-143 | BACKLOG 117: drop Gemini/Railway/stale gate counts from 6 web-app files | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
163
|
+
| S-144 | Footer.tsx version joins release.sh --bump-only | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
164
|
+
| S-145 | BACKLOG 118: GET /api/checklist/waivers returns 500 on a corrupt file | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
165
|
+
| S-146 | BACKLOG 118: one id="budget-banner" in the dashboard build | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
166
|
+
| S-147 | BACKLOG 118: loki metrics --json reports null for unmeasured, no invented time_saved | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | MEDIUM | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
167
|
+
| S-148 | BACKLOG 118: trust.html says "Not enough history yet" when every axis is insufficient | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
168
|
+
| S-149 | BACKLOG 118: prompt_optimizer never-ran vs corrupt markers | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
169
|
+
| S-150 | BACKLOG 118: migration progress null (not 0/0) on a corrupt/missing file | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
170
|
+
| S-151 | BACKLOG 118: analytics heatmap shows no-data before the activity window | files per docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | LOW | wall check in docs/v10/ARCHITECT-CUTS.md (18:05Z cut) | building@2026-09-27T18:18Z | Batch 4 (build then review), dispatched 18:17. |
|
|
150
171
|
| S-01 | BACKLOG 22: orphaned `sleep 300` resource monitor | autonomy/run.sh (resource-monitor spawn/cleanup only, not kill_provider_child), one new test | MEDIUM | red: `loki start` then interrupt leaves a `sleep 300` orphan (ps shows it after exit); green: it is reaped or never orphaned, by PID recorded at spawn | released@2026-09-27T01:33Z | 027ec085 confirmed ancestor of origin/main; note corrected, was stale. |
|
|
151
172
|
| S-02 | BACKLOG 23: client-route test hardcodes main checkout path | tests/lib-extract-client-paths.mjs, tests/lib-match-client-routes.py, tests/test-verify-client-routes.sh | LOW | released@2026-09-27T15:00Z | 1/1 APPROVE: reviewer reproduced from 2 independent real worktrees, mutation-tested both new WORKTREE GUARD assertions independently, confirmed the disclosed BACKLOG 137 interaction (P7's own sed-workaround breaking) is expected, not a surprise. **Merged to main.** S-39/BACKLOG 137 now unblocked -- but note: this merge makes `tests/moat/run.sh` read a live FAIL on `P7.webapp-client-routes-exist` until S-39 lands (an unlisted-in-pending.txt regression per the ratchet), since P7's own copy-and-sed workaround can no longer find the literal it targets. S-39 should be prioritized promptly to close this gap, or a temporary pending.txt entry considered if S-39 doesn't land quickly. Shipped in v9.56.0 (merged before the 14:16:24Z release push of b651b98d; on npm 15:00:06Z). |
|
|
152
173
|
| S-03 | BACKLOG 25: `loki ci --report` "Argument list too long" on a large diff | autonomy/loki (cmd_ci report path only), one new test | MEDIUM | red: a synthetic diff over the ARG_MAX threshold, exit 126; green: same diff passed via stdin/file, exit 0 | rejected@2026-09-27T01:33Z | Real crash site (export-based ARG_MAX) misdiagnosed and left unfixed; sent back to builder. |
|
|
@@ -179,7 +200,7 @@ set is declared to avoid overlap with those and with each other.
|
|
|
179
200
|
| S-27 | BACKLOG 125 B-1: P7 scanner reassignment-fallback bypass -- `let rows = data; if (!rows.length) rows = [rows]; setRows(rows);` -- `DECL_ARR` only matches the declaration form, never a later bare `x = [` assignment | tests/moat/p7-no-fabricated-data.sh (scanner rule + a new red/green case; never weaken an existing arm) | MEDIUM | released@2026-09-27T15:00Z | New `REASSIGN_ARR` regex + `DECL_KEYWORD` guard catches a fabricated array reassigned after declaration. Unanimous 2/2 APPROVE, both reviewers independently reproduced the bypass with their own fixtures. Non-blocking flag for whoever merges S-28 second: on a destructuring/parameter-default fixture that ALSO flows to a setter (untested by either slice today), whichever arm runs first wins the finding's MESSAGE (correct detection either way, just message-attribution -- "reassigned" vs "parameter default"). Recommend reordering DEFAULT_ARR ahead of REASSIGN_ARR when S-28 merges. 94137535. Shipped in v9.56.0 (merged before the 14:16:24Z release push of b651b98d; on npm 15:00:06Z). |
|
|
180
201
|
| S-28 | BACKLOG 125 B-2: P7 scanner destructuring/parameter-default bypass -- `const { rows = [rows] } = data;` or `function load(rows = [rows]) {}` -- neither is a `name = [` declaration the scanner recognizes | tests/moat/p7-no-fabricated-data.sh (scanner rule + a new red/green case; never weaken an existing arm) | MEDIUM | merged@2026-09-27T16:35Z | Correction: stale building@ with no live agent and no commit of its own (git log --all --grep found none). Re-cut to ready. Dispatched 15:49 (S-29 released). Train 7 (release 9218ea04, v9.62.0, pushed 16:29:17Z, ls-remote and tag ^{} verified), unreviewed (founder "release everything"). The v9.62.0 Release run was cancelled at 16:30 (the tree carries the S-18 P9 regression). |
|
|
181
202
|
| S-29 | BACKLOG 125 B-5: P7 scanner module-level named fallback table -- `const FALLBACK_ROWS = [rows];` at column 0, referenced later via `data.length ? data : FALLBACK_ROWS` -- the column-0 exemption plus identifier-branch ternary both let it through unless the name matches sample/mock/demo/fake/placeholder | tests/moat/p7-no-fabricated-data.sh (scanner rule + a new red/green case; never weaken an existing arm) | MEDIUM | released@2026-09-27T15:00Z | Unanimous review across 6 rounds; round 6 (ab72ba3f) got a thorough final APPROVE that extended the discrimination check to 2 other call sites. Merge was non-trivial (S-29's chain predates S-27/S-32's own merges to this same file); a dedicated merge-pass agent reconciled all three lineages (5 conflict hunks, 2 mid-heredoc splices manually repaired), and a dedicated adversarial reviewer independently verified the reconciliation (read the full ~1364-line diff, confirmed heredoc balance, no duplicate definitions, all 3 lineages' fixtures intact, scanner and moat suite clean, built its own combined 3-lineage fixture confirming no shadowing). VOTE: APPROVE. Merged as 418b8f2f (a real 2-parent merge commit, content taken verbatim from the reviewed merge-pass commit cd0e5124 since main had not moved on this file since the merge-pass agent's own base -- confirmed via `git diff` before applying, avoiding a second unreviewed reconciliation attempt). Disclosed residual gap, not fixed here: an enclosing-paren confusion class (`(x || TABLE) && other` etc.), documented with a `ponytail:` comment for a future AST rewrite. Shipped in v9.56.0 (merged before the 14:16:24Z release push of b651b98d; on npm 15:00:06Z). |
|
|
182
|
-
| S-30 | BACKLOG 125 B-6: P7 scanner ternary-against-null bypass -- `const r = loading ? null : [rows];` -- `is_literal(null)` is true so the both-branches-literal exemption suppresses it; should only treat an array/object literal, never null/undefined/empty-string, as the "literal other branch" | tests/moat/p7-no-fabricated-data.sh (scanner rule + a new red/green case; never weaken an existing arm) | MEDIUM |
|
|
203
|
+
| S-30 | BACKLOG 125 B-6: P7 scanner ternary-against-null bypass -- `const r = loading ? null : [rows];` -- `is_literal(null)` is true so the both-branches-literal exemption suppresses it; should only treat an array/object literal, never null/undefined/empty-string, as the "literal other branch" | tests/moat/p7-no-fabricated-data.sh (scanner rule + a new red/green case; never weaken an existing arm) | MEDIUM | merged@2026-09-27T18:12Z | 1/1 CONCERN: fix only closes half the bypass class. `is_exempting_sibling()`'s `ABSENT` set (null/undefined/''/"") is correct but incomplete -- reviewer independently confirmed `false`/`0`/`{}`/`true` as the exempting sibling ALSO still produce zero findings, same fabrication shape, still invisible. Reviewer's suggested fix (confirmed to close all cases while preserving legitimate exemptions): require the exempting sibling itself be an array literal (`is_literal(v) and v.strip().startswith('[')`), not merely "not one of 4 named absence values." Also: line 920 (the `[rows] : X` ordering) ships with no fixture exercising `is_exempting_sibling` at all -- its own committed fixtures accidentally test the pre-existing identifier-branch path instead. Rework: switch to the array-literal-allowlist approach, add a `[rows] : null`-shaped fixture for line 920's own coverage. Sequences after S-29 per the shared-file note; S-29's own rework will need to route through whichever final helper S-30 ships (not the current is_exempting_sibling if it's replaced). Correction: stale building@ with no live agent and no commit of its own (git log --all --grep found none). Re-cut to ready. Batch 1 (build then review), dispatched 17:06. Review CONCERN/REJECT; rework plus re-review dispatched 17:49 (workflow wf_b1414df6-a66) with the reviewer findings. Rework re-review APPROVE (workflow wf_b1414df6-a66); train 6 pushed 0bd45144 at 18:10:14Z (ls-remote verified). |
|
|
183
204
|
| S-31 | BACKLOG 125 B-7: P7 scanner fabricated-return-from-helper bypass -- `function getRows(d) { if (!d) return [rows]; return d; } setRows(getRows(d))` -- no scanner arm follows a function's return value back to a fabricated literal | tests/moat/p7-no-fabricated-data.sh (scanner rule + a new red/green case; never weaken an existing arm) | MEDIUM | merged@2026-09-27T16:35Z | Unanimous 2/2 APPROVE (mechanism + corrected comment, independently verified across two review rounds). Merge-base (10e09a98) is behind S-29's still-in-flight, much larger rework chain on this SAME file -- holding merge until S-29 lands to avoid a bad conflict, per the established shared-file sequencing convention. Will need a rebase pass onto post-S-29 main before merge, not a blind cherry-pick. Rebase onto post-S-29 main dispatched 15:49. Train 7 (release 9218ea04, v9.62.0, pushed 16:29:17Z, ls-remote and tag ^{} verified), unreviewed (founder "release everything"). The v9.62.0 Release run was cancelled at 16:30 (the tree carries the S-18 P9 regression). |
|
|
184
205
|
| S-32 | BACKLOG 125 B-8: P7 scanner `Array.from` generator bypass -- `Array.from({ length: 3 }, (_, i) => ({ id: i, action: 'Deployed', user: 'Admin' }))` invents field values inside a generator callback; the existing `Array.from` arm only checks a literal first argument | tests/moat/p7-no-fabricated-data.sh (scanner rule + a new red/green case; never weaken an existing arm) | MEDIUM | released@2026-09-27T15:00Z | New arm fires on `{length: N}` + concise-object-returning arrow, substitutes arrow params with 0 before reusing `is_literal`, requires >=1 literal string field post-substitution. Unanimous 2/2 APPROVE, both reviewers independently reproduced with distinct fixtures; reviewer 2 verified the 3-way merge onto current main via `git merge-file` before I merged it (zero conflicts, purely additive) and found a new non-blocking gap (nested Array.from generators losing an outer scope's loop variable through substitution) filed as BACKLOG 145. d49b26d7. Shipped in v9.56.0 (merged before the 14:16:24Z release push of b651b98d; on npm 15:00:06Z). |
|
|
185
206
|
| S-33 | BACKLOG 128: stale docs assert a `{"runner":"none","pass":true}` writer shape that doesn't exist (D20 corrected this; the real writer, `enforce_test_coverage` at run.sh:13250, writes `pass:"inconclusive"`, a string, never boolean true) | references/core-workflow.md, docs/VERIFIED-COMPLETION-PLAN.md, tests/test-council-devils-advocate.sh, tests/test-da-veto.sh, tests/test-council-convergence-floor.sh (fixture shapes only; do not touch any assertion logic) | LOW | released@2026-09-27T15:00Z | Not behaviorally load-bearing (harmless today since runner=='none' is unconditional at every reading site), but honesty/documentation-drift cleanup. Found and fixed a 4th documentation occurrence beyond the original bug report's scope. Confirmed a genuinely interesting residual coverage gap in test-council-convergence-floor.sh's NEGATIVE-B (correctly disclosed, not fixed -- out of this fixture-only slice's scope). 1/1 APPROVE. **Merged to main (90e26308).** Shipped in v9.56.0 (merged before the 14:16:24Z release push of b651b98d; on npm 15:00:06Z). |
|
package/docs/v10/METRICS.md
CHANGED
|
@@ -156,3 +156,60 @@ rather than something job-setup variance or GitHub's own queueing missed, and
|
|
|
156
156
|
that `test-ci-json-argmax.sh` actually lands near 60s once its BACKLOG 25
|
|
157
157
|
fixture fix ships (until then this table's 60s row is an assumption, not a
|
|
158
158
|
measurement, as stated in `tests/shard-durations.tsv`'s own header).
|
|
159
|
+
|
|
160
|
+
## Tier A selector: last 10 non-docs commits (S-96, S-91 remainder)
|
|
161
|
+
|
|
162
|
+
`scripts/select-tests.sh --base <SHA>^ --head <SHA>` (selection only, no
|
|
163
|
+
`--run`), against the last 10 non-merge commits on main whose diff touches
|
|
164
|
+
something outside `docs/v10` (`git log --no-merges -- . ':!docs/v10'`).
|
|
165
|
+
Selector time is real wall clock (`/usr/bin/time -p`) for the selection step
|
|
166
|
+
alone, measured in this worktree, one commit at a time. "Selected tests" for
|
|
167
|
+
an R0 row is the whole `tests/run-all-tests.sh` suite (R0 means "run
|
|
168
|
+
everything"), not a count of individual suites.
|
|
169
|
+
|
|
170
|
+
| SHA | Rule(s) fired | Selected tests | Selector time |
|
|
171
|
+
|---|---|---|---|
|
|
172
|
+
| cc105687 | R1, R3 | 7 | 6.62s |
|
|
173
|
+
| a4eb09d7 | R1, R3 | 7 | 6.24s |
|
|
174
|
+
| a1ca3c7b | R0 | ALL (full suite, matched VERSION) | 0.04s |
|
|
175
|
+
| 8009b193 | R3 | 2 | 6.98s |
|
|
176
|
+
| 878f79e7 | R1, R3, R6 | 25 | 14.34s |
|
|
177
|
+
| a537bb22 | R1, R3 | 7 | 7.24s |
|
|
178
|
+
| 298f027e | R1, R6 | 3 | 0.04s |
|
|
179
|
+
| 11c302bf | R0 | ALL (full suite, matched loki-ts/dist/loki.js) | 0.05s |
|
|
180
|
+
| 03d5b515 | R0 | ALL (full suite, matched loki-ts/package.json) | 0.04s |
|
|
181
|
+
| ea8ecf1c | R3 | 2 | 7.02s |
|
|
182
|
+
|
|
183
|
+
All 10 land under 120s (the 3 R0 rows are the declared exception to the
|
|
184
|
+
2-minute Tier A target and are labeled ALL rather than timed against it, per
|
|
185
|
+
the green criterion in BOARD.md S-96).
|
|
186
|
+
|
|
187
|
+
### tier-a.yml install caches (S-96)
|
|
188
|
+
|
|
189
|
+
Added `pip` (setup-python `cache: pip`) and `npm` (new `setup-node@v4`,
|
|
190
|
+
`cache: npm`) install caches to the `select-and-run` job; `oven-sh/setup-bun`
|
|
191
|
+
was already caching bun installs by default (no `no-cache: true` set).
|
|
192
|
+
`tests/moat/p9-rule-of-two.sh`'s cache-channel rule
|
|
193
|
+
(P9.issue-workflows-separate-untrusted-from-push) bans an Actions cache only
|
|
194
|
+
on a unit holding write permissions or secrets; `select-and-run` holds
|
|
195
|
+
neither (`permissions: contents: read` at the workflow level, no
|
|
196
|
+
job-level override, no `secrets.*` reference), so this is a negative-control
|
|
197
|
+
case, verified both ways:
|
|
198
|
+
|
|
199
|
+
| Check | Result |
|
|
200
|
+
|---|---|
|
|
201
|
+
| P9 green before the change | `bash tests/moat/p9-rule-of-two.sh` -> all 4 cases PASS, exit 0 |
|
|
202
|
+
| P9 green after adding the 3 caches | `bash tests/moat/p9-rule-of-two.sh` -> all 4 cases PASS, exit 0; `SITE tier-a.yml:select-and-run ... verdict=ok` |
|
|
203
|
+
| Mutation (`contents: read` -> `contents: write`) | `bash tests/moat/p9-rule-of-two.sh` -> `CASE P9.issue-workflows-separate-untrusted-from-push FAIL ... holds write permissions and restores actions/setup-python cache: pip, oven-sh/setup-bun ..., actions/setup-node cache: npm` (the guard names exactly the 3 caches added here) |
|
|
204
|
+
| Mutation reverted | `bash tests/moat/p9-rule-of-two.sh` -> all 4 cases PASS, exit 0 again |
|
|
205
|
+
|
|
206
|
+
Rework (post-review): an earlier draft of this commit added an explicit
|
|
207
|
+
`timeout-minutes: 20` on the "Run selected suites" step (where the R0
|
|
208
|
+
full-suite path executes). Review found this false-budgeted: this repo's own
|
|
209
|
+
measured data (test.yml, scripts/local-ci.sh, CLAUDE.md) converges on
|
|
210
|
+
~24-27 minutes for `tests/run-all-tests.sh` run serially, so a 20-minute step
|
|
211
|
+
cap was tighter than even the existing 25-minute job-level ceiling, not a
|
|
212
|
+
looser purpose-built budget as the commit claimed, and was never checked
|
|
213
|
+
against a real R0 `--run`. Removed; the job-level `timeout-minutes: 25`
|
|
214
|
+
remains the only cap on this step. Guarded by
|
|
215
|
+
`tests/test-tier-a-r0-timeout-budget.sh` (S-96 rework).
|
package/docs/v10/PROGRESS.md
CHANGED
|
@@ -1217,3 +1217,12 @@ sample.
|
|
|
1217
1217
|
| 16:26 | Trains 3 and 4 Tests: the build_supervisor flake again (3.10; 3.13); failed jobs rerun at 16:26:04Z. P0 S-102 in progress | |
|
|
1218
1218
|
| 16:39 | v9.57.0 published: Release run 36331009098 publish-npm success (after the Release Manager tag push and a full rerun). v9.59.0 published: Release run 36332036567 publish-npm success, update-homebrew success (S-83), native Docker builds running (S-85). npm dist-tags still read 9.56.0 at 16:39 (processing lag) | gh run view |
|
|
1219
1219
|
| 16:39 | Never published: v9.58.0 (superseded by v9.59.0, which contains it); v9.60.0 (1cde81a7), v9.61.0 (64676dce), v9.62.0 (9218ea04) carry the S-18 P9 regression; their Release runs were cancelled or failed. Tags exist from the 16:25/16:29 workaround | |
|
|
1220
|
+
|
|
1221
|
+
## 2026-09-27T18:12Z: pulse violations cleared before train 6's bump
|
|
1222
|
+
- WORKTREE_COUNT: 108 to 8. 41 removed at 17:49 (branch fully on main per `git cherry main <branch>` with 0 "+" lines, clean, not in use), 35 at 18:04 and 11 at 18:11 (same test, plus the read-only triage report), and 12 at 18:12 from the triage's SUPERSEDED/duplicate list. Every branch is kept; every uncommitted diff is saved under ~/loki-ci-logs/worktree-patches/<name>.patch before `git worktree remove --force`. The pulse now shows "Worktrees under .claude/worktrees: 8 (max 15)". The 8 left are worktrees locked by this session's own agents.
|
|
1223
|
+
- UNEVIDENCED_CLAIM: the check flagged lines added in old commits even after they were corrected (S-105 and S-106 already cited run and job IDs; the S-113 row now cites release commit 0103adfa). It now flags only lines still present verbatim on main (068d032f, test T30e; tests/test-v10-pulse.sh 81/81; a mutant that drops the fix fails T30e). The pulse now shows "0 flagged line(s)".
|
|
1224
|
+
|
|
1225
|
+
## Turn 300 drift audit (2026-09-27T18:23Z)
|
|
1226
|
+
- Drift: founder messages sent mid-turn were relayed into running batch-4 builders. At least 5 (S-133, S-136, S-142, S-144, S-145) stopped to investigate the pulse request, and S-144 dropped its slice entirely ("the relayed user request explicitly took priority"). None removed a worktree (each reported the worktree-isolation refusal). Correction: every future brief states that swarm-level requests (pulse, worktrees, BOARD) are Chief-of-Staff scope and builders stay on their slice; S-144 is re-dispatched in the next batch.
|
|
1227
|
+
- Pulse clean at 18:22Z: "Worktrees under .claude/worktrees: 14 (max 15)", "0 flagged line(s)", no VIOLATION lines. The remaining worktrees belong to running batch-4 builders.
|
|
1228
|
+
- Releases this hour: v9.63.0 (17:05:02Z), v9.64.0 (17:31:39Z), v9.65.0 (17:45:33Z), v9.66.0 (18:03:32Z). npm latest was 9.65.0 at 18:03 (curl registry.npmjs.org/loki-mode dist-tags).
|
package/loki-ts/dist/loki.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var at=Object.create;var{getPrototypeOf:ot,defineProperty:OG,getOwnPropertyNames:st}=Object;var nt=Object.prototype.hasOwnProperty;function rt($){return this[$]}var tt,et,$e=($,X,Q)=>{var z=$!=null&&typeof $==="object";if(z){var Z=X?tt??=new WeakMap:et??=new WeakMap,K=Z.get($);if(K)return K}Q=$!=null?at(ot($)):{};let J=X||!$||!$.__esModule?OG(Q,"default",{value:$,enumerable:!0}):Q;for(let q of st($))if(!nt.call(J,q))OG(J,q,{get:rt.bind($,q),enumerable:!0});if(z)Z.set($,J);return J};var Zq=($,X)=>()=>(X||$((X={exports:{}}).exports,X),X.exports);var Xe=($)=>$;function Qe($,X){this[$]=Xe.bind(null,X)}var B1=($,X)=>{for(var Q in X)OG($,Q,{get:X[Q],enumerable:!0,configurable:!0,set:Qe.bind(X,Q)})};var s=($,X)=>()=>($&&(X=$($=0)),X);var w5=import.meta.require;var WR={};B1(WR,{lokiDir:()=>h0,homeLokiDir:()=>GQ,findRepoRootForVersion:()=>LG,REPO_ROOT:()=>O1});import{resolve as h2,dirname as jG}from"path";import{fileURLToPath as ze}from"url";import{existsSync as Kq}from"fs";import{homedir as Ze}from"os";function Ke(){let $=HR;for(let X=0;X<6;X++){if(Kq(h2($,"VERSION"))&&Kq(h2($,"autonomy/run.sh")))return $;let Q=jG($);if(Q===$)break;$=Q}return h2(HR,"..","..","..")}function LG($){let X=$;for(let Q=0;Q<6;Q++){if(Kq(h2(X,"VERSION"))&&Kq(h2(X,"autonomy/run.sh")))return X;let z=jG(X);if(z===X)break;X=z}return h2($,"..","..","..")}function h0(){return process.env.LOKI_DIR??h2(process.cwd(),".loki")}function GQ(){return h2(Ze(),".loki")}var HR,O1;var k1=s(()=>{HR=jG(ze(import.meta.url));O1=Ke()});import{readFileSync as Je}from"fs";import{resolve as qe,dirname as Ve}from"path";import{fileURLToPath as Ye}from"url";function L9(){if(t3!==null)return t3;let $="9.
|
|
2
|
+
var at=Object.create;var{getPrototypeOf:ot,defineProperty:OG,getOwnPropertyNames:st}=Object;var nt=Object.prototype.hasOwnProperty;function rt($){return this[$]}var tt,et,$e=($,X,Q)=>{var z=$!=null&&typeof $==="object";if(z){var Z=X?tt??=new WeakMap:et??=new WeakMap,K=Z.get($);if(K)return K}Q=$!=null?at(ot($)):{};let J=X||!$||!$.__esModule?OG(Q,"default",{value:$,enumerable:!0}):Q;for(let q of st($))if(!nt.call(J,q))OG(J,q,{get:rt.bind($,q),enumerable:!0});if(z)Z.set($,J);return J};var Zq=($,X)=>()=>(X||$((X={exports:{}}).exports,X),X.exports);var Xe=($)=>$;function Qe($,X){this[$]=Xe.bind(null,X)}var B1=($,X)=>{for(var Q in X)OG($,Q,{get:X[Q],enumerable:!0,configurable:!0,set:Qe.bind(X,Q)})};var s=($,X)=>()=>($&&(X=$($=0)),X);var w5=import.meta.require;var WR={};B1(WR,{lokiDir:()=>h0,homeLokiDir:()=>GQ,findRepoRootForVersion:()=>LG,REPO_ROOT:()=>O1});import{resolve as h2,dirname as jG}from"path";import{fileURLToPath as ze}from"url";import{existsSync as Kq}from"fs";import{homedir as Ze}from"os";function Ke(){let $=HR;for(let X=0;X<6;X++){if(Kq(h2($,"VERSION"))&&Kq(h2($,"autonomy/run.sh")))return $;let Q=jG($);if(Q===$)break;$=Q}return h2(HR,"..","..","..")}function LG($){let X=$;for(let Q=0;Q<6;Q++){if(Kq(h2(X,"VERSION"))&&Kq(h2(X,"autonomy/run.sh")))return X;let z=jG(X);if(z===X)break;X=z}return h2($,"..","..","..")}function h0(){return process.env.LOKI_DIR??h2(process.cwd(),".loki")}function GQ(){return h2(Ze(),".loki")}var HR,O1;var k1=s(()=>{HR=jG(ze(import.meta.url));O1=Ke()});import{readFileSync as Je}from"fs";import{resolve as qe,dirname as Ve}from"path";import{fileURLToPath as Ye}from"url";function L9(){if(t3!==null)return t3;let $="9.67.0";if(typeof $==="string"&&$.length>0)return t3=$,t3;try{let X=Ve(Ye(import.meta.url)),Q=LG(X);t3=Je(qe(Q,"VERSION"),"utf-8").trim()}catch{t3="unknown"}return t3}var t3=null;var Jq=s(()=>{k1()});var LR={};B1(LR,{runOrThrow:()=>Re,run:()=>X1,readStreamCapped:()=>qq,commandVersion:()=>we,commandExists:()=>g5,ShellError:()=>CG,MAX_STDOUT_BYTES:()=>jR});async function qq($,X=jR){let Q=$.getReader(),z=new TextDecoder,Z="",K=0;try{while(K<X){let{done:J,value:q}=await Q.read();if(J)break;if(!q)continue;if(K+=q.byteLength,K>X){let V=q.byteLength-(K-X);Z+=z.decode(q.subarray(0,V),{stream:!0});break}Z+=z.decode(q,{stream:!0})}Z+=z.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return Z}async function X1($,X={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:X.env?{...process.env,...X.env}:process.env,cwd:X.cwd}),z,Z;if(X.timeoutMs&&X.timeoutMs>0)z=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}Z=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},X.timeoutMs);try{let[K,J,q]=await Promise.all([qq(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:J,exitCode:q}}finally{if(z)clearTimeout(z);if(Z)clearTimeout(Z)}}async function Re($,X={}){let Q=await X1($,X);if(Q.exitCode!==0)throw new CG(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function g5($){let X=Ie($),Q=await X1(["sh","-c",`command -v ${X}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function Ie($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function we($,X="--version"){if(!await g5($))return null;let z=await X1([$,X],{timeoutMs:5000});if(z.exitCode!==0)return null;return((z.stdout||z.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var jR=16777216,CG;var y8=s(()=>{CG=class CG extends Error{message;exitCode;stdout;stderr;constructor($,X,Q,z){super($);this.message=$;this.exitCode=X;this.stdout=Q;this.stderr=z;this.name="ShellError"}}});function g2($){return Pe?"":$}var Pe,p0,$5,Z1,l61,A1,f1,m5,n;var e7=s(()=>{Pe=(process.env.NO_COLOR??"").length>0;p0=g2("\x1B[0;31m"),$5=g2("\x1B[0;32m"),Z1=g2("\x1B[1;33m"),l61=g2("\x1B[0;34m"),A1=g2("\x1B[0;36m"),f1=g2("\x1B[1m"),m5=g2("\x1B[2m"),n=g2("\x1B[0m")});import{existsSync as he}from"fs";async function Z2(){if(BQ!==void 0)return BQ;let $="/opt/homebrew/bin/python3.12";if(he($))return BQ=$,$;let X=await g5("python3.12");if(X)return BQ=X,X;let Q=await g5("python3");return BQ=Q,Q}async function I4($,X={}){let Q=await Z2();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return X1([Q,"-c",$],X)}var BQ;var m2=s(()=>{y8()});var gR={};B1(gR,{runStatus:()=>Y00});import{existsSync as u5,readFileSync as T9,readdirSync as kR,statSync as SR}from"fs";import{resolve as A5,basename as $00}from"path";import{homedir as X00}from"os";function yR($){let X=Math.trunc($);if(X>=1e6)return`${(Math.trunc(X/1e6*10)/10).toFixed(1)}M`;if(X>=1000)return`${(Math.trunc(X/1000*10)/10).toFixed(1)}K`;return String(X)}function bR($,X,Q){if(X===0)return null;let z=Math.trunc($*100/X),Z=Math.trunc($*Yq/X);if(Z>Yq)Z=Yq;let K=Yq-Z,J=$5;if(z>=80)J=p0;else if(z>=50)J=Z1;let q="=".repeat(Math.max(0,Z))+" ".repeat(Math.max(0,K)),V=yR($),Y=yR(X);return` ${f1}${Q}${n} ${J}[${q}]${n} ${z}% (${V} / ${Y})`}async function z00(){if(await g5("jq"))return!0;return process.stdout.write(`${p0}Error: jq is required but not installed.${n}
|
|
3
3
|
`),process.stdout.write(`Install with:
|
|
4
4
|
`),process.stdout.write(` brew install jq (macOS)
|
|
5
5
|
`),process.stdout.write(` apt install jq (Debian/Ubuntu)
|
|
@@ -1349,4 +1349,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
|
|
|
1349
1349
|
`),2}case"start":{let{runStart:z}=await Promise.resolve().then(() => (ct(),pt));return z(Q)}default:return process.stderr.write(`Unknown command: ${X}
|
|
1350
1350
|
`),process.stderr.write(lt),2}}ER();process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var w61=await I61(Bun.argv.slice(2));process.exit(w61);
|
|
1351
1351
|
|
|
1352
|
-
//# debugId=
|
|
1352
|
+
//# debugId=FD68752494AD3AAE4780B7DCF7A891A7
|
package/mcp/__init__.py
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loki-mode",
|
|
3
3
|
"mcpName": "io.github.asklokesh/loki-mode",
|
|
4
|
-
"version": "9.
|
|
4
|
+
"version": "9.67.0",
|
|
5
5
|
"description": "Loki Mode by Autonomi. Autonomous spec-to-product system: takes a PRD, GitHub issue, OpenAPI/JSON/YAML, or one-line brief to a deployed app via the RARV-C closure loop with 8 quality gates. Provider-agnostic (Claude Code, OpenAI Codex, Cline, Aider, opencode).",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"agent",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "loki-mode",
|
|
4
4
|
"displayName": "Loki Mode",
|
|
5
|
-
"version": "9.
|
|
5
|
+
"version": "9.67.0",
|
|
6
6
|
"description": "Autonomous spec-to-product build system with a built-in trust layer (RARV-C closure loop, 8 quality gates, completion council). Ships Loki's spec-hardening, drift-detection, and deterministic PR verification commands plus the Loki MCP server.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Autonomi",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-
|
|
1
|
+
import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-XZrgDphJ.js";import{B as C}from"./Button-B_XqEF7a.js";import{T as $e}from"./trending-up-C31TrzUt.js";import{C as z}from"./clock-CJc_91vp.js";import{A as Be,U as ue,M as De}from"./Avatar-Dpy96tAc.js";import{A as J}from"./activity-BvHkXBYj.js";import{R as pe}from"./refresh-cw-B9_ksndc.js";import{G as ze}from"./globe-B6Xk69Fj.js";import{C as Le}from"./chevron-left-D-tXeEPI.js";import{C as je}from"./check-B5uToWdF.js";import{D as Y}from"./dollar-sign-BQiPo9Co.js";import{U as Te}from"./user-DUkbxibF.js";import{D as Me}from"./database-EdwkplCN.js";import{L as Ue}from"./lock-DcC9B8sE.js";import{S as Re}from"./scroll-text-DMGgO6uq.js";import{S as Ie}from"./shield-alert-Btnj6tmQ.js";/**
|
|
2
2
|
* @license lucide-react v0.577.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as e}from"./index-
|
|
1
|
+
import{j as e}from"./index-XZrgDphJ.js";import{C as r}from"./clock-CJc_91vp.js";import{C as a}from"./circle-alert-p3-Bg3sx.js";import{C as l}from"./check-B5uToWdF.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as p,j as t}from"./index-
|
|
1
|
+
import{r as p,j as t}from"./index-XZrgDphJ.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as T,r as l,j as e,G as ye,Q as je,F as Ne,h as we,T as U,Z as Se,a as N,V as Ce,S as Re,Y as Ee,X as Me,P as re,i as $e,g as Te,C as Pe,l as Ae,N as L,J as ze,K as Ie,O as _e,u as Le}from"./index-
|
|
1
|
+
import{c as T,r as l,j as e,G as ye,Q as je,F as Ne,h as we,T as U,Z as Se,a as N,V as Ce,S as Re,Y as Ee,X as Me,P as re,i as $e,g as Te,C as Pe,l as Ae,N as L,J as ze,K as Ie,O as _e,u as Le}from"./index-XZrgDphJ.js";import{P as K,S as De,E as Fe}from"./ErrorBoundary-BbyBJ4ZP.js";import{C as Oe,F as He,M as Be,H as qe,a as Ge,G as Ue,T as Ke}from"./thumbs-up-C_NLSPqa.js";import{C as ie}from"./check-B5uToWdF.js";import{C as Ve}from"./clock-CJc_91vp.js";import{D as We}from"./dollar-sign-BQiPo9Co.js";import{U as Qe}from"./upload-CLwWKjCG.js";import{L as V}from"./loader-circle-C8cKZhjP.js";/**
|
|
2
2
|
* @license lucide-react v0.577.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as o,j as e}from"./index-CxajNJVu.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
|
|
1
|
+
import{r as o,j as e}from"./index-XZrgDphJ.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
|
package/web-app/dist/assets/{EvidenceReceiptPanel-9vEpi5ir.js → EvidenceReceiptPanel-Btblkwfr.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as l,a as x,j as e}from"./index-
|
|
1
|
+
import{r as l,a as x,j as e}from"./index-XZrgDphJ.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as $,r as o,a as k,j as e,m as _,J as v,N as h,a5 as B,M,l as H}from"./index-
|
|
1
|
+
import{c as $,r as o,a as k,j as e,m as _,J as v,N as h,a5 as B,M,l as H}from"./index-XZrgDphJ.js";import{B as N}from"./Button-B_XqEF7a.js";import{C as y}from"./thumbs-up-C_NLSPqa.js";import{R as S}from"./refresh-cw-B9_ksndc.js";import{C as z}from"./circle-alert-p3-Bg3sx.js";import{U as q}from"./user-DUkbxibF.js";import{L as D}from"./loader-circle-C8cKZhjP.js";import{R as G}from"./rotate-ccw-CBogZEoT.js";/**
|
|
2
2
|
* @license lucide-react v0.577.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|