loki-mode 10.5.17 → 10.5.20

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.
Files changed (126) hide show
  1. package/README.md +877 -30
  2. package/SKILL.md +3 -3
  3. package/VERSION +1 -1
  4. package/autonomy/lib/proof-generator.py +251 -0
  5. package/autonomy/lib/proof-verify.py +1 -0
  6. package/autonomy/loki +52 -6
  7. package/autonomy/run.sh +35 -5
  8. package/autonomy/verify.sh +1 -1
  9. package/dashboard/__init__.py +1 -1
  10. package/dashboard/api_start.py +463 -0
  11. package/dashboard/server.py +31 -0
  12. package/dashboard/static/start.html +100 -0
  13. package/docs/COMPARISON.md +6 -19
  14. package/docs/COMPETITIVE-ANALYSIS.md +6 -41
  15. package/docs/CRASH-REPORTING-PLAN.md +1 -1
  16. package/docs/ENTERPRISE-IDENTITY-ROADMAP.md +1 -1
  17. package/docs/INSTALLATION.md +1 -1
  18. package/docs/PRIVACY.md +1 -1
  19. package/docs/R8-SHAREABLE-TEAM-ASSETS-PLAN.md +1 -1
  20. package/docs/WANG-PRINCIPLES-PLAN.md +1 -1
  21. package/docs/architecture/STATE-MACHINES.md +18 -27
  22. package/docs/architecture/bmad-integration-validation.md +2 -2
  23. package/docs/audit-logging.md +12 -86
  24. package/docs/authentication.md +4 -4
  25. package/docs/authorization.md +15 -47
  26. package/docs/auto-claude-comparison.md +1 -33
  27. package/docs/certification/01-core-concepts/lab.md +3 -3
  28. package/docs/certification/01-core-concepts/lesson.md +11 -22
  29. package/docs/certification/01-core-concepts/quiz.md +7 -7
  30. package/docs/certification/02-enterprise-features/lab.md +0 -2
  31. package/docs/certification/02-enterprise-features/lesson.md +0 -10
  32. package/docs/certification/04-production-deployment/lab.md +1 -1
  33. package/docs/certification/05-troubleshooting/lab.md +2 -2
  34. package/docs/certification/README.md +1 -1
  35. package/docs/certification/answer-key.md +37 -20
  36. package/docs/certification/certification-exam.md +7 -7
  37. package/docs/competitive/emergence-others-analysis.md +3 -3
  38. package/docs/competitive/replit-lovable-analysis.md +2 -2
  39. package/docs/cursor-comparison.md +2 -2
  40. package/docs/dashboard-guide.md +14 -2
  41. package/docs/dev/architecture-reference.md +2 -2
  42. package/docs/dev/project-structure.md +1 -1
  43. package/docs/enterprise/architecture.md +11 -8
  44. package/docs/enterprise/integration-cookbook.md +23 -14
  45. package/docs/enterprise/migration.md +5 -9
  46. package/docs/enterprise/performance.md +3 -6
  47. package/docs/enterprise/sdk-guide.md +1 -1
  48. package/docs/enterprise/security.md +8 -17
  49. package/docs/exit-codes.md +14 -0
  50. package/docs/git-workflow.md +4 -62
  51. package/docs/network-security.md +3 -13
  52. package/docs/plans/ULTRAPLAN-FORGE-BAAS.md +1 -1
  53. package/docs/prd-purple-lab-platform-v2.md +1 -1
  54. package/docs/prd-purple-lab-platform.md +1 -3
  55. package/docs/research-2026-07/GAP-ANALYSIS-BACKLOG.md +1 -1
  56. package/docs/show-hn-post.md +3 -4
  57. package/docs/siem-integration.md +8 -10
  58. package/docs/test-scenarios/edge-cases.md +2 -2
  59. package/docs/test-scenarios/enterprise-scenarios.md +4 -4
  60. package/docs/v10/BOARD.md +7 -5
  61. package/docs/v10/GUIDE.md +5 -3
  62. package/docs/v10/METRICS.md +36 -0
  63. package/docs/v10/PROGRESS.md +42 -0
  64. package/docs/walkthrough/README.md +1 -7
  65. package/loki-ts/dist/loki.js +370 -370
  66. package/mcp/__init__.py +1 -1
  67. package/package.json +1 -1
  68. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  69. package/web-app/dist/assets/{AdminPage-DxGZSpFg.js → AdminPage-HjtApbcL.js} +1 -1
  70. package/web-app/dist/assets/{Avatar-BZEp23D8.js → Avatar-BcwLENsU.js} +1 -1
  71. package/web-app/dist/assets/{Badge-DnDwqDLu.js → Badge-DjJhHJj0.js} +1 -1
  72. package/web-app/dist/assets/{Button-C9KDP4c1.js → Button-CSMstrCz.js} +1 -1
  73. package/web-app/dist/assets/{CockpitPage-DRlh3LV2.js → CockpitPage-BHihN-aq.js} +1 -1
  74. package/web-app/dist/assets/{ComparePage-C_gE45dQ.js → ComparePage-_6JtexDp.js} +1 -1
  75. package/web-app/dist/assets/{ErrorBoundary-CL-J9-Cs.js → ErrorBoundary-Cx2fnw3q.js} +1 -1
  76. package/web-app/dist/assets/{EvidenceReceiptPanel-DABd176Y.js → EvidenceReceiptPanel-DcUQAnju.js} +1 -1
  77. package/web-app/dist/assets/{GitHubIssuesPanel-C4lYbm6O.js → GitHubIssuesPanel-1dYpQ5Rx.js} +1 -1
  78. package/web-app/dist/assets/{GitHubPRsPanel-CgiUixwo.js → GitHubPRsPanel-BPdDD1kX.js} +1 -1
  79. package/web-app/dist/assets/{HomePage-DC99RIrz.js → HomePage-JfmwLGnQ.js} +2 -2
  80. package/web-app/dist/assets/{LoginPage-Bd72QWNk.js → LoginPage-7SnMHzPc.js} +1 -1
  81. package/web-app/dist/assets/{MagicPage-CBouFs2K.js → MagicPage-C0IkoOzD.js} +1 -1
  82. package/web-app/dist/assets/{MetricsPage-c9MyDcBp.js → MetricsPage-BJOZ0L3F.js} +1 -1
  83. package/web-app/dist/assets/{NotFoundPage-ZPhiebiW.js → NotFoundPage-S49UjLyW.js} +1 -1
  84. package/web-app/dist/assets/{ProjectPage-DKwrALUb.js → ProjectPage-Dj_nv2kT.js} +3 -3
  85. package/web-app/dist/assets/{ProjectsPage-X1uZKZC_.js → ProjectsPage-C7thLjOm.js} +1 -1
  86. package/web-app/dist/assets/{SettingsPage-CiZKZRto.js → SettingsPage-DEcJyfsU.js} +1 -1
  87. package/web-app/dist/assets/{ShowcasePage-k_imKfeh.js → ShowcasePage-B5PshXNg.js} +1 -1
  88. package/web-app/dist/assets/{SystemSettingsPage-Wx9ESLll.js → SystemSettingsPage-Cnp4BkN7.js} +1 -1
  89. package/web-app/dist/assets/{TeamsPage-B7upn-I7.js → TeamsPage-1ImpgMzs.js} +1 -1
  90. package/web-app/dist/assets/{TemplatesPage-oJf_VKgh.js → TemplatesPage-BOYKrPX8.js} +1 -1
  91. package/web-app/dist/assets/{TerminalOutput-BdfPlgLI.js → TerminalOutput-LPxzwfwm.js} +1 -1
  92. package/web-app/dist/assets/{activity-BcZTsgWH.js → activity-Hl7iDpX_.js} +1 -1
  93. package/web-app/dist/assets/{bell-JNEkjWQ2.js → bell-DrBfjAq4.js} +1 -1
  94. package/web-app/dist/assets/{bot-DMAJobP_.js → bot-6SoklKaZ.js} +1 -1
  95. package/web-app/dist/assets/{check-DPTry-z2.js → check-DhHuZH8k.js} +1 -1
  96. package/web-app/dist/assets/{chevron-left-DSqOEtTV.js → chevron-left-BUERGaLO.js} +1 -1
  97. package/web-app/dist/assets/{circle-alert-BbL8Vysv.js → circle-alert-D7UOw5bc.js} +1 -1
  98. package/web-app/dist/assets/{clock-BHEr5lGW.js → clock-t3v_i7fP.js} +1 -1
  99. package/web-app/dist/assets/{cloud-C48PunYo.js → cloud-CP3eLZts.js} +1 -1
  100. package/web-app/dist/assets/{code-xml-Boa7kRqT.js → code-xml-DU-CmwVx.js} +1 -1
  101. package/web-app/dist/assets/{database-Eu35Gv7z.js → database-J27fE_Ot.js} +1 -1
  102. package/web-app/dist/assets/{dollar-sign-BO9fCnHW.js → dollar-sign-BdU_HR9C.js} +1 -1
  103. package/web-app/dist/assets/{file-code-corner-DHsSDIL_.js → file-code-corner-Cu4A1aIH.js} +1 -1
  104. package/web-app/dist/assets/{file-plus-BYiQLe5l.js → file-plus-BTli76r5.js} +1 -1
  105. package/web-app/dist/assets/{globe-BPZ5sQI2.js → globe-Bz3m1c_-.js} +1 -1
  106. package/web-app/dist/assets/{hammer-DlOLTsH3.js → hammer-HNN6jr92.js} +1 -1
  107. package/web-app/dist/assets/{index-BrgkuqSA.js → index-CgK4xqUy.js} +3 -3
  108. package/web-app/dist/assets/{layers-DMNdn1GR.js → layers-DhuXUuM6.js} +1 -1
  109. package/web-app/dist/assets/{loader-circle-_e9fypHL.js → loader-circle-CeBjdh2y.js} +1 -1
  110. package/web-app/dist/assets/{lock-D_elxMZb.js → lock-DjSqmIVZ.js} +1 -1
  111. package/web-app/dist/assets/{package-Bw-7g3JI.js → package-NL0AdpIi.js} +1 -1
  112. package/web-app/dist/assets/{plus-CZeq0pgJ.js → plus-Lbz3hom-.js} +1 -1
  113. package/web-app/dist/assets/{refresh-cw-D0WMyffs.js → refresh-cw-uKARwuER.js} +1 -1
  114. package/web-app/dist/assets/{rotate-ccw-CcKyNwXG.js → rotate-ccw-ByA6XJq1.js} +1 -1
  115. package/web-app/dist/assets/{scroll-text-C0L9Vqpm.js → scroll-text-BV8Blxig.js} +1 -1
  116. package/web-app/dist/assets/{server-SgwFv6cd.js → server-Cy3R5hde.js} +1 -1
  117. package/web-app/dist/assets/{shield-alert-D1tESlfI.js → shield-alert-rE_xXx7r.js} +1 -1
  118. package/web-app/dist/assets/{thumbs-up-bUtUA15O.js → thumbs-up-CNMITZHD.js} +1 -1
  119. package/web-app/dist/assets/{trash-2-C9Nv1kKk.js → trash-2-BP3Rr5SU.js} +1 -1
  120. package/web-app/dist/assets/{trending-down-Bh107AJe.js → trending-down-BE_8lCjD.js} +1 -1
  121. package/web-app/dist/assets/{trending-up-25BqhLVq.js → trending-up-CF6E9-9a.js} +1 -1
  122. package/web-app/dist/assets/{upload-DDYtMbN5.js → upload-D-Ui4N6K.js} +1 -1
  123. package/web-app/dist/assets/{usePolling-BSDT0il_.js → usePolling-DIVX97OV.js} +1 -1
  124. package/web-app/dist/assets/{user-CKpUEUhK.js → user-7rTiTfDj.js} +1 -1
  125. package/web-app/dist/index.html +1 -1
  126. package/docs/README-FULL.md +0 -977
