loki-mode 10.5.11 → 10.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -962
- package/SKILL.md +3 -3
- package/VERSION +1 -1
- package/autonomy/app-runner.sh +2 -1
- package/autonomy/completion-council.sh +40 -3
- package/autonomy/lib/doctor-fix.py +1 -1
- package/autonomy/lib/proof-generator.py +40 -84
- package/autonomy/lib/proof-template.html +7 -11
- package/autonomy/loki +118 -69
- package/autonomy/receipt_jwt.py +59 -14
- package/autonomy/run.sh +91 -124
- package/autonomy/trigger-server.py +2 -2
- package/autonomy/verify.sh +37 -2
- package/dashboard/__init__.py +1 -1
- package/dashboard/server.py +2 -2
- package/docs/COMPETITIVE-NEXT-10.md +3 -4
- package/docs/INSTALLATION.md +1 -1
- package/docs/README-FULL.md +977 -0
- package/docs/SIGNED-RECEIPTS.md +40 -82
- package/docs/TOOLS.md +0 -23
- package/docs/VERIFICATION-COST.md +2 -2
- package/docs/v10/ADOPTION-PLAN.md +1 -1
- package/docs/v10/BOARD.md +42 -22
- package/docs/v10/DECISIONS.md +11 -0
- package/docs/v10/ENGINE.md +4 -4
- package/docs/v10/FOUNDER-QUEUE.md +1 -0
- package/docs/v10/GUIDE.md +0 -4
- package/docs/v10/PROGRESS.md +43 -0
- package/loki-ts/dist/loki.js +587 -563
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/tools/gate-status.py +3 -46
- package/tools/receipt-attest.py +1 -1
- package/web-app/dist/assets/{AdminPage-bi-XcWhD.js → AdminPage-C8zraQ0u.js} +1 -1
- package/web-app/dist/assets/{Avatar-CmeIKHo6.js → Avatar-DnjIA4Ap.js} +1 -1
- package/web-app/dist/assets/{Badge-Bc3RMd7Y.js → Badge-C487hf0b.js} +1 -1
- package/web-app/dist/assets/{Button-Dc7yzWmJ.js → Button-5AWAEksl.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-C_aRTgNm.js → CockpitPage-B6_1gTFO.js} +1 -1
- package/web-app/dist/assets/{ComparePage-B8eqE3GD.js → ComparePage-DDbC8-yi.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BRVSyrME.js → ErrorBoundary-CWHKwjEp.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-DBkXGSAF.js → EvidenceReceiptPanel-MfJq92Ty.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-rRZ4rP-a.js → GitHubIssuesPanel-BBdijzdg.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-NMj2a_-3.js → GitHubPRsPanel-DjBHyymT.js} +1 -1
- package/web-app/dist/assets/{HomePage-YGPKiV9F.js → HomePage-B_6m7ITK.js} +2 -2
- package/web-app/dist/assets/{LoginPage-CVx7_jtD.js → LoginPage-OGgMvfjT.js} +1 -1
- package/web-app/dist/assets/{MagicPage-G9BuqW4T.js → MagicPage-m4MSfxWf.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-CrPo66D6.js → MetricsPage-D8Ea1ALe.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-CbjchFXV.js → NotFoundPage-ttvXL-7K.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-CmPoA170.js → ProjectPage-CDX8tSPV.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-CfVMc4nw.js → ProjectsPage-BQ73nYWf.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-6nZ-vONY.js → SettingsPage-B6k71q2g.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-CxdZjDzY.js → ShowcasePage-CNbwtr7D.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-Bu0kwwMe.js → SystemSettingsPage-CD2qys43.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-Ck6xWgOM.js → TeamsPage-DAmsRIVD.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-BduvcCsH.js → TemplatesPage-CcRyyUhL.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-BmleKz7Q.js → TerminalOutput-DRquxtQ1.js} +1 -1
- package/web-app/dist/assets/{activity-xUOENXj1.js → activity-DUDUi3Qd.js} +1 -1
- package/web-app/dist/assets/{bell-Do1DnngS.js → bell-tDpCOcHx.js} +1 -1
- package/web-app/dist/assets/{bot-Csus-lhk.js → bot-87IR4aTF.js} +1 -1
- package/web-app/dist/assets/{check-CDMuF2fW.js → check-C2Y2z-Ge.js} +1 -1
- package/web-app/dist/assets/{chevron-left-1pxhei7a.js → chevron-left-CsPFT88x.js} +1 -1
- package/web-app/dist/assets/{circle-alert-HufOSfwc.js → circle-alert-Cp2UJikd.js} +1 -1
- package/web-app/dist/assets/{clock-BoCMViPQ.js → clock-DZ1cwNyf.js} +1 -1
- package/web-app/dist/assets/{cloud-B7JfKA_r.js → cloud-q5TrIOV-.js} +1 -1
- package/web-app/dist/assets/{code-xml-BduQ3MqM.js → code-xml-0TNGOS3c.js} +1 -1
- package/web-app/dist/assets/{database-CQ9s31cU.js → database-g73vgDVx.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-CVJu5-A0.js → dollar-sign-DAKkR_MO.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-BPu1BX6Z.js → file-code-corner-DTAvdxjl.js} +1 -1
- package/web-app/dist/assets/{file-plus-CGa7y-QG.js → file-plus-D5SB-1Uk.js} +1 -1
- package/web-app/dist/assets/{globe-ClS0c8Cw.js → globe-j5YaNmx9.js} +1 -1
- package/web-app/dist/assets/{hammer-CeljzUTd.js → hammer-C9yoXOC6.js} +1 -1
- package/web-app/dist/assets/{index-Dn35XhiL.js → index--EayJsJ-.js} +3 -3
- package/web-app/dist/assets/{layers-CzGZ-NNL.js → layers-B4mxkWdH.js} +1 -1
- package/web-app/dist/assets/{loader-circle-Dy1j6q2e.js → loader-circle-CP-qD1W2.js} +1 -1
- package/web-app/dist/assets/{lock-pmDyRsWL.js → lock-DwHNUSTU.js} +1 -1
- package/web-app/dist/assets/{package-C1dXDph_.js → package-BxLWioQ8.js} +1 -1
- package/web-app/dist/assets/{plus-CKPSHefh.js → plus-B-43Byzl.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-CRmwRgDw.js → refresh-cw-5s47zAFV.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-Br04gZR3.js → rotate-ccw-BewZ8_Rx.js} +1 -1
- package/web-app/dist/assets/{scroll-text-BHjpthNc.js → scroll-text-DPNpHL-Z.js} +1 -1
- package/web-app/dist/assets/{server-Db3IfTpl.js → server-hL8_-vRq.js} +1 -1
- package/web-app/dist/assets/{shield-alert-jJXWKLDZ.js → shield-alert-DAGc2aLO.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-BksBTkqT.js → thumbs-up-DRGzcWEH.js} +1 -1
- package/web-app/dist/assets/{trash-2-CzXuGa-4.js → trash-2-Bo_YPIqS.js} +1 -1
- package/web-app/dist/assets/{trending-down-c_JXJq0s.js → trending-down-BQ1cK9F3.js} +1 -1
- package/web-app/dist/assets/{trending-up-DtvURYKn.js → trending-up-BpnkTO1T.js} +1 -1
- package/web-app/dist/assets/{upload-BSsOPrmR.js → upload-DDdQNxmW.js} +1 -1
- package/web-app/dist/assets/{usePolling-CFWdgkmg.js → usePolling-z_FXsGz7.js} +1 -1
- package/web-app/dist/assets/{user-CL-HjV4R.js → user-obPH42HX.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/tools/signing-status.py +0 -292
package/docs/SIGNED-RECEIPTS.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Signed Evidence Receipts (operator guide)
|
|
2
2
|
|
|
3
|
-
Status:
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Status: receipts are signed by default with an Ed25519 attestation. The key
|
|
4
|
+
is generated on first run, or supplied through `LOKI_RECEIPT_SIGNING_KEY` /
|
|
5
|
+
`LOKI_RECEIPT_SIGNING_KEY_FILE`. This guide covers what that buys you and what it
|
|
6
|
+
does not.
|
|
6
7
|
|
|
7
8
|
## Why this matters
|
|
8
9
|
|
|
@@ -14,89 +15,44 @@ recomputes the integrity hash still passes verification, and the verifier
|
|
|
14
15
|
honestly reports `generator_trusted: true`.
|
|
15
16
|
|
|
16
17
|
That limitation is deliberately locked into the test suite
|
|
17
|
-
(`tests/test-proof-forgery-defense.sh`, case c) rather than papered over
|
|
18
|
-
v7.111.0 the project removed its own earlier "non-forgeable" claim once it was
|
|
19
|
-
found to be false on that path.
|
|
18
|
+
(`tests/test-proof-forgery-defense.sh`, case c) rather than papered over.
|
|
20
19
|
|
|
21
|
-
**Signing is what closes that gap.**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
That is the difference between "defense-in-depth" and neutral non-forgeability,
|
|
25
|
-
and it is the property an auditor or a customer's security team actually needs.
|
|
20
|
+
**Signing is what closes that gap.** An Ed25519 attestation over the receipt
|
|
21
|
+
digest lets a third party who holds your public key set confirm the receipt came
|
|
22
|
+
from a holder of your key and has not been altered since.
|
|
26
23
|
|
|
27
|
-
##
|
|
24
|
+
## Migrating from `LOKI_PROOF_GPG_KEY`
|
|
28
25
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
carries a `verification.gpg_signature` field (ASCII-armored, detached).
|
|
36
|
-
|
|
37
|
-
Properties worth knowing before you rely on it:
|
|
38
|
-
|
|
39
|
-
- **Default OFF.** With `LOKI_PROOF_GPG_KEY` unset, no signature field is
|
|
40
|
-
emitted and the receipt bytes are byte-identical to before.
|
|
41
|
-
- **Local only.** It shells out to the `gpg` on your PATH
|
|
42
|
-
(`gpg --batch --yes --armor --detach-sign --local-user <key> --output -`).
|
|
43
|
-
No network call, no external service, no key ever leaves the machine.
|
|
44
|
-
- **Best effort, never blocking.** If `gpg` is missing, the key is not found, or
|
|
45
|
-
signing times out (30s), the proof is still emitted, unsigned. Signing must
|
|
46
|
-
never be able to fail a build.
|
|
47
|
-
- **Signed over the canonical pre-verification bytes**, the same form the
|
|
48
|
-
verifier reconstructs, so the signature and the integrity hash always cover
|
|
49
|
-
identical content.
|
|
50
|
-
|
|
51
|
-
## Verifying a signed receipt
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
loki proof verify <id>
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
The JSON result carries a `gpg_ok` field with three states, and the tri-state is
|
|
58
|
-
the point:
|
|
59
|
-
|
|
60
|
-
| `gpg_ok` | Meaning |
|
|
61
|
-
|---|---|
|
|
62
|
-
| `true` | good signature from a key the verifier trusts |
|
|
63
|
-
| `false` | signature present but verification FAILED (treat as tampered) |
|
|
64
|
-
| `"n/a"` | no signature present, or `gpg` unavailable on the verifying machine |
|
|
65
|
-
|
|
66
|
-
`generator_trusted` is `true` whenever `gpg_ok` is not `true`. Read that field:
|
|
67
|
-
it is the receipt telling you honestly how much it is worth.
|
|
68
|
-
|
|
69
|
-
A verifying party needs your public key in their keyring. Distribute it however
|
|
70
|
-
you already distribute release-signing keys (a keyserver, your website, your
|
|
71
|
-
release artifacts). Loki deliberately does not invent a key-distribution
|
|
72
|
-
mechanism.
|
|
73
|
-
|
|
74
|
-
## For enterprises
|
|
75
|
-
|
|
76
|
-
The combination that matters for an audit trail:
|
|
26
|
+
The gpg signing layer was deleted. There is one signing family for both engines:
|
|
27
|
+
`LOKI_RECEIPT_SIGNING_KEY` and `LOKI_RECEIPT_SIGNING_KEY_FILE`. A process that
|
|
28
|
+
still sets the old variable gets one warning naming the replacement and keeps
|
|
29
|
+
running; the receipt is signed with the default key. Old receipts that carry a
|
|
30
|
+
`verification.gpg_signature` still verify for integrity, and the deploy gate reads them as UNSIGNED for
|
|
31
|
+
provenance.
|
|
77
32
|
|
|
78
|
-
|
|
79
|
-
2. Archive `.loki/proofs/<run_id>/` alongside the merged commit.
|
|
80
|
-
3. Any reviewer, auditor, or downstream consumer can then verify offline, with
|
|
81
|
-
no access to Loki, your CI, or the original machine.
|
|
33
|
+
## What the deploy gate trusts
|
|
82
34
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
35
|
+
`loki deploy --execute` verifies a receipt against the local signing key plus
|
|
36
|
+
`LOKI_RECEIPT_RETIRED_PUBKEYS`. That proves only "a holder of this key signed
|
|
37
|
+
it", not an independent build. A receipt signed by a key the gate does not hold
|
|
38
|
+
(another machine, a rotated-away key, a key set only at generate time) reads
|
|
39
|
+
UNCHECKED and refuses; it is never reported as TAMPERED. Keep retired public
|
|
40
|
+
keys listed after a rotation so old receipts stay VERIFIED.
|
|
86
41
|
|
|
87
42
|
## Honest limits
|
|
88
43
|
|
|
89
|
-
- A signature proves **provenance and integrity**, not correctness.
|
|
90
|
-
receipt
|
|
91
|
-
|
|
92
|
-
VERIFIED) is computed from facts and remains the correctness statement.
|
|
44
|
+
- A signature proves **provenance and integrity**, not correctness. The
|
|
45
|
+
receipt's own headline (VERIFIED / VERIFIED WITH GAPS / NOT VERIFIED) is
|
|
46
|
+
computed from facts and remains the correctness statement.
|
|
93
47
|
- Signing does not retroactively protect receipts generated unsigned.
|
|
94
|
-
- If the signing key is compromised,
|
|
95
|
-
|
|
48
|
+
- If the signing key is compromised, receipts from that key are worth exactly
|
|
49
|
+
what the key is worth. Normal key hygiene applies.
|
|
50
|
+
- Without the python `cryptography` package no attestation is attached and
|
|
51
|
+
`loki doctor` says so.
|
|
96
52
|
|
|
97
53
|
## Attestation: provenance without a key exchange
|
|
98
54
|
|
|
99
|
-
|
|
55
|
+
A local key settles the local case, where the operator already holds it. It
|
|
100
56
|
does not survive the remote path. A submitter who ran `loki start --remote`
|
|
101
57
|
never had access to the cluster, so "import the publisher's public key" is the
|
|
102
58
|
step where independent verification stops happening in practice.
|
|
@@ -159,7 +115,7 @@ receives it, and that asymmetry is enforced by the chart rather than left to
|
|
|
159
115
|
convention: a worker runs model-directed code, so a key there would let a build
|
|
160
116
|
sign its own receipt.
|
|
161
117
|
|
|
162
|
-
Left unset, the receiver serves receipts unsigned and `/.well-known/jwks.json`
|
|
118
|
+
Left unset, the receiver never auto-generates a key (a container-layer key would be lost on `docker compose down/up`, orphaning old receipts). It serves receipts unsigned and `/.well-known/jwks.json`
|
|
163
119
|
returns an empty key set -- honest, but a `--remote` submitter then has no way
|
|
164
120
|
to prove who produced their receipt without an out-of-band key import.
|
|
165
121
|
|
|
@@ -182,12 +138,13 @@ mount) on the `receiver` service. Never commit that key file.
|
|
|
182
138
|
|
|
183
139
|
| Variable | Effect |
|
|
184
140
|
|---|---|
|
|
185
|
-
| `LOKI_RECEIPT_SIGNING_KEY_FILE` | PEM path to the Ed25519 private key (normal Kubernetes mounted-secret path). |
|
|
141
|
+
| `LOKI_RECEIPT_SIGNING_KEY_FILE` | PEM path to the Ed25519 private key (normal Kubernetes mounted-secret path). Default for local runs only: `~/.loki/keys/receipt-ed25519.pem`, a machine-local key generated on first use (a signature proves this machine signed the receipt) (PKCS8, mode 0600, created atomically so concurrent first runs share one key). The private key is never printed, logged, or written to a receipt. Never commit it. |
|
|
186
142
|
| `LOKI_RECEIPT_SIGNING_KEY` | The PEM inline, for non-Kubernetes deployments. |
|
|
187
143
|
| `LOKI_RECEIPT_RETIRED_PUBKEYS` | Colon-separated PEM paths for retired public keys. |
|
|
188
144
|
|
|
189
|
-
|
|
190
|
-
|
|
145
|
+
With neither variable set, the default key file above is used (and created if
|
|
146
|
+
missing). If the key cannot be created or read, no attestation is attached and
|
|
147
|
+
the receipt keeps its existing verdict.
|
|
191
148
|
|
|
192
149
|
The same two variables also work for a **local** build. Set
|
|
193
150
|
`LOKI_RECEIPT_SIGNING_KEY_FILE` before `loki start` and the generator attests
|
|
@@ -205,12 +162,13 @@ witnessed this build."
|
|
|
205
162
|
|
|
206
163
|
## Source
|
|
207
164
|
|
|
208
|
-
- Signing: `autonomy/lib/proof-generator.py` (
|
|
209
|
-
`
|
|
210
|
-
- Verification: `autonomy/lib/proof-verify.py`
|
|
165
|
+
- Signing: `autonomy/lib/proof-generator.py` (attestation block) and
|
|
166
|
+
`autonomy/receipt_jwt.py` (`load_signing_key`)
|
|
167
|
+
- Verification: `autonomy/lib/proof-verify.py`
|
|
211
168
|
- Scope test: `tests/test-proof-forgery-defense.sh`
|
|
212
169
|
- Attestation: `autonomy/receipt_jwt.py`; served by `autonomy/trigger-server.py`
|
|
213
170
|
(`_attest`, `_handle_jwks`); checked by `loki_proof_attestation_check` and
|
|
214
171
|
`loki_remote_attestation_status` in `autonomy/loki`
|
|
215
172
|
- Attestation tests: `tests/test-receipt-jwt-attestation.sh`,
|
|
216
|
-
`tests/test-remote-attestation-verdict.sh`, `tests/test-proof-verify-jwks.sh
|
|
173
|
+
`tests/test-remote-attestation-verdict.sh`, `tests/test-proof-verify-jwks.sh`,
|
|
174
|
+
`tests/test-receipt-signing-discoverability.sh`
|
package/docs/TOOLS.md
CHANGED
|
@@ -246,28 +246,6 @@ $ python3 tools/receipt-find.py /tmp/ws
|
|
|
246
246
|
|
|
247
247
|
Filters: `--min-usd`, `--max-usd`, `--failed-only`, `--since YYYY-MM-DD`.
|
|
248
248
|
|
|
249
|
-
### `signing-status.py`
|
|
250
|
-
|
|
251
|
-
**Answers:** can this machine produce SIGNED receipts? It proves the answer by
|
|
252
|
-
attempting a sign-and-verify round trip rather than assuming from config.
|
|
253
|
-
|
|
254
|
-
```
|
|
255
|
-
$ python3 tools/signing-status.py
|
|
256
|
-
Receipt signing: UNSIGNED receipts prove integrity but NOT origin
|
|
257
|
-
|
|
258
|
-
gpg installed: /opt/homebrew/bin/gpg
|
|
259
|
-
LOKI_PROOF_GPG_KEY: not set
|
|
260
|
-
sign+verify proof: not proven
|
|
261
|
-
|
|
262
|
-
Why: LOKI_PROOF_GPG_KEY is not set
|
|
263
|
-
|
|
264
|
-
Nothing is broken. Signing is opt-in and off. Turn it on to prove
|
|
265
|
-
a receipt came from you and not merely that its bytes are intact.
|
|
266
|
-
|
|
267
|
-
Next: gpg --list-secret-keys --keyid-format=long # then: export LOKI_PROOF_GPG_KEY=<key-id>
|
|
268
|
-
```
|
|
269
|
-
Exit 2 here: signing is off, so the question could not be answered affirmatively.
|
|
270
|
-
|
|
271
249
|
---
|
|
272
250
|
|
|
273
251
|
## Set up a merge gate
|
|
@@ -288,7 +266,6 @@ Merge gate status for /tmp/ws
|
|
|
288
266
|
COMPONENT STATE DETAIL
|
|
289
267
|
policy OK /tmp/ws/.loki-policy.json is valid and enforces: --require-receipt
|
|
290
268
|
baseline PROBLEM NO BASELINE: no baseline pinned. Pin one with: tools/baseline-pin.py set <workspace>
|
|
291
|
-
signing UNKNOWN signing is opt-in and off (LOKI_PROOF_GPG_KEY unset)
|
|
292
269
|
cost_history UNKNOWN no measured cost history; record a run first.
|
|
293
270
|
would_run OK yes: ci-gate would enforce the loaded policy on the next run
|
|
294
271
|
|
|
@@ -49,7 +49,7 @@ every gate and still be wrong.
|
|
|
49
49
|
and the headline into a mutually consistent lie and recomputes the hash will
|
|
50
50
|
pass verification. That is defense in depth, not non-forgeability. Neutral
|
|
51
51
|
non-forgeability requires the signed path
|
|
52
|
-
(
|
|
52
|
+
(the Ed25519 attestation, see [SIGNED-RECEIPTS.md](SIGNED-RECEIPTS.md)). We removed
|
|
53
53
|
our own "non-forgeable" claim in v7.111.0 after finding it false on that path.
|
|
54
54
|
|
|
55
55
|
**The tests gate depends on correctly identifying YOUR test runner, and it has
|
|
@@ -145,7 +145,7 @@ which is wrong in exactly that way: a drifted-but-intact receipt also exits 1.
|
|
|
145
145
|
**What this does NOT establish.** Integrity is not provenance. On the unsigned
|
|
146
146
|
path a party who rewrites the facts AND recomputes the digest passes this check
|
|
147
147
|
-- see the forgeability limit above. Provenance requires the signed path
|
|
148
|
-
(
|
|
148
|
+
(the Ed25519 attestation, [SIGNED-RECEIPTS.md](SIGNED-RECEIPTS.md)), and the remote
|
|
149
149
|
client reports the two separately for that reason: VERIFIED, UNSIGNED,
|
|
150
150
|
UNCHECKED and TAMPERED are four distinct verdicts, never collapsed.
|
|
151
151
|
|
|
@@ -222,7 +222,7 @@ Architect: opus. Source: the founder directive (2026-09-30, from building to pro
|
|
|
222
222
|
- CTO decision: old proofs with `gpg_signature` still verify for integrity, and read as UNSIGNED for provenance.
|
|
223
223
|
- Files: autonomy/lib/proof-generator.py, autonomy/lib/proof-template.html, autonomy/loki (signing lines 1283, 9683, 14101-14110, 14532, 36680-36683), tools/signing-status.py (delete), tests/test_signing_status.py (delete), tools/gate-status.py, tools/receipt-attest.py, tests/test-receipt-signing-discoverability.sh, tests/test-deploy-receipt-gate.sh, loki-ts/src/commands/doctor.ts (signing block 484-496 and 1113-1127), README.md (2 lines), docs/TOOLS.md, docs/VERIFICATION-COST.md, docs/SIGNED-RECEIPTS.md.
|
|
224
224
|
- Wall check:
|
|
225
|
-
- `
|
|
225
|
+
- `LOKI_PROOF_GPG_KEY` appears only in migration messages, docs/v10, tests and dist (a guard test).
|
|
226
226
|
- With a fresh HOME and no env, a legacy proof carries a JWT and `loki proof verify` exits 0 (G5, legacy route).
|
|
227
227
|
- Commands: `bash tests/test-receipt-signing-discoverability.sh && bash tests/test-deploy-receipt-gate.sh && python3 -m pytest tests/test_receipt_attest.py -q`
|
|
228
228
|
- Tier: HIGH. Budget: large negative outside core.
|
package/docs/v10/BOARD.md
CHANGED
|
@@ -452,7 +452,7 @@ set is declared to avoid overlap with those and with each other.
|
|
|
452
452
|
| E-122 | Scorecard headline pair (loki on sonnet vs raw opus) is green on cost only at 0.5x raw or less, per D41; add the rule and a test | eval/loki10/scorecard, eval/loki10/test-scorecard.sh | LOW | fixture at 0.6x raw cost is red on the headline pair, 0.5x is green (red first) | released@2026-09-28T23:18Z | Source: S41-02 Tech Lead review note 5. Depends on S41-02. Dispatched 22:01Z. Built a4bc79b9 (0.6x headline red on the old script); Tech Lead APPROVE (label-matched pair, inclusive 0.5x, null stays red); merged; test-scorecard 27/0. Released in v10.5.5 (merge 901466ef is an ancestor of v10.5.5). |
|
|
453
453
|
| E-123 | tests/test-security-scan-coverage.sh runs only in local-ci.sh, never in CI, so its .gitleaksignore baseline drifted unnoticed (6358e0a6); register it in tests/run-all-tests.sh and shard-durations so CI Tests run it | tests/run-all-tests.sh, tests/shard-durations.tsv | LOW | test-shard-coverage.sh lists it; the suite passes on main (31/0) | released@2026-09-28T23:18Z | Source: E-114 opus review item 4. Depends on E-114. Dispatched 22:01Z. Built fc3e17b1; Tech Lead APPROVE (self-contained text checks, rows match format); merged; scan-coverage 31/0, shard coverage 19/0. Released in v10.5.5 (merge a553be40 is an ancestor of v10.5.5). |
|
|
454
454
|
| E-124 | verifyPreSealedWall cross-checks the carried oracle_normalizers_sha256 against the current oracle seal (today only cases and coverage hashes are checked) | loki-ts/src/engine10/modernize/presealed_wall.ts, its test | LOW | a Wall sealed against one normalizer hash fails verify after the oracle normalizers change (red first) | released@2026-09-28T23:18Z | Source: M-14 r3 opus review advisory. Dispatched 22:09Z. Released in v10.5.5 (merge 8a99554c is an ancestor of v10.5.5). |
|
|
455
|
-
| E-125 | Wall red classification: real pytest prints collection-time AttributeError/NameError frames as "path.py:N: in <module>", not "File ...", so wall.ts never classifies them red (always not_run, fail-safe but the D42 red class cannot fire); parse both frame shapes and replace the B3 test fixtures with real pytest output | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall.test.ts | MEDIUM | a real pytest run (captured fixture) with an in-repo AttributeError classifies red; third-party frame stays not_run; core stays under 5000 |
|
|
455
|
+
| E-125 | Wall red classification: real pytest prints collection-time AttributeError/NameError frames as "path.py:N: in <module>", not "File ...", so wall.ts never classifies them red (always not_run, fail-safe but the D42 red class cannot fire); parse both frame shapes and replace the B3 test fixtures with real pytest output | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall.test.ts | MEDIUM | a real pytest run (captured fixture) with an in-repo AttributeError classifies red; third-party frame stays not_run; core stays under 5000 | released@2026-09-30T21:23Z | Source: S41-16 r2 opus review (ran real pytest 9.0.2). WIND-DOWN 2026-09-28: opus r1 REJECT (B1 owner of missing attribute, B2 space in frame path, B3 captured-stdout injection, B4 chained exception) fixed at 845c9231 on slice-E-125: classifies on the pytest short-summary ERROR line, requires module '<name>' has no attribute with <name> under the repo; wall.test.ts 26/0, r3-B1 to B4 red on e6d2ddec then green. Core 4,998 (cap 4,999). Full engine10 suite not re-run after r3. NEXT: run tests/engine10 plus seal and budget, then opus r2 review, then merge. Released in v10.5.11 (merge 191fdc5b is an ancestor of v10.5.11). |
|
|
456
456
|
| E-126 | D41 item 3: repo memory, record the verified build and test command, flaky list and failure causes per repo, cold vs warm | loki-ts/src/e10ext/repomemory.ts, loki-ts/tests/e10ext/repomemory.test.ts | MEDIUM | cd loki-ts and bun test tests/e10ext/repomemory.test.ts | released@2026-09-30T18:50Z | Source: D41 item 3, SCORECARD-PLAN section 7. Evidence: engine10/cache.ts:87 recordFlaky and :108 topFailures exist, the verified command is not captured. Data only per D42. Released in v10.5.7 (merge fab5d59e is an ancestor of v10.5.7). |
|
|
457
457
|
| E-127 | D41 item 5 (backlog throughput): fetch N issues for a label or milestone as pure data | loki-ts/src/e10ext/issues.ts, loki-ts/tests/e10ext/issues.test.ts | MEDIUM | cd loki-ts and bun test tests/e10ext/issues.test.ts | released@2026-09-30T18:50Z | Source: D41 item 5. Evidence: engine10/fetch_issue.ts:35 takes one ref only. Released in v10.5.7 (merge 0c6fa258 is an ancestor of v10.5.7). |
|
|
458
458
|
| E-128 | BACKLOG 147: P7 scanner misses a useMemo factory that calls an already-registered fabricator instead of returning a literal | tests/moat/p7-no-fabricated-data.sh | HIGH | bash tests/moat/p7-no-fabricated-data.sh | released@2026-09-30T18:50Z | Source: BACKLOG 147; the file's own comment at p7-no-fabricated-data.sh:987 names the gap. Same file as E-131: one engineer takes both. Released in v10.5.7 (merge 8a4e1510 is an ancestor of v10.5.7). |
|
|
@@ -477,7 +477,7 @@ set is declared to avoid overlap with those and with each other.
|
|
|
477
477
|
| E-147 | tests/test-trust-core-probe-isolation.sh:37 wraps tests/test-trust-core-tests-detect.sh in `timeout 50`; on a loaded CI runner it hit rc=124 after all 9 visible cases passed (main Tests run 36760845105, shard 3/8, SHA 2b0d2e4d; the same SHA passed on train/4 run 36760063079). Measure the inner suite on CI, set the budget from the measurement with margin, and report the case that was running at the kill so a real hang still fails loudly | tests/test-trust-core-probe-isolation.sh, tests/shard-durations.tsv if its row changes | LOW | inner suite under a 3x load stressor passes; a planted hang still fails with the case name | released@2026-09-30T19:22Z | Source: D44 MAIN_RED on 2b0d2e4d (timeout flake). Rerun of the failed job in flight. Released in v10.5.8 (merge 2b0d2e4d is an ancestor of v10.5.8). |
|
|
478
478
|
| E-148 | Review follow-ups: test-stop-process-group.sh still kills by `pkill -f "loki-$PGTEST_TAG"` (pattern kill, forbidden by CLAUDE.md): replace with recorded PIDs or a process-group kill; test-audit-chain-cross-file.sh test 1 reads the real ~/.loki/dashboard/audit (fails on hosts with old tampered data): make it hermetic; E-147 timeout message says "after all cases passed" when there was zero output: say "no PASS output (possible hang before the first case)" | tests/test-stop-process-group.sh, tests/test-audit-chain-cross-file.sh, tests/test-trust-core-probe-isolation.sh | LOW | each suite passes on a host with a tampered ~/.loki audit file; no pkill -f remains | merged@2026-09-30T19:53Z | Source: E-143 and E-147 TL reviews (APPROVE with notes). |
|
|
479
479
|
| E-149 | loki-ts/tests/engine10/modernize/java_capture.test.ts "unitClassesFromGraph (M-04 integration)" times out at bun's 5s default under CI load (5169ms, Coverage run 36764748814 on train/5 1cd5feac; also failed on train/2 and in a local full run): measure, make it cheaper or set an explicit measured timeout; sweep modernize tests over 2.5s | loki-ts/tests/engine10/modernize/*.test.ts | LOW | before/after durations under 3x load; bun test tests/engine10/modernize 0 fail | released@2026-09-30T20:08Z | Source: D44 train/5 red (Coverage). Rerun of the failed job in flight. Released in v10.5.10 (merge 2394dc4a is an ancestor of v10.5.10). |
|
|
480
|
-
| E-151 | Release blocker guard: v10.5.10 (69ebc03e) shipped loki-ts/dist/loki.js.map stale because the bump changed it (version literal 10.5.9 to 10.5.10 changed length, shifting mappings) and the release commit staged a fixed file list. scripts/release.sh --bump-only should print every file it changed (including dist maps), and a check (in release.sh or a pre-push rule for "release: v*" commits) should refuse a release commit that leaves a stamped tracked file modified in the worktree | scripts/release.sh, tests/test-release-dist-guard.sh | LOW | fixture: a bump that changes the map, commit without it, check refuses; with it, passes |
|
|
480
|
+
| E-151 | Release blocker guard: v10.5.10 (69ebc03e) shipped loki-ts/dist/loki.js.map stale because the bump changed it (version literal 10.5.9 to 10.5.10 changed length, shifting mappings) and the release commit staged a fixed file list. scripts/release.sh --bump-only should print every file it changed (including dist maps), and a check (in release.sh or a pre-push rule for "release: v*" commits) should refuse a release commit that leaves a stamped tracked file modified in the worktree | scripts/release.sh, tests/test-release-dist-guard.sh | LOW | fixture: a bump that changes the map, commit without it, check refuses; with it, passes | released@2026-09-30T21:23Z | Source: v10.5.10 release; interim procedure: assert `git status --porcelain` is empty after the release commit before pushing. Map corrected on the next train. Released in v10.5.11 (merge bd5834a9 is an ancestor of v10.5.11). |
|
|
481
481
|
| E-152 | release.sh --bump-only "stage these files:" list must print a copy-paste command that works: loki-ts/dist is gitignored, so `git add loki-ts/dist/loki.js` refuses (seen 19:58Z on train/7); print `git add -f` for paths under an ignored directory (git check-ignore) and plain `git add` otherwise | scripts/release.sh, tests/test-release-dist-guard.sh | LOW | fixture with an ignored-but-tracked dist file: the printed command stages it | ready@2026-09-30T19:58Z | Source: first live use of E-151 --check-clean caught the unstaged dist (rc=1). |
|
|
482
482
|
| E-153 | Incident 20:16Z: a reviewer's fixture setup ran `git commit` with the MAIN CHECKOUT as cwd, committing author `t <t@t>` "init" that replaced the real package.json with a fixture and added sum.js/sum.test.js (local only, never pushed; undone with `git reset --keep 1c96ab16`). Guard: a pre-commit hook in .githooks refusing any commit in this repository whose author email is not the repo-local identity (git config user.email) unless LOKI_ALLOW_FOREIGN_AUTHOR=1, so fixture commits made in the wrong cwd fail loudly; fixture commits in real temp repos are unaffected | .githooks/pre-commit, tests/test-pre-commit-author-guard.sh | LOW | red first: in a scratch clone with the hook installed, `git -c user.email=t@t commit` is refused; the repo identity commits | ready@2026-09-30T20:17Z | Source: loki-seal r2 review fixture (agent stopped at 20:17Z). Reviewer prompts now require `git -C "$FIXTURE"` and a pwd check under LOKI_RUN_TMP. |
|
|
483
483
|
| S41-10b | Static-first fixed-rules block for the implement and fix briefs (S41-10 card remainder): a byte-identical rules block in the cache-stable prefix, per-task context after it; drive-letter and ~ plan paths filtered like absolute ones | loki-ts/src/engine10/stages/implement.ts, fix.ts (prefix only), loki-ts/src/e10ext/context.ts and tests | MEDIUM | red first: two different tasks produce byte-identical prefix bytes; core net-zero lines | merged@2026-09-30T19:19Z | Source: S41-10 reviews (APPROVE r2, remainder). |
|
|
@@ -600,24 +600,44 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
|
|
|
600
600
|
|
|
601
601
|
| ID | Goal | File set | Tier | Wall check | Status | Notes |
|
|
602
602
|
|---|---|---|---|---|---|---|
|
|
603
|
-
| A-01 | Release to `next`: both `npm publish` lines in release.yml get `--tag next`; a `promote` workflow (workflow_dispatch, exact version) runs the first-run gate against `loki-mode@<version>` installed from npm and only then runs `npm dist-tag add loki-mode@<version> latest`, moves Docker `:latest` and updates Homebrew; fix every check that assumes latest equals the newest release (E-135 post-release smoke, v10-pulse npm-latest comparison); fold in E-152 | .github/workflows/release.yml, .github/workflows/promote.yml (new), scripts/release.sh, scripts/v10-pulse.sh, tests for each | HIGH | fixture: release path publishes with --tag next; promote refuses without a gate pass on that exact version |
|
|
604
|
-
| A-02 | First-run gate: scripts/first-run-gate.sh (throwaway HOME, bugrepo from firstrun-repro/bugrepo-original, the README's default entry point, stub-provider mode for CI, real-provider mode for promotion) asserting: exit 0 only if npm test fully green; no new files outside the fix except .loki/; printed receipt digest equals what loki verify checks; loki verify OK exit 0; receipt signed; output 15 lines or fewer without --verbose; wall time recorded. Step 1: reproduce each defect from the directive on current main and classify code bug vs machine artifact | scripts/first-run-gate.sh, tests/test-first-run-gate.sh, docs/v10/FIRST-RUN-GATE.md (defect table) | HIGH | gate runs in stub mode in CI as a NON-required job; the defect table cites command and rc per defect |
|
|
605
|
-
| A-03 | Tier 0 architecture split (opus Architect): slice items 1 Seal correctness, 2 clean first run, 3 signed by default, 5 honest outcomes into non-overlapping file sets with Wall checks, one writer per file, shrink-or-flat per D33; Seal correctness builds on slice-E-125 | docs/v10/ADOPTION-PLAN.md | HIGH | every slice card has a file set, a Wall check tied to a gate assertion, and a line budget |
|
|
606
|
-
| A-04 | loki-seal: a Claude Code skill plus hook that runs the repo's real test suite on the current diff, refuses done on red or on deleted, skipped, xfailed or weakened tests or CI config (diff scan plus a tree hash of existing tests), prints a 5-line receipt; zero model cost, no dangerous flags; self-contained, no LICENSE file; SUBMIT.md drafts only; a 20-second vhs or asciinema script | packages/loki-seal/** | HIGH | fixture repos: deleting a failing test is blocked; a real fix passes; each weakening class caught |
|
|
607
|
-
| A-
|
|
608
|
-
| A-
|
|
609
|
-
| A-
|
|
603
|
+
| A-01 | Release to `next`: both `npm publish` lines in release.yml get `--tag next`; a `promote` workflow (workflow_dispatch, exact version) runs the first-run gate against `loki-mode@<version>` installed from npm and only then runs `npm dist-tag add loki-mode@<version> latest`, moves Docker `:latest` and updates Homebrew; fix every check that assumes latest equals the newest release (E-135 post-release smoke, v10-pulse npm-latest comparison); fold in E-152 | .github/workflows/release.yml, .github/workflows/promote.yml (new), scripts/release.sh, scripts/v10-pulse.sh, tests for each | HIGH | fixture: release path publishes with --tag next; promote refuses without a gate pass on that exact version | released@2026-09-30T21:23Z | Blocks every release until merged (releases held since 20:02Z). Released in v10.5.11 (merge cec20054 is an ancestor of v10.5.11). |
|
|
604
|
+
| A-02 | First-run gate: scripts/first-run-gate.sh (throwaway HOME, bugrepo from firstrun-repro/bugrepo-original, the README's default entry point, stub-provider mode for CI, real-provider mode for promotion) asserting: exit 0 only if npm test fully green; no new files outside the fix except .loki/; printed receipt digest equals what loki verify checks; loki verify OK exit 0; receipt signed; output 15 lines or fewer without --verbose; wall time recorded. Step 1: reproduce each defect from the directive on current main and classify code bug vs machine artifact | scripts/first-run-gate.sh, tests/test-first-run-gate.sh, docs/v10/FIRST-RUN-GATE.md (defect table) | HIGH | gate runs in stub mode in CI as a NON-required job; the defect table cites command and rc per defect | released@2026-09-30T21:23Z | Gates `latest` (via A-01 promote). Released in v10.5.11 (merge 8641dac4 is an ancestor of v10.5.11). |
|
|
605
|
+
| A-03 | Tier 0 architecture split (opus Architect): slice items 1 Seal correctness, 2 clean first run, 3 signed by default, 5 honest outcomes into non-overlapping file sets with Wall checks, one writer per file, shrink-or-flat per D33; Seal correctness builds on slice-E-125 | docs/v10/ADOPTION-PLAN.md | HIGH | every slice card has a file set, a Wall check tied to a gate assertion, and a line budget | released@2026-09-30T21:23Z | Item 4 (one engine) waits until 1 to 3 pass the gate. Released in v10.5.11 (merge 26dd66b8 is an ancestor of v10.5.11). |
|
|
606
|
+
| A-04 | loki-seal: a Claude Code skill plus hook that runs the repo's real test suite on the current diff, refuses done on red or on deleted, skipped, xfailed or weakened tests or CI config (diff scan plus a tree hash of existing tests), prints a 5-line receipt; zero model cost, no dangerous flags; self-contained, no LICENSE file; SUBMIT.md drafts only; a 20-second vhs or asciinema script | packages/loki-seal/** | HIGH | fixture repos: deleting a failing test is blocked; a real fix passes; each weakening class caught | merged@2026-09-30T20:56Z | Tier 1 wedge; answers issue #42. |
|
|
607
|
+
| A-04b | loki-seal follow-ups from opus r5: reset the hook-error counter after a successful stop; fall back to stop_hook_active repetition when the tmpdir is read-only or full; tests must write loki-seal-err-* counter files under LOKI_RUN_TMP, not the real os.tmpdir() | packages/loki-seal/** | MEDIUM | package tests plus demo dry-run; no files left in the real tmpdir after the suite | ready@2026-09-30T20:56Z | Source: A-04 opus r5 APPROVE notes. |
|
|
608
|
+
| A-09 | README under 150 lines (directive item 9): line 1 "Your agent says done. Loki proves it." (veto pending, founder queue 10); line 2 "An autonomous software factory that knows what it is supposed to deliver, and proves it did." (D45); then the loki-seal 20-second GIF (placeholder until recorded), then two install lines (loki-seal first, `npx loki-mode tour` second); flags, internal paths, version stamps and app-builder comparisons move to docs; remove the commercial-editions sentence from the top and the npm total-downloads and Docker pulls badges; define "Seal" in one sentence or stop using the word; package.json description and SKILL.md description use line 2 verbatim (SKILL.md header and footer version rules still apply) | README.md, docs/ (moved sections), package.json (description only), SKILL.md (description only) | MEDIUM | README <= 150 lines; no retracted claims (directive Never list); structural checks (SKILL.md sync, readme version) pass | merged@2026-09-30T21:08Z | Source: directive item 9 plus D45. |
|
|
609
|
+
| A-04c | loki-seal reads the delivery contract (D45): from the task or issue the user gave the session (prompt text, a linked issue, a spec file), derive the acceptance checks and refuse "done" until the checks tied to that request pass, not only "the suite is green"; when no contract can be derived, say so on the receipt (NOT VERIFIED: no contract) instead of passing on green alone. Design first (how the hook sees the user request: transcript_path from the hook input, first user message), then build; zero model cost stays a constraint | packages/loki-seal/** | HIGH | fixtures: a session asking for behavior X with a green suite that never tests X is NOT VERIFIED; with a test for X passing it PASSes | ready@2026-09-30T20:59Z | Source: D45. After A-04b. |
|
|
610
|
+
| A-103b | Seal lists each discarded Wall test in not_proven as "wall test discarded: <path> (<class>)" (A-103 kept seal.ts out of its file set; today only a count appears via base_run not_run) | loki-ts/src/engine10/stages/seal.ts, its test | HIGH | fixture: a discarded Wall file appears by path in not_proven | ready@2026-09-30T20:56Z | Source: A-103 builder. seal.ts writer order: after A-121 and A-104b. |
|
|
611
|
+
| A-101 | Receipt canonicalization and verify help (item 1) | see docs/v10/ADOPTION-PLAN.md A-101 | HIGH | first-run-gate assertion per plan card | released@2026-09-30T21:23Z | Wave per plan section 5; one writer per file. Released in v10.5.11 (merge 5ea92836 is an ancestor of v10.5.11). |
|
|
612
|
+
| A-102 | Test-runner detection: node:test plus fixtures for all six runners (item 1) | see plan A-102 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T20:56Z | Wave per plan section 5; one writer per file. |
|
|
613
|
+
| A-104 | Commit only the fix (items 1 and 2, v10) | see plan A-104 | HIGH | first-run-gate assertion per plan card | released@2026-09-30T21:23Z | Wave per plan section 5; one writer per file. Released in v10.5.11 (merge d86a5817 is an ancestor of v10.5.11). |
|
|
610
614
|
| A-104b | A-104 opus follow-ups: run the unstage reset as `git --literal-pathspecs reset` and check its rc (a path starting with `:(top)` was read as a pathspec and committed); match "manifest changed" per directory in monorepos (a stray lockfile in packages/b rode along with a packages/a manifest change); judge new lockfiles and Wall files against the run base, not HEAD, so files the agent commits during implement are also excluded | loki-ts/src/engine10/stages/seal.ts, loki-ts/tests/engine10/seal.test.ts | HIGH | fixtures for each case red first; seal-then-verify still matches | ready@2026-09-30T20:39Z | Source: A-104 opus review (APPROVE with notes). seal.ts writer order: after A-121. |
|
|
611
|
-
| A-120 | One signing key, auto-generated (item 3) | see plan A-120 | HIGH | first-run-gate assertion per plan card |
|
|
612
|
-
| A-132 | Legacy: no HANDOFF.md, USAGE.md or lockfile in a fix commit (item 2) | see plan A-132 | MEDIUM | first-run-gate assertion per plan card |
|
|
613
|
-
| A-133 | Legacy: skip Council evidence probes on a trivial diff (item 2) | see plan A-133 | HIGH | first-run-gate assertion per plan card |
|
|
614
|
-
| A-
|
|
615
|
-
| A-
|
|
616
|
-
| A-
|
|
617
|
-
| A-
|
|
618
|
-
| A-
|
|
619
|
-
| A-
|
|
620
|
-
|
|
|
621
|
-
|
|
|
622
|
-
|
|
|
623
|
-
| A-
|
|
615
|
+
| A-120 | One signing key, auto-generated (item 3) | see plan A-120 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T20:56Z | Wave per plan section 5; one writer per file. |
|
|
616
|
+
| A-132 | Legacy: no HANDOFF.md, USAGE.md or lockfile in a fix commit (item 2) | see plan A-132 | MEDIUM | first-run-gate assertion per plan card | merged@2026-09-30T21:08Z | Wave per plan section 5; one writer per file. |
|
|
617
|
+
| A-133 | Legacy: skip Council evidence probes on a trivial diff (item 2) | see plan A-133 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T21:08Z | Wave per plan section 5; one writer per file. |
|
|
618
|
+
| A-132b | A-132 card promised build_prompt fixture-61 (the gated quick-PRD case) but the merged slice never committed it; it sits untracked in the A-132-133 worktree. Commit it with its index.json entry, prove it passes and is red with the gate removed | loki-ts/tests/fixtures/build_prompt/fixture-61/, index.json | LOW | build_prompt.test.ts covers fixture-61 | merged@2026-09-30T22:37Z | worktree .claude/worktrees/agent-a101928295ea43bb7 holds the files |
|
|
619
|
+
| A-103 | Wall never leaves a test that fails for unrelated reasons (item 1) | see plan A-103 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T21:26Z | Wave per plan section 5; one writer per file. |
|
|
620
|
+
| A-111 | Empty, skipped or hung checks are NOT VERIFIED (item 5) | see plan A-111 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T21:26Z | Wave per plan section 5; one writer per file. |
|
|
621
|
+
| A-103c | A-103 opus note: apply the missing-module not_run rule only when node's failing-tests block shows a file-level `test failed`, so a child node process crashing on a missing package (inherited stdio) cannot discard a real TypeError red; add the child-crash fixture | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall_runner.test.ts | HIGH | child-crash fixture red | merged@2026-09-30T22:43Z | after A-103 |
|
|
622
|
+
| A-103d | A-103c opus note: nested Jest globals on node 20/22 TAP (`t.test("inner", () => expect(...))`) classify red (a false FAILED that keeps a bad Wall test) because nested yaml is indented 6 spaces and `^ {2}name:` misses it; node 26 gives not_run. Match `^ +name:` and `^ +stack:` at any indent. Pre-existing since 0cc1dea4 | loki-ts/src/engine10/stages/wall.ts, wall_runner.test.ts | HIGH | nested Jest-globals fixture not_run on node 20/22/26 | merged@2026-09-30T23:42Z | CI runs node 22 |
|
|
623
|
+
| A-111b | A-111 opus note: discount a zero-test trailer only when the test name equals the path under test, so one real passing test named like a bare filename (`a.test.js`) is not not_run | loki-ts/src/engine10/stages/verify.ts, its test | MEDIUM | bare-filename-named test passes | merged@2026-09-30T22:37Z | after A-113 (verify.ts) |
|
|
624
|
+
| E-154 | Incident 17:14Z: tests wrote real signing keys to the founder's `~/.loki/keys` once signing became default (A-121, A-122 builders). Central guard: tests/run-all-tests.sh, the bun test preload and conftest set LOKI_RECEIPT_SIGNING_KEY_FILE/HOME to a run-owned path, plus a check that fails when a test run creates `~/.loki/keys` | tests/run-all-tests.sh, loki-ts bunfig preload, tests/conftest.py, new guard test | MEDIUM | guard test red when a test writes the real key dir | merged@2026-09-30T22:27Z | after A-121, A-122 |
|
|
625
|
+
| E-155 | Incident 21:58Z: a shell test run from the MAIN checkout (633 diff-selected tests, xargs -P 4, 17:58:16 local) switched HEAD to the stale branch loki/session-1789047299-95963; main ref intact, restored by `git checkout main` 33s later. Candidates running that second: test-metrics-command, test-metrics-json-unmeasured, test-migration-post-edit-revert, test-mirofish-integration, test-magic-injection. A stray root bun.lock also appeared at 17:54. Guard: tests/run-all-tests.sh records `git symbolic-ref HEAD` + status before and fails loudly when any test changes the parent checkout branch; bisect the culprit with that guard | tests/run-all-tests.sh, culprit test | MEDIUM | guard test red when a test runs git checkout in the parent repo | merged@2026-09-30T22:27Z | process fix already applied: shell batches run only in a disposable worktree |
|
|
626
|
+
| E-156 | Incident 22:00Z: pre-push gitleaks (generic-api-key) blocked train/11 on the key FILE NAME string `.loki/keys/receipt-ed25519.pem` (seal.ts:68, seal.test.ts:174, dist/loki.js:1244); no key material. Fixed by exact .gitleaksignore fingerprints, but any future commit that rewrites the minified dist line re-triggers and can block a release push. Durable fix needs a CTO call: a narrow `.gitleaks.toml` allowlist (regexTarget=secret, `^receipt-ed25519\.pem$`, extend defaults) pushed with LOKI_ALLOW_GITLEAKS_CONFIG_CHANGE=1 plus a test that a real key in the same position is still caught | .gitleaks.toml, tests/test-pre-push-gitleaks.sh | HIGH | real-key fixture still flagged; filename allowed | ready@2026-09-30T22:02Z | CTO approval (security scan config) |
|
|
627
|
+
| A-113 | Stop reasons: STALLED and the fatal classifier (item 5) | see plan A-113 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T21:37Z | Wave per plan section 5; one writer per file. |
|
|
628
|
+
| A-114 | FALSE VERIFIED ON MAIN (found by the A-112 opus reviewer, repro m6 on 4ad430ad): bugrepo plus an unrelated red test; the agent changes only other.js; verify selects only node:other.test.js (testmap from the diff), so the task's own target test sums.test.js is never run and the run seals VERIFIED rc=0 while it is red. Fix: the relevant tests of the task-named files (hasRelevantTests / impacted(likely), the lean-path Wall stand-in) are ALWAYS selected by verify, whatever the diff touches | loki-ts/src/engine10/stages/verify.ts or testmap selection, tests | HIGH | m6 fixture seals FAILED | merged@2026-09-30T22:37Z | coordinate with A-112 (verify.ts, same target notion); P0 moat |
|
|
629
|
+
| A-115 | TIER 0 (steer 22:50Z). FALSE VERIFIED ON MAIN (A-112 opus reviewer, c10 on 275b4fc0): a conftest.py that skips the target test (and the unrelated red one) seals VERIFIED rc=0, "2 passed, 2 skipped", nothing disclosed. Seal accuracy: a relevant check with more skipped tests than base, or a diff touching conftest.py / pytest.ini / pyproject [tool.pytest] / jest or node test config, must not count as a pass or as progress; list it in NOT PROVEN | loki-ts/src/engine10/stages/verify.ts, failures.ts, tests | HIGH | c10 and e9 fixtures seal FAILED or NOT VERIFIED | merged@2026-09-30T23:42Z | core at the 5000 cap: needs an offset (A-150) |
|
|
630
|
+
| A-115b | A-115 opus notes: (1) an honest fix that also appends a new test to a relevant test file, in a repo with an unrelated red test, ends STALLED/FAILED instead of PARTIAL: the edited file is excluded from progress so the unrelated red is never subtracted; allow progress when the file's pre-existing target ids went red to green; (2) the node base-count fallback sums every `pass N`/`fail N` line, so a base test printing them inflates the count (safe-direction false PARTIAL); take the last pass and last fail lines | loki-ts/src/engine10/stages/verify.ts, verify_weak.test.ts | HIGH | both fixtures | ready@2026-09-30T23:42Z | |
|
|
631
|
+
| A-117 | FALSE VERIFIED IN `loki verify` (A-130 r2 opus reviewer): on a run whose events.jsonl was tampered (append, edit, truncate, delete), the run now ends FAILED (A-130) but the receipt on disk still says VERIFIED with no tamper mark, because the worker sealed it before the supervisor detected the tamper; `loki verify` prints verdict: VERIFIED rc=0. Fix: record the tamper on the receipt via the registered receipt.addendum event (hash-chained) or have verify check the event log hash; verify must say TAMPERED and exit non-zero | loki-ts/src/engine10/verify_cmd.ts, supervisor.ts or seal.ts, tests | HIGH | tampered-log fixture: loki verify TAMPERED rc!=0 | ready@2026-09-30T23:23Z | after A-130 (supervisor.ts) |
|
|
632
|
+
| A-118 | Exit-honest policy gap on the DEFAULT path (A-115 r2 finding): legacy `loki quick` prints `Evidence Receipt: NOT VERIFIED` yet exits rc 0 on a run whose target test was skipped; G1 exit-honest counts a skipped test as green, so it does not catch this. CTO call: should legacy quick exit non-zero on NOT VERIFIED when a relevant test was skipped/weakened, and should G1 count skipped as not-green? | autonomy/run.sh (quick exit path), scripts/first-run-gate.sh G1 | HIGH | skipped-target legacy run exits non-zero; G1 treats skipped as not green | ready@2026-09-30T23:33Z | CTO decision first; blocks promote of `latest` together with A-115 |
|
|
633
|
+
| A-112b | A-112 readability debt: subtractBase in verify.ts was folded to reach 4999 of 5000 core lines (9 lines over 200 chars, longest 347; un/progress/base-run loop each on one line). Unfold when A-150 frees budget; no behaviour change | loki-ts/src/engine10/stages/verify.ts | MEDIUM | budget test plus verify_prered unchanged | ready@2026-09-30T22:37Z | after A-150 |
|
|
634
|
+
| A-113b | A-110 opus notes on A-113: (1) under the CLI invoker (LOKI_E10_INVOKER=cli) the provider child stderr never reaches the fatal classifier (the *-impl.stderr.log is empty), so a credit/auth failure printed on plain stderr gives stop:null and burns the fix rounds; (2) machine.ts re-records the previous signature when a verify crashes, so a crashed verify counts toward a stall. Fix both in session.ts/machine.ts, with end-to-end tests through the real worker | loki-ts/src/engine10/session.ts, machine.ts, tests | HIGH | CLI stderr credit line stops fatal; crashed verify does not count as a stall repeat | ready@2026-09-30T22:27Z | keep the A-110 escalated emit; the A-110 reviewer plugin probe is a good e2e template |
|
|
635
|
+
| A-121 | v10 signs and verifies natively (item 3) | see plan A-121 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T21:37Z | Wave per plan section 5; one writer per file. |
|
|
636
|
+
| A-122 | Delete the GPG signing layer (item 3, deletion) | see plan A-122 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T21:37Z | Wave per plan section 5; one writer per file. |
|
|
637
|
+
| A-121b | A-121 opus note: a receipt downgrade exits 0. Anyone can edit the body, recompute receipt_sha256 and null the jwt to get UNSIGNED rc 0 on `loki verify`, and the legacy deploy gate refuses UNSIGNED but the v10 verify does not. Decide the signed-by-default policy: once a local key exists, UNSIGNED on a receipt from this machine exits non-zero (or the receipt records its kid outside the hashed body) | loki-ts/src/engine10/verify_cmd.ts, stages/seal.ts, tests | HIGH | downgrade fixture exits non-zero | ready@2026-09-30T21:37Z | CTO call on policy first |
|
|
638
|
+
| A-110 | One named outcome, fixed exit ladder, --json (items 1 and 5) | see plan A-110 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T22:27Z | Wave per plan section 5; one writer per file. |
|
|
639
|
+
| A-112 | Baseline subtract: judge only the delta (item 5) | see plan A-112 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T22:37Z | Wave per plan section 5; one writer per file. |
|
|
640
|
+
| A-123 | Doctor: only the selected provider blocks, one Ready line (item 3) | see plan A-123 | MEDIUM | first-run-gate assertion per plan card | merged@2026-09-30T22:27Z | Wave per plan section 5; one writer per file. |
|
|
641
|
+
| A-134 | Legacy: receipt after the final commit, chatter behind --verbose (item 2) | see plan A-134 | MEDIUM | first-run-gate assertion per plan card | merged@2026-09-30T22:28Z | Wave per plan section 5; one writer per file. |
|
|
642
|
+
| A-134b | A-134 opus notes: (1) standalone autonomy/verify.sh prints no attestation line (only `loki verify` has _deploy_receipt_verdict); print `attestation: UNCHECKED (run via loki verify)` instead of silence; (2) the quiet failure tail grep `[Ff]ailed` matched the RALPH system-prompt line and printed ~1.5k chars; anchor to `^\[(ERROR|WARN)\]` or cap line length; (3) the quiet inner run starts as a background job so its stdin is /dev/null even from a TTY: pause-mode keypress resume changes for quiet runs; (4) `loki quick --verbose` is also the A-122 cmd_quick flag, done | autonomy/verify.sh, autonomy/run.sh | MEDIUM | each note has a test | ready@2026-09-30T22:28Z | |
|
|
643
|
+
| A-130 | v10 quiet by default (item 2) | see plan A-130 | MEDIUM | first-run-gate assertion per plan card | building@2026-09-30T22:27Z | Wave per plan section 5; one writer per file. |
|
package/docs/v10/DECISIONS.md
CHANGED
|
@@ -351,3 +351,14 @@ Main went red four times on 2026-09-30 from structural checks CI caught after a
|
|
|
351
351
|
4. Staff 8 or more builders; clear waiting reviews with sonnet for LOW/MEDIUM; opus stays under 30 percent.
|
|
352
352
|
5. Pulse gains RELEASE_CADENCE (a green unreleased commit on main older than 20 minutes) and MAIN_RED_BY_MERGE (a push to main failing Tier B). Releases per hour are reported in METRICS.md hourly.
|
|
353
353
|
Bootstrap: train/1 is verified through a pull request to main (pull_request already triggers Tier B) and carries the train/** push triggers so later trains verify on push.
|
|
354
|
+
|
|
355
|
+
## D45 (founder, 2026-09-30, relayed by the autonomi-dev-dc steering session): the product runs against a delivery contract
|
|
356
|
+
|
|
357
|
+
Loki's definition: "autonomous software factory that runs with the knowledge of what it's supposed to deliver". Binding for Tier 0 and loki-seal:
|
|
358
|
+
- Every run starts from an explicit delivery contract: the acceptance criteria derived from the issue, spec or task (intake plus the Wall).
|
|
359
|
+
- A run is judged only against that contract. Done means the contract's checks ran and passed.
|
|
360
|
+
- The receipt states the contract, what was proven against it, and what was not.
|
|
361
|
+
- If the contract cannot be derived, the run ends BLOCKED with one question; it never guesses and calls it done.
|
|
362
|
+
- loki-seal follows the same rule: it reads what the user asked for (the task or issue) and refuses "done" until the checks tied to that request pass, not only "the suite is green".
|
|
363
|
+
- Wording: README line 1 stays "Your agent says done. Loki proves it." (founder queue row 10, veto pending). Line 2 is the category line "An autonomous software factory that knows what it is supposed to deliver, and proves it did.", used verbatim in package.json description and SKILL.md. The GitHub About text stays in the founder queue.
|
|
364
|
+
- Competitive intel: the steering session scans rivals twice daily (list at ~/git/autonomi-dev/research/2026-09-30-adoption/COMPETITOR-WATCHLIST.md) and proposes at most 3 backlog rows per scan, each naming the metric it moves. Until the first-run gate passes on a `next` version, only threats to the moat (for example a rival shipping portable verifiable receipts) jump the queue; everything else, including enterprise asks (SSO, audit, policy), queues behind Tier 0 and never carries certification claims.
|
package/docs/v10/ENGINE.md
CHANGED
|
@@ -140,7 +140,7 @@ Every claim below comes from reading main at 84c22568. I edited no files.
|
|
|
140
140
|
- **Files:** `README.md` (new quickstart section), `docs/v10/GUIDE.md` (new), `tests/test-engine10-docs.sh` (new).
|
|
141
141
|
- **Tier:** LOW.
|
|
142
142
|
- **Contents:**
|
|
143
|
-
- **Quickstart:** `LOKI_ENGINE=v10 loki "<task>"`, issue refs, and `--no-pr`, `--deep`, `--provider
|
|
143
|
+
- **Quickstart:** `LOKI_ENGINE=v10 loki "<task>"`, issue refs, and `--no-pr`, `--deep`, and `--provider`.
|
|
144
144
|
- **The 5-line summary,** explained line by line.
|
|
145
145
|
- **NOT PROVEN:** what it means, including the deep checks that are always listed and "not measured" cost.
|
|
146
146
|
- **Receipts:** `receipt.json` and `receipt.md`, `loki verify`, and UNSIGNED.
|
|
@@ -223,14 +223,14 @@ Every claim below comes from reading main at 84c22568. I edited no files.
|
|
|
223
223
|
- **Green:** the leg asserts `LOKI_ENGINE=legacy` on the legacy arm and `v10` on the v10 arm, and the 29-row v10 results file exists.
|
|
224
224
|
- **Deps:** EV-1, E-32, E-36.
|
|
225
225
|
|
|
226
|
-
### E-39: Interrupt
|
|
226
|
+
### E-39: Interrupt end to end (resume removed in A-113)
|
|
227
227
|
- **Files:** `loki-ts/tests/engine10/resume_e2e.test.ts` (new), `loki-ts/tests/engine10/fixtures/resume/` (new).
|
|
228
228
|
- **Tier:** MEDIUM.
|
|
229
229
|
- **Wall:** `cd loki-ts && bun test tests/engine10/resume_e2e.test.ts`.
|
|
230
230
|
- **Red:** the file is missing.
|
|
231
231
|
- **Green:**
|
|
232
232
|
- SIGINT during a sleeping implement stub exits 130. The session process group is gone and there is no `run.completed`.
|
|
233
|
-
- `loki --resume
|
|
233
|
+
- (Removed in A-113: `--resume` no longer exists; `loki --resume` exits 2 with "start a new run".)
|
|
234
234
|
- `seq` keeps increasing, and there is no second `stage.started` for intake.
|
|
235
235
|
- `.loki/engine.json` still names the same run.
|
|
236
236
|
- Changing the origin between runs refuses the push.
|
|
@@ -247,7 +247,7 @@ Every claim below comes from reading main at 84c22568. I edited no files.
|
|
|
247
247
|
- `gh pr view --json isDraft` agreeing with the verdict;
|
|
248
248
|
- the `loki/deep-verify` status context through `gh api`;
|
|
249
249
|
- `loki verify <run>` exiting 0, or UNSIGNED stated;
|
|
250
|
-
- a second
|
|
250
|
+
- a second run of the same task reporting `existing: true` with the same URL.
|
|
251
251
|
- **Red:** the file is missing.
|
|
252
252
|
- **Green:** all five assertions hold against the sandbox repo.
|
|
253
253
|
- **Deps:** E-23, E-32, E-36.
|
|
@@ -17,3 +17,4 @@ this file; each item says what the loop does meanwhile.
|
|
|
17
17
|
| 10 | 2026-09-30 | Tagline veto: "Your agent says done. Loki proves it." | Brand. | Uses it as README line 1 by default. |
|
|
18
18
|
| 11 | 2026-09-30 | Opt-in first-run telemetry (install, first verified run, day-7 return). | Privacy and data. | Collects nothing. |
|
|
19
19
|
| 12 | 2026-09-30 | One relaunch after the first-run gate passes, ideally posted by an outside user. | Outward posting. | Drafts a Show HN and an r/ClaudeAI post in `packages/loki-seal/SUBMIT.md`, led by the GIF and the harness table, with no agent counts and no percentages. |
|
|
20
|
+
| 13 | 2026-09-30 | Repo `.claude/settings.json` hooks use relative paths (`bash autonomy/hooks/session-init.sh`, `validate-bash.sh`, `track-metrics.sh`, `store-episode.sh`, lines 9, 20, 31, 42), so they fail ("No such file or directory") whenever a session or agent's cwd is not the repo root (gate worktrees, /private/tmp train checkouts). validate-bash.sh is a PreToolUse guard, so it may silently not guard there. Proposed: `bash "$CLAUDE_PROJECT_DIR/autonomy/hooks/<name>.sh"`, exiting 0 quietly when the variable is unset. Raised by the steering session 22:50Z. | Claude Code configuration; agents may not edit it on a peer's request. | Leaves the file unchanged; hook errors continue outside the repo root. |
|
package/docs/v10/GUIDE.md
CHANGED
|
@@ -41,13 +41,9 @@ Flags, from the engine's own `--help`:
|
|
|
41
41
|
from 480s to 1800s (`loki-ts/src/engine10/types.ts`).
|
|
42
42
|
- `--provider <name>`: pick the coding provider for this run. See the
|
|
43
43
|
provider table below.
|
|
44
|
-
- `--resume <run-id>`: continue a run that was interrupted.
|
|
45
44
|
|
|
46
45
|
`--no-pr`, `--deep` and `--provider` are parsed by the supervisor
|
|
47
46
|
(`loki-ts/src/engine10/supervisor.ts`) and take effect on a real run.
|
|
48
|
-
`--resume` is not wired yet: passing it prints `engine10: --resume is not
|
|
49
|
-
wired yet` and exits 2. Its shape is documented here because it is already
|
|
50
|
-
fixed in `--help`.
|
|
51
47
|
|
|
52
48
|
`loki status`, `loki verify` and `loki dashboard` are all built on main
|
|
53
49
|
(status.ts, verify_cmd.ts, dashboard/server.ts) and route through cli.ts's
|
package/docs/v10/PROGRESS.md
CHANGED
|
@@ -1576,3 +1576,46 @@ The swarm is stopped: .loki/V10-STOP exists, the loop has no wake-ups, and the c
|
|
|
1576
1576
|
- Parked slices checked: M-15 (8097d44a), E-138 (e01b64fc), D44-A (d956294f), EV-12F-a2 (9ec3ac0b), EV-12G (91884218) had no agent building (worktrees clean, 80 to 154 min idle); worktrees removed, branches kept. Capacity goes to Tier 0 and loki-seal.
|
|
1577
1577
|
- QUEUED, apply only after scripts/first-run-gate.sh passes on a `next` version: (a) run the D43 medium pilot on the 14 medium tasks; results feed item 8 (failure analysis) and item 7 (head-to-head); (b) D34: measure-size excludes data-only lines (string literal lists) before EV-12F and EV-12G resume.
|
|
1578
1578
|
- Tier 0 state: merged on local main: E-125 (Wall red classification in core), A-101 (one receipt canonicalizer; verify --help rc 0 through bin/loki), A-104 (commit only the fix), A-02 (first-run gate, diff-based G1/G2, full-digest G3, verified-signature G5), A-03 plan. Approved, merging on the next train: A-102 (node:test detection). In rework: A-120 r3 (tighten only the auto key), loki-seal r5 (release valve on hook errors). In review: A-132 plus A-133 (opus).
|
|
1579
|
+
|
|
1580
|
+
## 2026-09-30T21:10Z hourly report (adoption directive)
|
|
1581
|
+
- `next` releases shipped: v10.5.11 at 9e93ce48 (from green train/9 04db82d3: A-01 next plus gated promote, A-02 gate, E-125, A-101, A-104), the first release on `next`; watcher confirming npm next = 10.5.11 with latest unchanged. Release clock recreated as cron 472ddf72 (every 10 min at :07, next only, never promote).
|
|
1582
|
+
- latest promoted: no (latest 10.5.10).
|
|
1583
|
+
- Gate status per defect (stub mode): (a) Wall Jest globals: A-102 merged (node:test detection), A-103 in rework (repo-local missing module must count as red); (b) red suite exits 0: A-111 in rework (parse only the final summary), A-110 not started; (c) verify TAMPERED: fixed in A-101 (shipped 10.5.11), verify --help rc 0; (d) quick noise and stray files: A-132/A-133 r2 in opus review (stub gate now PASS no-stray-files), output lines still 260 > 15 (A-130/A-134 pending); (e) printed digest mismatch: A-101 prints the full digest; gate digest-matches still FAIL until A-134; (f) unsigned: A-120 merged (local key auto-generated, warning kept), A-121 native v10 signing building, A-122 GPG deletion in opus review; (g) doctor FAIL: machine artifact.
|
|
1584
|
+
- loki-seal: merged on local main (train/10) after a live Claude Code 2.1.286 contract check and opus approval in round 5; follow-ups A-04b and contract-aware A-04c queued.
|
|
1585
|
+
- README: A-09 merged on local main: 49 lines, line 1 "Your agent says done. Loki proves it." (veto pending), line 2 the D45 category line; full content moved to docs/README-FULL.md with retracted claims removed. Deviation from "same sentence in SKILL.md": the SKILL.md description is line 2 verbatim followed by one trigger sentence ("Use when the user says Loki Mode or asks to build, fix or verify software autonomously."), because dropping the trigger wording would weaken skill auto-invocation; package.json description is line 2 verbatim.
|
|
1586
|
+
- Head-to-head: not run.
|
|
1587
|
+
|
|
1588
|
+
## 2026-09-30T22:05Z hourly report (adoption directive)
|
|
1589
|
+
- `next` releases shipped this hour: 1, v10.5.11 (9e93ce48). Verified: npm gitHead 9e93ce48, dist-tags next=10.5.11, latest=10.5.10 unchanged, release body 17 lines. No release since: train/10 (77d58f1a) Tier B red; train/11 (363c20ea) pushed 22:01Z, Tier B running.
|
|
1590
|
+
- latest promoted: no (10.5.10).
|
|
1591
|
+
- train/10 red: Tests failed on shell shards 2, 3, 5 and 6. All 4 tests assert README.md content that A-09 moved to docs/README-FULL.md (test-agent-types-loaded, test-mcp-tool-surface-packaged, test-mcp-tool-surface-guard-rejects, test-engine10-docs). Fixed forward on train/11 (79f2cfdb): README regains the reviewer-pool, 36 MCP tools and Loki 10 marker lines (57 lines). The local gate had not run the tests that name a changed file.
|
|
1592
|
+
- train/11 contents: README fix, A-103, A-111, A-113, A-121, A-122, spawn-env fix for A-122's doctor probe (af50a9b0), gitleaks fingerprints. Local: gate4 green, full bun test 2643/1 then 0 fail after af50a9b0, typecheck 0.
|
|
1593
|
+
- Gate status per defect (stub mode; A-134 branch measured 7 of 8 PASS, only receipt-signed FAIL, before A-121/A-122 merged):
|
|
1594
|
+
- (a) Wall Jest globals: A-102 and A-103 merged on train/11.
|
|
1595
|
+
- (b) red suite exits 0: A-111 merged (empty or skipped checks not_run); A-110 (exit ladder, PARTIAL exits 1) built, in opus review; A-112 (baseline subtract) r2 in opus review after r1 was REJECTED for a no-fix run sealing VERIFIED.
|
|
1596
|
+
- (c) verify TAMPERED: fixed in 10.5.11 (A-101).
|
|
1597
|
+
- (d) noise and stray files: A-132/133 merged; A-134 r2 in rework (3 opus blockers: missing --verbose, a CI test anchor deleted, NOT PROVEN/UNSIGNED hidden in quiet mode).
|
|
1598
|
+
- (e) printed digest mismatch: A-134 branch PASS digest-matches; lands with A-134.
|
|
1599
|
+
- (f) unsigned: A-121 (native v10 signing) and A-122 (GPG layer deleted) merged on train/11; unknown key reads UNCHECKED, not TAMPERED.
|
|
1600
|
+
- (g) doctor: machine artifact; A-123 (one Ready line, selected provider only) in sonnet review.
|
|
1601
|
+
- loki-seal: merged on local main before train/10; not in 10.5.11; ships with the train/11 release.
|
|
1602
|
+
- Head-to-head: not run.
|
|
1603
|
+
- Incidents: 21:58Z a shell test batch run in the main checkout switched HEAD to a stale loki/session branch for 33s (main ref intact; E-155). 22:00Z pre-push gitleaks flagged the key file NAME `receipt-ed25519.pem` (false positive, fingerprinted; durable allowlist E-156 needs CTO approval). 17:14Z signing tests wrote keys to the real ~/.loki/keys (E-154). Filed: A-103c, A-111b (folded into A-112), A-121b (receipt downgrade to UNSIGNED exits 0), A-132b (uncommitted fixture-61).
|
|
1604
|
+
- Opus share this hour about 40 to 46% (over the 30% D13 budget) from HIGH-tier reviews; builders are sonnet.
|
|
1605
|
+
|
|
1606
|
+
## 2026-09-30T22:18Z steer 22:17Z applied: train split
|
|
1607
|
+
- train/12 = train/10 (77d58f1a) plus the README fix cherry-picked (3e34837b). Contents: A-132/133, A-09, A-102, A-120, loki-seal (A-04), D45, A-01b; NO A-121/A-122 signing code, no A-103/A-111/A-113. train/10's only reds were the 4 README tests; locally 3e34837b passes all 4 plus structural and stale-version checks. Pushed 22:18Z; Tier B watcher armed; ships to `next` when green.
|
|
1608
|
+
- Signing and engine slices stay on the next train (local main 8d309d55: A-103, A-111, A-113, A-121, A-122, A-123, spawn-env fix) until train/11's failures are fixed at the source: P0-t11a (A-103 Linux node output, stale --resume docs, gitleaks baseline shape) building; P0-t11b (moat P1 control used the real HOME where a key now auto-generates; trigger-server test-order flake) built, in opus review. Nothing was added to tests/moat/pending.txt; the other 3 moat fails are existing pending cases with matching reasons.
|
|
1609
|
+
- The `ModuleNotFoundError: sqlalchemy` lines in the shard logs are printed inside passing tests, not the failures.
|
|
1610
|
+
- A-114 (false VERIFIED when the diff avoids the target test, reproduced on main) is Tier 0, folded into A-112 round 3 (same verify.ts, same target-test notion).
|
|
1611
|
+
|
|
1612
|
+
## 2026-09-30T22:40Z steer 22:50Z
|
|
1613
|
+
- A-115 (a conftest that skips the target seals VERIFIED; on main) is Tier 0 and building: fix plus first-run gate assertion G8 (a conftest skip of the target must end NOT VERIFIED). Core room comes from deleting proven-dead code; if that falls short, a dated cap exception goes to DECISIONS.md, never a ship-around. `latest` stays unpromoted until A-115 lands, even if the gate passes.
|
|
1614
|
+
- Hook paths: NOT edited. `.claude/settings.json` is Claude Code configuration and a peer request cannot authorize a config change; queued as FOUNDER-QUEUE row 13 (all four hooks use relative paths, including the validate-bash.sh PreToolUse guard).
|
|
1615
|
+
- v10.5.12 never published (Security Audit: 3 gitleaks false positives on the key file-name string, reached through the pushed train/11 ref by `--all`); fix ships as 10.5.13 from train/13 (1f4cf0d3), local gate running in a disposable worktree.
|
|
1616
|
+
|
|
1617
|
+
## 2026-09-30T23:15Z train/13 status
|
|
1618
|
+
- train/13 (3ce73a36): first-run gate stub PASS 8/8 locally (wall 27-28s, 15 lines, signed receipt, digest match); first all-green stub gate. Counts toward promote only in real-provider mode on a published `next` version and after A-115 (G8) lands.
|
|
1619
|
+
- Tests red on shards 0,1,2,3,4,6,7; four root causes, one P0 fix-forward (slice-P0-t13): (1) E-154 run-all-tests.sh exports LOKI_RUN_TMP via loki_run_tmp_create, so every child loki_run_tmp_create refuses ("cannot create run tmp"): EV-1, E-33, EV-6, A-02 gate logic, A-132, A-133, A-134, E-154/155 guards; (2) E-123 gitleaks baseline shape pinned 56/20, now 59/23 after three fingerprints; (3) A-123 doctor tests lack node on CI's restricted PATH, plus a bash/bun blocker wording gap; (4) A-134 log_error reroute read as gated by the env-var docs test. No rerun until green through the runner.
|
|
1620
|
+
- Merged since 22:40Z on local main: A-103c, A-103d, E-154b. In review: A-115 (Tier 0, core 4998 to 4940 by deleting dead parsers), A-130 r2 (also fixes a pre-existing moat bug: a tampered event log sealed Outcome VERIFIED, exit 0).
|
|
1621
|
+
- v10.5.12 never published; 10.5.13 ships to `next` when the fixed train is green, without waiting for A-115; `latest` waits for A-115.
|