@@ -1,4 +1,4 @@
1
- # Loki Mode v5.51.0 -- Integration Cookbook
1
+ # Loki Mode Integration Cookbook
2
2
 
3
3
  Step-by-step guides for connecting Loki Mode to external services. Each integration is opt-in and configured via environment variables.
4
4
 
@@ -173,9 +173,16 @@ curl -X POST "$LOKI_TEAMS_WEBHOOK_URL" \
173
173
  | Variable | Required | Description |
174
174
  |----------|----------|-------------|
175
175
  | `LOKI_JIRA_URL` | Yes | Jira Cloud base URL |
176
- | `LOKI_JIRA_EMAIL` | Yes | Jira user email for authentication |
177
176
  | `LOKI_JIRA_TOKEN` | Yes | Jira API token |
178
- | `LOKI_JIRA_PROJECT_KEY` | No | Default Jira project key |
177
+ | `LOKI_JIRA_EPIC_KEY` | No | Epic that run events are synced to |
178
+
179
+ These are read by `src/integrations/sync-subscriber.js`. The Jira user email is
180
+ passed to `JiraApiClient` in code (see below); no environment variable carries it.
181
+
182
+ Known issue on main: `src/integrations/sync-subscriber.js` constructs `JiraApiClient`
183
+ without the `email` and `apiToken` it requires, so Jira auto-sync from these
184
+ variables does not start. Construct `JiraApiClient({ baseUrl, email, apiToken })`
185
+ in code until that is fixed.
179
186
 
180
187
  ### Configuration
181
188
 
@@ -187,9 +194,7 @@ curl -X POST "$LOKI_TEAMS_WEBHOOK_URL" \
187
194
 
188
195
  ```bash
189
196
  export LOKI_JIRA_URL="https://company.atlassian.net"
190
- export LOKI_JIRA_EMAIL="user@company.com"
191
197
  export LOKI_JIRA_TOKEN="your-api-token"
192
- export LOKI_JIRA_PROJECT_KEY="PROJ"
193
198
  ```
194
199
 
195
200
  3. **Epic Sync:**
@@ -202,7 +207,7 @@ curl -X POST "$LOKI_TEAMS_WEBHOOK_URL" \
202
207
 
203
208
  const api = new JiraApiClient({
204
209
  baseUrl: process.env.LOKI_JIRA_URL,
205
- email: process.env.LOKI_JIRA_EMAIL,
210
+ email: 'user@company.com',
206
211
  apiToken: process.env.LOKI_JIRA_TOKEN,
207
212
  });
208
213
 
@@ -250,11 +255,11 @@ curl -X POST "$LOKI_TEAMS_WEBHOOK_URL" \
250
255
 
251
256
  ```bash
252
257
  # Test Jira API access
253
- curl -u "$LOKI_JIRA_EMAIL:$LOKI_JIRA_TOKEN" \
258
+ curl -u "user@company.com:$LOKI_JIRA_TOKEN" \
254
259
  "$LOKI_JIRA_URL/rest/api/3/myself" | python3 -m json.tool
255
260
 
256
261
  # Test epic fetch
257
- curl -u "$LOKI_JIRA_EMAIL:$LOKI_JIRA_TOKEN" \
262
+ curl -u "user@company.com:$LOKI_JIRA_TOKEN" \
258
263
  "$LOKI_JIRA_URL/rest/api/3/issue/PROJ-123" | python3 -m json.tool
259
264
  ```
260
265
 
@@ -282,9 +287,12 @@ curl -u "$LOKI_JIRA_EMAIL:$LOKI_JIRA_TOKEN" \
282
287
 
283
288
  | Variable | Required | Description |
284
289
  |----------|----------|-------------|
285
- | `LOKI_LINEAR_API_KEY` | Yes | Linear personal API key |
290
+ | `LOKI_LINEAR_TOKEN` | Yes | Linear personal API key |
286
291
  | `LOKI_LINEAR_TEAM_ID` | No | Default team ID for issue creation |
287
- | `LOKI_LINEAR_WEBHOOK_SECRET` | No | Webhook signing secret for inbound events |
292
+ | `LOKI_LINEAR_PROJECT_ID` | No | Project that run events are synced to |
293
+
294
+ The webhook signing secret is not an environment variable; set `webhook_secret`
295
+ under `integrations.linear` in `.loki/config.yaml`.
288
296
 
289
297
  ### Configuration
290
298
 
@@ -295,7 +303,7 @@ curl -u "$LOKI_JIRA_EMAIL:$LOKI_JIRA_TOKEN" \
295
303
  2. **Set Environment Variables:**
296
304
 
297
305
  ```bash
298
- export LOKI_LINEAR_API_KEY="lin_api_your_key_here"
306
+ export LOKI_LINEAR_TOKEN="lin_api_your_key_here"
299
307
  export LOKI_LINEAR_TEAM_ID="your-team-id"
300
308
  ```
301
309
 
@@ -304,7 +312,7 @@ curl -u "$LOKI_JIRA_EMAIL:$LOKI_JIRA_TOKEN" \
304
312
  ```javascript
305
313
  const { LinearClient } = require('./src/integrations/linear/client');
306
314
 
307
- const client = new LinearClient(process.env.LOKI_LINEAR_API_KEY);
315
+ const client = new LinearClient(process.env.LOKI_LINEAR_TOKEN);
308
316
 
309
317
  // Fetch a project with all issues
310
318
  const project = await client.getProject('project-id');
@@ -338,14 +346,15 @@ curl -u "$LOKI_JIRA_EMAIL:$LOKI_JIRA_TOKEN" \
338
346
 
339
347
  5. **Webhook Handler (optional):**
340
348
 
341
- Configure Linear to send webhooks to your Loki Mode instance for bidirectional sync.
349
+ Configure Linear to send webhooks to your Loki Mode instance. Signatures are
350
+ verified when `webhook_secret` is set (`src/integrations/linear/sync.js`).
342
351
 
343
352
  ### Verification
344
353
 
345
354
  ```bash
346
355
  # Test Linear API access
347
356
  curl -X POST https://api.linear.app/graphql \
348
- -H "Authorization: $LOKI_LINEAR_API_KEY" \
357
+ -H "Authorization: $LOKI_LINEAR_TOKEN" \
349
358
  -H "Content-Type: application/json" \
350
359
  -d '{"query": "{ viewer { id name } }"}'
351
360
  ```
@@ -1,4 +1,4 @@
1
- # Loki Mode v5.51.0 -- Migration Guide
1
+ # Loki Mode Migration Guide
2
2
 
3
3
  ## Upgrading from v5.50.0 to v5.51.0
4
4
 
@@ -76,10 +76,7 @@ See `docs/enterprise/sdk-guide.md` for installation and usage.
76
76
  | `LOKI_TEAMS_WEBHOOK_SECRET` | (unset) | Teams webhook shared secret |
77
77
  | `LOKI_OIDC_ISSUER` | (unset) | OIDC identity provider URL |
78
78
  | `LOKI_OIDC_CLIENT_ID` | (unset) | OIDC client ID |
79
- | `LOKI_OIDC_CLIENT_SECRET` | (unset) | OIDC client secret |
80
- | `LOKI_OIDC_REDIRECT_URI` | (unset) | OIDC redirect URI |
81
- | `LOKI_CORS_ORIGINS` | localhost | Allowed CORS origins |
82
- | `LOKI_API_RATE_LIMIT` | 100 | API rate limit (requests/min) |
79
+ | `LOKI_DASHBOARD_CORS` | localhost | Allowed CORS origins |
83
80
 
84
81
  ### Existing Environment Variables (Unchanged)
85
82
 
@@ -101,12 +98,11 @@ These variables from v5.50.0 continue to work identically:
101
98
  | `LOKI_TLS_CERT` | (unset) | TLS certificate path |
102
99
  | `LOKI_TLS_KEY` | (unset) | TLS key path |
103
100
  | `LOKI_JIRA_URL` | (unset) | Jira Cloud base URL |
104
- | `LOKI_JIRA_EMAIL` | (unset) | Jira user email |
105
101
  | `LOKI_JIRA_TOKEN` | (unset) | Jira API token |
106
- | `LOKI_JIRA_PROJECT_KEY` | (unset) | Default Jira project key |
107
- | `LOKI_LINEAR_API_KEY` | (unset) | Linear API key |
102
+ | `LOKI_JIRA_EPIC_KEY` | (unset) | Jira epic that run events sync to |
103
+ | `LOKI_LINEAR_TOKEN` | (unset) | Linear API key |
108
104
  | `LOKI_LINEAR_TEAM_ID` | (unset) | Linear team ID |
109
- | `LOKI_LINEAR_WEBHOOK_SECRET` | (unset) | Linear webhook secret |
105
+ | `LOKI_LINEAR_PROJECT_ID` | (unset) | Linear project that run events sync to |
110
106
  | `LOKI_GITHUB_SYNC` | (unset) | Enable GitHub sync |
111
107
 
112
108
  ### API Changes
@@ -1,4 +1,4 @@
1
- # Loki Mode v5.51.0 -- Enterprise Performance Tuning
1
+ # Loki Mode Enterprise Performance Tuning
2
2
 
3
3
  ## Overview
4
4
 
@@ -233,11 +233,8 @@ uvicorn dashboard.server:app --workers 4 --host 0.0.0.0 --port 57374
233
233
 
234
234
  Dashboard API rate limits protect against abuse:
235
235
 
236
- ```bash
237
- # Default rate limits are built into the API layer
238
- # Override via env vars if needed
239
- export LOKI_API_RATE_LIMIT="100" # requests per minute
240
- ```
236
+ Rate limits are built into the API layer (10 requests/min on control endpoints,
237
+ 60 on rate-limited read endpoints) and are not configurable by environment variable.
241
238
 
242
239
  ### Static Asset Caching
243
240
 
@@ -1,4 +1,4 @@
1
- # Loki Mode v5.51.0 -- SDK Guide
1
+ # Loki Mode SDK Guide
2
2
 
3
3
  Official Python and TypeScript SDKs for the Autonomi Control Plane API. Both SDKs have zero external dependencies -- they use only standard library features.
4
4
 
@@ -1,4 +1,4 @@
1
- # Loki Mode v5.51.0 -- Enterprise Security
1
+ # Loki Mode Enterprise Security
2
2
 
3
3
  ## Overview
4
4
 
@@ -167,27 +167,18 @@ When both variables are set, the dashboard server binds on HTTPS only. Self-sign
167
167
 
168
168
  ### Rate Limiting
169
169
 
170
- The API enforces rate limits per token/IP:
171
-
172
- | Endpoint Group | Default Limit |
173
- |----------------|---------------|
174
- | Read operations | 100 req/min |
175
- | Write operations | 30 req/min |
176
- | Auth operations | 10 req/min |
177
-
178
- Rate limit headers are included in every response:
179
- ```
180
- X-RateLimit-Limit: 100
181
- X-RateLimit-Remaining: 95
182
- X-RateLimit-Reset: 1708520460
183
- ```
170
+ The dashboard API applies in-process rate limits (`_RateLimiter` in
171
+ `dashboard/server.py`): 10 requests/min on control endpoints and 60
172
+ requests/min on rate-limited read endpoints. Exceeding them returns HTTP 429.
173
+ The limits are not configurable by environment variable, and no
174
+ `X-RateLimit-*` headers are sent.
184
175
 
185
176
  ### CORS
186
177
 
187
178
  CORS is configured via environment variables:
188
179
 
189
180
  ```bash
190
- export LOKI_CORS_ORIGINS="https://dashboard.company.com,https://admin.company.com"
181
+ export LOKI_DASHBOARD_CORS="https://dashboard.company.com,https://admin.company.com"
191
182
  ```
192
183
 
193
184
  Default behavior: `localhost` origins are allowed for development. In production, explicitly set allowed origins.
@@ -228,7 +219,7 @@ This is a deliberate fail-closed design. Invalid or missing signatures always re
228
219
 
229
220
  ## Audit Logging
230
221
 
231
- ### Hash-Chained Tamper-Evident Logs
222
+ ### Hash-Chained Audit Logs
232
223
 
233
224
  Audit logs use SHA-256 hash chains for tamper evidence. Each entry's hash depends on the previous entry's hash, creating an immutable chain from the genesis record.
234
225
 
@@ -50,6 +50,20 @@ immediately instead of burning `backoffLimit`. Requires Kubernetes 1.31+.
50
50
  Both the bash runner and the Bun runner (`LOKI_SDK_LOOP`) implement this
51
51
  identically; a parity test asserts they agree status for status.
52
52
 
53
+ ## `loki quick`
54
+
55
+ | Code | Meaning |
56
+ |---|---|
57
+ | 0 | The run completed and its diff did not weaken the tests |
58
+ | 3 | The diff weakened the tests (a skip marker added in a test file, a test runner config changed, or an existing test file deleted or renamed). The receipt headline is NOT VERIFIED and names what was weakened, for example `NOT VERIFIED (tests weakened: skip added in sum.test.js)` |
59
+ | other nonzero | The run itself failed; this code is passed through unchanged |
60
+
61
+ Code 3 only ever raises an exit of 0, in quiet and `LOKI_VERBOSE=1` modes alike;
62
+ it never lowers another nonzero code. Edited assertion lines are disclosed in
63
+ the receipt (`tests_integrity:assertions_edited`) and keep exit 0. A NOT VERIFIED
64
+ headline caused by unproven gates alone also keeps exit 0. The signal is the
65
+ `tests_integrity` item in the proof's `honesty.degraded`, not the headline text.
66
+
53
67
  ## `loki verify`
54
68
 
55
69
  | Code | Verdict |
@@ -19,7 +19,7 @@ When enabled, Loki Mode automatically:
19
19
 
20
20
  1. Creates a feature branch: `loki/session-<timestamp>-<pid>`
21
21
  2. Performs all agent work on the feature branch
22
- 3. Creates a PR at session end (if GitHub CLI is available)
22
+ 3. Creates a PR at session end when `LOKI_AUTO_PR=1` (and GitHub CLI is available)
23
23
  4. Requires manual review and merge to main
24
24
 
25
25
  ### Feature Branch Naming
@@ -62,25 +62,8 @@ Delete feature branch
62
62
 
63
63
  | Variable | Default | Description |
64
64
  |----------|---------|-------------|
65
- | `LOKI_BRANCH_PROTECTION` | `false` | Enable automatic feature branch workflow |
66
- | `LOKI_BASE_BRANCH` | `main` | Target branch for PRs (or `master` if detected) |
67
- | `LOKI_BRANCH_PREFIX` | `loki/session-` | Prefix for auto-created branches |
68
- | `LOKI_AUTO_PR` | `true` | Automatically create PR at session end |
69
- | `LOKI_PR_TEMPLATE` | - | Path to PR description template |
70
-
71
- ### Configuration File
72
-
73
- ```yaml
74
- # .loki/config.yaml
75
- git:
76
- branch_protection:
77
- enabled: true
78
- base_branch: main
79
- branch_prefix: loki/session-
80
- auto_pr: true
81
- squash_merge: true
82
- delete_after_merge: true
83
- ```
65
+ | `LOKI_BRANCH_PROTECTION` | `true` | Run agent work on an auto-created `loki/session-<timestamp>-<pid>` branch |
66
+ | `LOKI_AUTO_PR` | off | Set to `1` to push the session branch and open a PR at session end |
84
67
 
85
68
  ## Manual Git Workflow
86
69
 
@@ -126,7 +109,7 @@ git push origin feature/my-feature
126
109
 
127
110
  ### Automatic PR Creation
128
111
 
129
- When `LOKI_AUTO_PR=true` and GitHub CLI is installed:
112
+ When `LOKI_AUTO_PR=1` and GitHub CLI is installed:
130
113
 
131
114
  ```bash
132
115
  # Loki Mode automatically runs at session end
@@ -137,47 +120,6 @@ gh pr create \
137
120
  --head loki/session-20260215-143022-12345
138
121
  ```
139
122
 
140
- ### PR Description Template
141
-
142
- Create a template for consistent PR descriptions:
143
-
144
- ```markdown
145
- # .loki/pr-template.md
146
-
147
- ## Changes
148
-
149
- <!-- Auto-generated summary of changes -->
150
-
151
- ## Tasks Completed
152
-
153
- <!-- List of completed tasks from task queue -->
154
-
155
- ## Quality Gates
156
-
157
- - [ ] All tests passing
158
- - [ ] Code review completed
159
- - [ ] No security vulnerabilities
160
- - [ ] Documentation updated
161
-
162
- ## Cost
163
-
164
- Estimated cost: $X.XX USD
165
-
166
- ## Session Info
167
-
168
- - Start: YYYY-MM-DD HH:MM:SS
169
- - End: YYYY-MM-DD HH:MM:SS
170
- - Duration: X hours
171
- - Iterations: X
172
- - Provider: claude/cline/codex/aider/opencode
173
- ```
174
-
175
- Set template path:
176
-
177
- ```bash
178
- export LOKI_PR_TEMPLATE=.loki/pr-template.md
179
- ```
180
-
181
123
  ## Agent Action Audit
182
124
 
183
125
  All Git operations performed by agents are logged to `.loki/logs/agent-audit.jsonl`:
@@ -6,19 +6,9 @@ Network egress control and isolation for Loki Mode deployments.
6
6
 
7
7
  This guide covers network-level security controls for restricting outbound network access from Loki Mode containers and pods to only the AI API endpoints required for operation.
8
8
 
9
- ## Environment Variables
10
-
11
- **None of the variables below are implemented. Do not rely on them.** They are
12
- reserved names for a planned application-level enforcement layer, and no
13
- runtime code reads any of them today. Network security is enforced entirely at
14
- the infrastructure level, using the Docker network and Kubernetes NetworkPolicy
15
- recipes in the rest of this guide.
16
-
17
- | Variable | Default | Description | Status |
18
- |----------|---------|-------------|--------|
19
- | `LOKI_NETWORK_EGRESS_POLICY` | `unrestricted` | `unrestricted` (default), `ai-only` (restrict to AI APIs), `none` (block all outbound) | Planned, target TBD |
20
- | `LOKI_ALLOWED_HOSTS` | (empty) | Comma-separated list of additional hostnames to allow when egress policy is `ai-only` | Planned, target TBD |
21
- | `LOKI_BLOCK_METADATA_ENDPOINT` | `false` | Block cloud metadata endpoint (169.254.169.254) from within the application | Planned, target TBD |
9
+ Loki Mode has no application-level egress setting: no runtime code restricts
10
+ outbound hosts. Network security is enforced entirely at the infrastructure
11
+ level, using the Docker network and Kubernetes NetworkPolicy recipes below.
22
12
 
23
13
  ## Docker Network Isolation
24
14
 
@@ -25,7 +25,7 @@ Loki Mode today is a **multi-agent autonomous orchestrator**, not a BaaS. It own
25
25
  - An auth layer (`dashboard/auth.py`, `web-app/auth.py`) supporting Bearer tokens, OIDC (Google/Azure/Okta), bcrypt password hashing, RBAC scopes
26
26
  - A working completion-council with anti-sycophancy, 3-reviewer parallel review, devil's-advocate fallback
27
27
  - A healing-mode for legacy systems (v6.67+) with friction-as-semantics
28
- - 41 specialized agent types and a queue system
28
+ - Specialized agent types and a queue system
29
29
 
30
30
  **The gap:** every backend primitive Loki owns is for orchestrating the agent. None of it is for the *application the agent is building*. When `loki start ./prd.md` builds "a Twitter clone with login and image uploads", the agent has to invent the auth flow, choose a DB, set up storage, wire Stripe, etc. - and the user has to run a parallel set of tools (Supabase, Stripe, Cloudflare R2) to support the resulting app.
31
31
 
@@ -165,7 +165,7 @@ URL bar showing current preview path, Refresh button, Open in New Tab button.
165
165
  Based on feedback:
166
166
  - Memory System Viewer (power-user debug tool, not customer-facing)
167
167
  - Full Integrations page (keep GitHub only, defer Jira/Linear/Slack/Teams)
168
- - 41-agent grid (most sessions have 1-3 agents active; show compact list instead)
168
+ - Agent grid (most sessions have 1-3 agents active; show compact list instead)
169
169
  - Code Review panel (let quality gates surface findings inline)
170
170
  - Collaboration/multiplayer (acknowledged as future need, not v1)
171
171
  - Database provisioning (out of scope for v1)
@@ -137,8 +137,6 @@ Each card:
137
137
 
138
138
  Integrations available:
139
139
  - **GitHub**: Connect repo, import issues, create PRs (`loki github`, `loki run`)
140
- - **Jira**: Bidirectional sync (`LOKI_JIRA_*` env vars)
141
- - **Linear**: Issue sync (`LOKI_LINEAR_*` env vars)
142
140
  - **Slack**: Notifications + slash commands (`LOKI_SLACK_*`)
143
141
  - **Teams**: Adaptive Cards notifications (`LOKI_TEAMS_*`)
144
142
  - **OpenTelemetry**: Trace export (`loki telemetry`)
@@ -197,7 +195,7 @@ Each gate: name, status (pass/fail/pending), details expandable
197
195
 
198
196
  ### Agent Activity
199
197
 
200
- Real-time grid showing which of the 41 agent types are active:
198
+ Real-time grid showing which agent types are active:
201
199
  - Agent name, type, domain, model tier (Opus/Sonnet/Haiku)
202
200
  - Current task
203
201
  - Status (working/idle/completed)
@@ -65,7 +65,7 @@ Acceptance criteria:
65
65
  Validation: Fixture repos: (A) spec names endpoint /orders that exists -> no finding; (B) spec names /orders but no handler -> High finding; (C) plaintext password store -> invariant finding. Measure false-positive rate on 3 clean real repos (must be zero). Prove accuracy lift on the FrontierCode-style benchmark (rank 12): source-grounded checklists should catch wrong-but-internally-consistent implementations that prose-only checklists pass.
66
66
 
67
67
  ### #3 Annotate-before-act: pre-committed expected-outcome ledger, diffed against reality at verify time (loki-mode, high/L)
68
- Before running verification for a change/checklist-item, the runtime writes a tamper-evident ledger of EXPECTED observable outcomes (e.g. 'GET /health -> 200 {status:ok}', 'test X fails before fix, passes after', 'endpoint Y should now exist'). At verify time, actual results are compared to the pre-committed prediction; any expectation silently dropped or contradicted becomes a finding. Reuse the proof-verify canonical-hash + drift pattern so the ledger is tamper-evident and edits-after-the-fact are detectable. Forces a falsifiable prediction, cutting self-serving post-hoc rationalization.
68
+ Before running verification for a change/checklist-item, the runtime writes a hash-chained ledger of EXPECTED observable outcomes (e.g. 'GET /health -> 200 {status:ok}', 'test X fails before fix, passes after', 'endpoint Y should now exist'). At verify time, actual results are compared to the pre-committed prediction; any expectation silently dropped or contradicted becomes a finding. Reuse the proof-verify canonical-hash + drift pattern so the ledger is tamper-evident and edits-after-the-fact are detectable. Forces a falsifiable prediction, cutting self-serving post-hoc rationalization.
69
69
  Acceptance criteria:
70
70
  - .loki/expectations/<iter>.json written BEFORE the verify/checklist run, each entry {id, statement, check_ref, expected}, canonicalized and hashed like proof-generator
71
71
  - loki verify (or the completion gate) reads the ledger and emits a finding for any expectation with no matching executed check, or whose actual contradicts expected
@@ -2,13 +2,13 @@
2
2
 
3
3
  ## Title
4
4
 
5
- Show HN: Loki Mode - PRD in, tested code out (41 agent roles, 8 quality gates, RARV self-verification)
5
+ Show HN: Loki Mode - PRD in, tested code out (8 quality gates, RARV self-verification)
6
6
 
7
7
  ## Body
8
8
 
9
9
  I built Loki Mode because I got tired of the copy-paste loop between AI coding assistants and my terminal. I wanted to hand over a PRD and get back a working, tested codebase -- not perfect, but a solid starting point.
10
10
 
11
- **What it does:** You give it a Product Requirements Document. It breaks the work into tasks across 41 specialized agent roles organized into 8 domains (engineering, operations, business, data, product, growth, review, orchestration) -- prompt-defined specifications the orchestrator adopts per phase, with parallel review (blind council) and optional worktree streams on Claude Code, sequential on other providers -- and runs every iteration through a self-verification loop called RARV: Reason, Act, Reflect, Verify. The idea is that the system catches its own mistakes before you have to.
11
+ **What it does:** You give it a Product Requirements Document. It breaks the work into tasks across specialized agent roles (engineering, operations, business, data, product, growth, review, orchestration) -- prompt-defined specifications the orchestrator adopts per phase, with parallel review (blind council) and optional worktree streams on Claude Code, sequential on other providers -- and runs every iteration through a self-verification loop called RARV: Reason, Act, Reflect, Verify. The idea is that the system catches its own mistakes before you have to.
12
12
 
13
13
  **Quality gates:** 8 automated gates including 3-reviewer blind review (agents review each other's work without seeing prior reviews), anti-sycophancy checks (a devil's advocate pass on unanimous approvals), and mock/mutation detection. These are not foolproof, but they catch a surprising number of issues that single-pass generation misses.
14
14
 
@@ -20,9 +20,8 @@ I built Loki Mode because I got tired of the copy-paste loop between AI coding a
20
20
 
21
21
  **Research foundation:** The architecture draws from Anthropic's Constitutional AI (principles-based self-critique), DeepMind's Scalable Oversight via Debate, and OpenAI's Agents SDK patterns (guardrails, tripwires, handoffs). References to specific papers are in the repo.
22
22
 
23
- **What it does NOT do:** It does not deploy anything. It generates deployment configs (Helm, Docker Compose, Terraform), but a human deploys. Complex domain logic will need human review. The system can and does make mistakes, especially on novel problems. Token costs scale with project complexity. Our SWE-bench numbers (299/300 patches generated) measure output, not resolution -- the official evaluator has not been run, so the actual fix rate is unknown and likely significantly lower than the generation rate. The HumanEval score is self-reported with max 3 retries per problem.
23
+ **What it does NOT do:** It does not deploy anything. It generates deployment configs (Helm, Docker Compose, Terraform), but a human deploys. Complex domain logic will need human review. The system can and does make mistakes, especially on novel problems. Token costs scale with project complexity. There is no published benchmark score.
24
24
 
25
- **Test suite:** 683 npm tests, 631 pytest tests, 16 shell tests. Self-reported HumanEval score of 162/164 (98.78%).
26
25
 
27
26
  Built solo. BUSL-1.1 source-available.
28
27
 
@@ -8,7 +8,7 @@ Loki Mode supports integration with enterprise SIEM systems for:
8
8
 
9
9
  - Centralized security monitoring
10
10
  - Real-time threat detection
11
- - Compliance reporting (SOC2, HIPAA, PCI-DSS)
11
+ - Audit evidence for your own compliance reporting
12
12
  - Incident response
13
13
  - Forensic analysis
14
14
 
@@ -385,7 +385,6 @@ logs:
385
385
  tags:
386
386
  - env:production
387
387
  - team:security
388
- - compliance:soc2
389
388
 
390
389
  # Process JSON logs
391
390
  logs_config:
@@ -487,14 +486,13 @@ in your SIEM, where the correlation and retention rules already live.
487
486
  To pull an evidence slice locally for an auditor:
488
487
 
489
488
  ```bash
490
- AUDIT=~/.loki/dashboard/audit/audit.jsonl
489
+ AUDIT=~/.loki/dashboard/audit # one audit-YYYY-MM-DD.jsonl file per day
491
490
 
492
- # Access events in a date range (SOC2 / HIPAA evidence)
493
- jq -s 'map(select(.timestamp >= "2026-01-01" and .timestamp <= "2026-12-31"))' \
494
- "$AUDIT" > audit-evidence.json
491
+ # Events in a date range
492
+ cat "$AUDIT"/audit-*.jsonl | jq -s 'map(select(.timestamp >= "2026-01-01" and .timestamp <= "2026-12-31"))' > audit-evidence.json
495
493
 
496
- # Token lifecycle events (PCI-DSS Requirement 8)
497
- jq -c 'select(.event | startswith("auth.token."))' "$AUDIT"
494
+ # Token lifecycle events
495
+ cat "$AUDIT"/audit-*.jsonl | jq -c 'select(.resource_type == "token")'
498
496
  ```
499
497
 
500
498
  Verify the hash chain before handing the file over. There is no
@@ -592,8 +590,8 @@ logger -n syslog.example.com -P 514 "Test from Loki Mode"
592
590
  echo $LOKI_AUDIT_SYSLOG_HOST
593
591
  loki syslog test
594
592
 
595
- # Check for forwarding errors
596
- loki enterprise audit tail --event syslog.error
593
+ # Check recent audit entries
594
+ loki enterprise audit tail
597
595
  ```
598
596
 
599
597
  ### Format Issues
@@ -1,7 +1,7 @@
1
1
  # Loki Mode Edge Case Test Scenarios
2
2
 
3
3
  Agent 12 - Scenario Writing: Edge Cases, Error Paths, Concurrent Usage
4
- Version: v6.71.1 | Date: 2026-03-24
4
+ Date: 2026-03-24
5
5
 
6
6
  ---
7
7
 
@@ -55,7 +55,7 @@ Version: v6.71.1 | Date: 2026-03-24
55
55
  **Given** an autonomous session is running at iteration 15 of 1000
56
56
  **When** the network connection drops (DNS resolution fails, API timeout)
57
57
  **Then** the system should:
58
- - The provider CLI (claude/codex/gemini) exits with a non-zero exit code
58
+ - The provider CLI (claude/codex/cline/aider/opencode) exits with a non-zero exit code
59
59
  - `run_autonomous()` captures the exit code in `$exit_code` (run.sh:9406)
60
60
  - Rate limit detection runs via `is_rate_limited()` (checks for common rate limit strings)
61
61
  - If failover is enabled (`LOKI_FAILOVER=true`), attempt `attempt_provider_failover()`
@@ -52,7 +52,7 @@ Source: `.github/workflows/loki-ci-example.yml:41-44`
52
52
  ### TW-04: Handoff Between Human and AI Coding
53
53
 
54
54
  ```
55
- GIVEN a loki autonomous session is running (iteration 5 of 20)
55
+ GIVEN a Loki autonomous session is running (iteration 5 of 20)
56
56
  AND the human developer notices a design issue
57
57
  WHEN the developer creates .loki/PAUSE signal file
58
58
  THEN the session pauses after the current RARV iteration completes
@@ -66,7 +66,7 @@ Source: `autonomy/run.sh:7897` (check_human_intervention)
66
66
  ### TW-05: Project Template Sharing Across Team
67
67
 
68
68
  ```
69
- GIVEN the team uses loki templates (13 types: saas, cli, discord-bot, etc.)
69
+ GIVEN the team uses Loki PRD templates (saas, cli, discord-bot, etc.)
70
70
  AND the team lead wants to standardize on a custom template
71
71
  WHEN the lead creates a PRD template at templates/custom-team.md
72
72
  AND commits it to the shared repository
@@ -195,7 +195,7 @@ Source: `skills/parallel-workflows.md`
195
195
  ### GI-02: Meaningful AI Commit Messages
196
196
 
197
197
  ```
198
- GIVEN a loki session has completed a RARV iteration
198
+ GIVEN a Loki session has completed a RARV iteration
199
199
  AND the iteration modified 4 files
200
200
  WHEN the autonomous system commits changes
201
201
  THEN the commit message follows the format: "<type>: <description>"
@@ -437,7 +437,7 @@ Source: `.github/workflows/release.yml:238-496`
437
437
 
438
438
  ```
439
439
  GIVEN the dashboard WebSocket endpoint is available at /ws
440
- AND a CI pipeline is running a loki session
440
+ AND a CI pipeline is running a Loki session
441
441
  WHEN the WebSocket client connects
442
442
  THEN real-time events are streamed including:
443
443
  - iteration_start / iteration_complete
package/docs/v10/BOARD.md CHANGED
@@ -629,7 +629,9 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
629
629
  | E-159 | Pre-existing secret-scan gaps found by the E-157 r2 opus reviewer: (a) an evil merge, a merge commit whose OWN content adds a secret (merge -s ours --no-commit, token in the merge commit), is invisible to both the PARENT..SHA range scan and the --all scan (only `gitleaks dir` found it); (b) pinned gitleaks 8.30.0 exits 0 when its internal git log fails (invalid range), a latent fail-open. Fix: --diff-merges=first-parent (or -m) in --log-opts for both modes or a working-tree scan at the release SHA; guard `git rev-list RANGE` success or treat `[git] fatal` as failure | scripts/security-audit-gitleaks.sh, workflows, tests | HIGH | evil-merge and bad-range fixtures fail the scan | merged@2026-10-01T03:03Z | CI-health engineer after E-157 r3; r1 opus REJECT 5f33451d: stdin merge scan false-positives on real history (v10.5.13..14 rc 1), Wall checks skip in CI |
630
630
  | E-160 | D46 runner contention (peer steer 02:11Z): a green train SHA fast-forwarded to main re-runs Tests (8 shards), Bun Parity, Security Audit and First-run gate on the identical SHA, doubling runner load and queueing the next train. Proposal: on push to main, a first job checks for a successful run of the same workflow at the same SHA from a train/** push and, if found, exits success recording the reused run id (D28: same SHA = same tree); any SHA not train-tested runs in full. CTO call FIRST: OPERATING-MODEL says "Tier B full verification on every main commit (never cancelled on main)"; confirm reuse does not weaken Release required-ci, branch-conditional steps (train vs main), or the Security Audit range (base tag config). Sequence after E-157 r4 (same files) | .github/workflows/test.yml, bun-parity.yml, security-audit.yml, tests/test_release_required_ci.py | HIGH | main push of a train-green SHA records reuse and finishes in under 1 min; an untested SHA runs in full; a train-red SHA is not reused | ready@2026-10-01T02:10Z | CTO decision first; after E-157 |
631
631
  | E-161 | INCIDENT 02:46Z: an opus reviewer ran `git checkout --detach <tag>` x7 plus a `.gitleaksignore` overwrite in the SHARED main checkout (reflog 02:46:04Z to 02:46:38Z). Cause: its run-owned clone dir was deleted, the next `cd` into a new clone failed, and the shell cwd fell back to the main checkout; every later command ran there. Restored by the Chief of Staff (`git checkout main`, fafe50dd, clean). Guard: v10-guard.sh (PreToolUse) blocks `git checkout`/`git switch`/`git reset`/`git worktree remove` and writes to tracked files when cwd resolves to the main checkout and the caller is an agent (not the leader session); agent prompts use `cd DIR` followed by an exit-on-failure check. Test: a hook test with cwd=main checkout blocks a detached checkout and allows it in a worktree | scripts/v10-guard.sh, tests | HIGH | detached checkout in main checkout blocked; same in a worktree allowed | ready@2026-10-01T02:47Z | GUARDS.md entry |
632
- | E-162 | Founder "faster" (03:05Z): slice CI runs only Tier A plus diff-selected suites (the existing Tier A selection), Bun Parity and the structural guards; the full 8-shard Tests stays on train/** and main, and the train stays the release verdict. Frees runners and targets about 2 min slice CI | .github/workflows/test.yml (slice-* job matrix only), tests | HIGH | slice-* push runs no 8-shard matrix; train/** and main still run all 8 shards; a slice touching a suite runs that suite | ready@2026-10-01T03:01Z | after E-157 r4 (same file) |
632
+ | E-162 | Founder "faster" (03:05Z): slice CI runs only Tier A plus diff-selected suites (the existing Tier A selection), Bun Parity and the structural guards; the full 8-shard Tests stays on train/** and main, and the train stays the release verdict. Frees runners and targets about 2 min slice CI | .github/workflows/test.yml (slice-* job matrix only), tests | HIGH | slice-* push runs no 8-shard matrix; train/** and main still run all 8 shards; a slice touching a suite runs that suite | merged@2026-10-01T05:22Z | after E-157 r4 (same file) |
633
+ | E-165 | tests/test-mirofish-integration.sh line 413 runs `autonomy/loki start --no-mirofish` in the repo root: a live autonomous build that ran about 45 min, switched a worktree branch to loki/session-* and committed a docs change (found by DOC-02). Guard: the test must run against a run-owned fixture repo with a stub provider and LOKI_NO_BROWSER=1, never the repo root; add a structural guard that no test launches start/run against REPO_ROOT | tests/test-mirofish-integration.sh, a structural guard | HIGH | the test never runs loki start in the repo root; guard catches a planted case | ready@2026-10-01T04:07Z | P0 guard (D26) |
634
+ | E-166 | Jira auto-sync never starts: src/integrations/sync-subscriber.js builds JiraApiClient without the required email and apiToken, so LOKI_JIRA_URL plus LOKI_JIRA_TOKEN do nothing (DOC-02 added a known-issue note to the setup docs). Fix the wiring or remove the advertised auto-sync | src/integrations/sync-subscriber.js, tests | MEDIUM | with env set, the subscriber constructs a working client (mocked API) | ready@2026-10-01T04:07Z | none |
633
635
  | D49-auto | Auto-promote to latest on Post-Release Smoke success (founder D49) | .github/workflows/promote.yml, tests/test_release_next_tag.py | HIGH | smoke-success from Release promotes; manual smoke never promotes; not-lower guard | merged@2026-10-01T03:03Z | opus APPROVE 5510b8c8. Follow-ups (D49-auto-b): not-lower guard fails OPEN on an npm error (make it fail closed); loki-mode-sdk latest has no not-lower guard; a newer queued promote can replace a pending one in a release burst |
634
636
  | D51-A3 | Headless `loki backlog owner/repo --all/--label/--issues` plus loki.yaml (schema, validator, env overrides) | autonomy/lib/backlog.py, autonomy/lib/loki_yaml.py, autonomy/loki, schemas/loki-yaml.schema.json, tests/test-backlog.sh | HIGH | backlog 47/0 | merged@2026-10-01T03:11Z | sonnet APPROVE 14ff9ae2; follow-up D51-A3b: `loki_yaml.py show` echoes a token pasted into git.token_env (redact x-secret-ref fields); no-parser test case; re-run of a failed issue discards its kept worktree |
635
637
  | D51-A4 | Slack on the v10 path (PR opened, BLOCKED, finished), webhook from the env var named by LOKI_SLACK_WEBHOOK_ENV, URL redacted, 5s bounded post | loki-ts/src/e10ext/slack_events.ts, engine10/supervisor.ts, tests | MEDIUM | slack tests 40/0 | merged@2026-10-01T03:11Z | sonnet APPROVE adb838b2; one labelled test message after it ships |
@@ -640,20 +642,20 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
640
642
  | 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 | released@2026-10-01T00:52Z | core at the 5000 cap: needs an offset (A-150) Released in v10.5.13 (merge bdb332e3 is an ancestor of v10.5.13). |
641
643
  | 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 | released@2026-10-01T01:53Z | Released in v10.5.15 (merge 945f58ec is an ancestor of v10.5.15). |
642
644
  | A-119 | P0 FALSE VERIFIED ON MAIN (A-115b opus reviewer, reproduced on bba2e5ec): rename the target test file and weaken its expectation (sum.test.js => sum.spec.test.js with 6 changed to 5), add a comment to sum.js: rc=0 Outcome VERIFIED, receipt shows node:sum.spec.test.js pass, sum.js still buggy. verify only sees relevant test files that still exist on head; seal writes `weakened test: sum.test.js` (seal.ts:205) but that line never downgrades the verdict. Fix: seal's `weakened test:` downgrades to PARTIAL like verify's not_proven | loki-ts/src/engine10/stages/seal.ts, tests | HIGH | rename-and-weaken fixture: not VERIFIED, rc!=0 | released@2026-10-01T01:53Z | Tier 0 Released in v10.5.15 (merge c41a2b83 is an ancestor of v10.5.15). |
643
- | A-119b | A-119 opus review (REJECT on pre-existing holes, A-119 landed as a strict improvement): weakening still ends VERIFIED via (1) a helper file a base test imports (eq=()=>{}), (2) snapshot or fixture edits (__snapshots__/*.snap, tests/fixtures/*.json), (3) tests isTestFile (testmap.ts:51) does not recognise: __tests__/*.js, mocha test/*.js, cargo tests/*.rs, including rename to .bak. Also: verdictOf returns ALREADY_SATISFIED before the weakened downgrade when implement says already_done; package.json jest testPathIgnorePatterns and vite.config.ts test.exclude skip config detection. Fix: widen the seal.ts weakTests predicate to any changed/deleted base path under test/, tests/, __tests__/, __snapshots__/, fixtures dirs plus non-test files a base test imports; check weakened before the already_done early return; add vite.config and in-block jest keys to CFG detection | loki-ts/src/engine10/stages/seal.ts, verify.ts (CFG only), tests | HIGH | each repro gives not-VERIFIED; source-only fix and new test stay VERIFIED | building@2026-10-01T02:18Z | |
645
+ | A-119b | A-119 opus review (REJECT on pre-existing holes, A-119 landed as a strict improvement): weakening still ends VERIFIED via (1) a helper file a base test imports (eq=()=>{}), (2) snapshot or fixture edits (__snapshots__/*.snap, tests/fixtures/*.json), (3) tests isTestFile (testmap.ts:51) does not recognise: __tests__/*.js, mocha test/*.js, cargo tests/*.rs, including rename to .bak. Also: verdictOf returns ALREADY_SATISFIED before the weakened downgrade when implement says already_done; package.json jest testPathIgnorePatterns and vite.config.ts test.exclude skip config detection. Fix: widen the seal.ts weakTests predicate to any changed/deleted base path under test/, tests/, __tests__/, __snapshots__/, fixtures dirs plus non-test files a base test imports; check weakened before the already_done early return; add vite.config and in-block jest keys to CFG detection | loki-ts/src/engine10/stages/seal.ts, verify.ts (CFG only), tests | HIGH | each repro gives not-VERIFIED; source-only fix and new test stay VERIFIED | rejected@2026-10-01T05:12Z | |
644
646
  | 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 | merged@2026-10-01T02:50Z | after A-130 (supervisor.ts); r2: opus REJECT, tail truncation erases post-seal tamper, fix = signed final log line |
645
- | 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 | building@2026-10-01T02:15Z | D47 decided: rc 3 on tests_integrity failed (skip added, runner config changed, test file deleted/renamed); assertion edits disclosed rc 0; G1 green needs pass 2 fail 0, 9b asserts rc 3. Files: proof-generator.py, run.sh after generate_proof_of_run, first-run-gate.sh, docs/exit-codes.md. Blocks promote of `latest`; built df404970, opus review |
647
+ | 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 | merged@2026-10-01T05:12Z | D47 decided: rc 3 on tests_integrity failed (skip added, runner config changed, test file deleted/renamed); assertion edits disclosed rc 0; G1 green needs pass 2 fail 0, 9b asserts rc 3. Files: proof-generator.py, run.sh after generate_proof_of_run, first-run-gate.sh, docs/exit-codes.md. Blocks promote of `latest`; built df404970, opus review |
646
648
  | 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 |
647
649
  | 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 | released@2026-10-01T01:19Z | keep the A-110 escalated emit; the A-110 reviewer plugin probe is a good e2e template Released in v10.5.14 (merge 0377398d is an ancestor of v10.5.14). |
648
650
  | A-121 | v10 signs and verifies natively (item 3) | see plan A-121 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 08b31271 is an ancestor of v10.5.13). |
649
651
  | A-122 | Delete the GPG signing layer (item 3, deletion) | see plan A-122 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge cb738c36 is an ancestor of v10.5.13). |
650
- | 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 | building@2026-10-01T02:33Z | D47 decided: UNSIGNED exits 3 on both engines (verify_cmd.ts EXIT_BY_VERDICT, autonomy/verify.sh _verify_receipt_digest), --allow-unsigned / LOKI_VERIFY_ALLOW_UNSIGNED=1 accepts with explicit line; update tests/test-engine10-live-pr.sh 115-122; verify never creates a key |
652
+ | 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 | released@2026-10-01T03:00Z | D47 decided: UNSIGNED exits 3 on both engines (verify_cmd.ts EXIT_BY_VERDICT, autonomy/verify.sh _verify_receipt_digest), --allow-unsigned / LOKI_VERIFY_ALLOW_UNSIGNED=1 accepts with explicit line; update tests/test-engine10-live-pr.sh 115-122; verify never creates a key |
651
653
  | A-121c | A-121b opus finding B: legacy `loki verify` passes a WELL-FORMED token with an unknown kid at rc 0 (`attestation: UNCHECKED`, `VERDICT: VERIFIED`) with or without the local key; engine10 gives rc 2. A forger can always mint such a token, so on legacy a downgrade-to-foreign-kid is a pass. D47 kept legacy UNCHECKED unchanged because it also covers honest cross-machine verification. CTO call: make legacy UNCHECKED non-zero (parity with engine10 rc 2), now that D48 row 2 adds `loki verify --pubkey` as the honest cross-machine path? Also: a missing .loki/state/last-proof-id.txt makes legacy verify skip the receipt check entirely and pass (pre-existing, A-134) | autonomy/loki (_deploy_receipt_verdict, verify), tests | HIGH | unknown-kid forged token exits non-zero on legacy; honest cross-machine path documented | ready@2026-10-01T02:33Z | CTO decision first; after A-121b |
652
654
  | 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 | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 47ac1ccc is an ancestor of v10.5.13). |
653
655
  | A-112 | Baseline subtract: judge only the delta (item 5) | see plan A-112 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 69f1a910 is an ancestor of v10.5.13). |
654
656
  | 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 | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 275b4fc0 is an ancestor of v10.5.13). |
655
657
  | 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 | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 7d3edf96 is an ancestor of v10.5.13). |
656
- | 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 | building@2026-10-01T02:24Z | |
658
+ | 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 | merged@2026-10-01T05:22Z | |
657
659
  | A-134c | A-134b r1 review finding: provider call sites in autonomy/run.sh (mainline claude -p at about 25455/25460, provider_invoke_argv about 1050/1053) do not redirect stdin, so under LOKI_VERBOSE=1 (and any non-quiet path) a parent stdin pipe that never closes blocks `claude -p` reading stdin (pre-existing). Fix: `< /dev/null` at provider invocations that pass the prompt as an argument | autonomy/run.sh (provider call sites only), providers/*.sh, tests | MEDIUM | never-closing stdin pipe: verbose `loki quick` completes under timeout 60 | ready@2026-10-01T01:37Z | |
658
660
  | A-130 | v10 quiet by default (item 2) | see plan A-130 | MEDIUM | first-run-gate assertion per plan card | released@2026-10-01T01:19Z | Wave per plan section 5; one writer per file. Released in v10.5.14 (merge a518bfea is an ancestor of v10.5.14). |
659
661
  | A-130b | A-130 Reason line prints first_error from a failing check verbatim (capped at 200 chars, control chars stripped) but unredacted: a `ghp_` token in a test failure line reaches the terminal. No TS redactor is reachable from engine10 core (only autonomy/lib/proof_redact.py). Port the token patterns to a small TS helper outside core or redact first_error where it is captured in verify | loki-ts/src (util), verify.ts or output.ts, tests | MEDIUM | ghp_/sk- token in first_error prints redacted | released@2026-10-01T02:27Z | ; sonnet APPROVE be50510f (redaction before cap, parity with proof_redact.py) Released in v10.5.16 (merge f214a0fa is an ancestor of v10.5.16). |
package/docs/v10/GUIDE.md CHANGED
@@ -140,9 +140,11 @@ provider names (`claude`, `codex`, `cline`, `aider`); it is not supported.
140
140
 
141
141
  Once v10 becomes the default (docs/v10/DECISIONS.md, D29), `loki`, `loki
142
142
  status`, `loki verify` and `loki dashboard` with no `LOKI_ENGINE` set will
143
- mean the v10 commands described above. The previous engine stays fully
144
- reachable: `loki legacy <args>` and `LOKI_ENGINE=legacy` both route to it,
145
- unchanged. Nothing is removed at the flip.
143
+ mean the v10 commands described above. The previous engine stays
144
+ reachable through `LOKI_ENGINE=legacy` (bin/loki sends every value other
145
+ than `v10` to it), unchanged. Nothing is removed at the flip. A separate
146
+ legacy alias command is planned (docs/v10/ENGINE.md, E-31) but is not on
147
+ main.
146
148
 
147
149
  That flip has not happened on main as of this guide. The opt-in line near
148
150
  the top of this file and of README.md's section is the one place that