loki-mode 11.66.2 → 11.67.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/route.sh +3 -2
- package/dashboard/__init__.py +1 -1
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/COMPONENTS.md +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/WANG-PRINCIPLES-PLAN.md +1 -1
- package/docs/v10/FAILURE-CLASSES.md +24 -0
- package/loki-ts/dist/loki.js +1283 -1275
- package/mcp/__init__.py +1 -1
- package/mcp/server.py +31 -1
- package/mcp/tests/test_read_only.py +1 -1
- package/mcp/tests/test_v10_tools.py +212 -0
- package/mcp/v10_tools.py +83 -0
- package/package.json +2 -2
- package/packages/control-plane/dist/server.js +106 -12
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-DUUSP-zy.js → AdminPage-pnb8GqLL.js} +1 -1
- package/web-app/dist/assets/{Avatar-B8BH9fQZ.js → Avatar-Df0MLTRe.js} +1 -1
- package/web-app/dist/assets/{Badge-BXVq433G.js → Badge-BFmRUW-G.js} +1 -1
- package/web-app/dist/assets/{Button-BFK_qowE.js → Button-CdRsiK11.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-B5uaJ0Z_.js → CockpitPage-BNkH2nsx.js} +1 -1
- package/web-app/dist/assets/{ComparePage-BOJidJKo.js → ComparePage-9EDMje2L.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BSDwUoJy.js → ErrorBoundary-CRXOaeth.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-DFIrryk0.js → EvidenceReceiptPanel-BeIn9IS4.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-Bpy9Q7KU.js → GitHubIssuesPanel-BzXf_IWf.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-C40Uwyjl.js → GitHubPRsPanel-Be8AX8m3.js} +1 -1
- package/web-app/dist/assets/{HomePage-CrKeQ9kt.js → HomePage-7uHlpZ1X.js} +2 -2
- package/web-app/dist/assets/{LoginPage-DZLHMRAF.js → LoginPage-B-BVtsFl.js} +1 -1
- package/web-app/dist/assets/{MagicPage-wSsYtbHa.js → MagicPage-DXJUesvf.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-DKzav4Xg.js → MetricsPage-31GX67Bk.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-tFWP8KUK.js → NotFoundPage-DIRbLqyd.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-52h79KFr.js → ProjectPage-DmnT8Eob.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-DRSpM7E2.js → ProjectsPage-BbZyOf8X.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-B5_eQXf1.js → SettingsPage-WMEloF8e.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-mlk1VZ5N.js → ShowcasePage-NhFO8hM7.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-L7NP65y7.js → SystemSettingsPage-DHMuEj8i.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-C5gbHIhR.js → TeamsPage-BVuR1bjf.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-CpRsgu5-.js → TemplatesPage-Bi2IGt_i.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-C_tCR_Km.js → TerminalOutput-BJ2UIfW3.js} +1 -1
- package/web-app/dist/assets/{activity-DDAkha-U.js → activity-BtcZyrmh.js} +1 -1
- package/web-app/dist/assets/{bell-d3C_NwgU.js → bell-CkRCJ0_W.js} +1 -1
- package/web-app/dist/assets/{bot-xx2FrcyK.js → bot-Bt2VFSSb.js} +1 -1
- package/web-app/dist/assets/{check-B1wjphtz.js → check-C0EyXSbq.js} +1 -1
- package/web-app/dist/assets/{chevron-left-CxIjKCcc.js → chevron-left-BTaEKmGt.js} +1 -1
- package/web-app/dist/assets/{circle-alert-BkUkszys.js → circle-alert-0X9tOAOg.js} +1 -1
- package/web-app/dist/assets/{clock-Da0Cxc6b.js → clock-DnaNg1a3.js} +1 -1
- package/web-app/dist/assets/{cloud-CemmtpAa.js → cloud-DTqtg9kT.js} +1 -1
- package/web-app/dist/assets/{code-xml-D1PFPtf5.js → code-xml-DeuJEsGe.js} +1 -1
- package/web-app/dist/assets/{database-4tOYZHTT.js → database-D4urtXxg.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-CGwkXp1P.js → dollar-sign-SPSC5Sq8.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-Cv3xwFb6.js → file-code-corner-BhQRVhhE.js} +1 -1
- package/web-app/dist/assets/{file-plus-DR0S1Q6M.js → file-plus-BI8fEGar.js} +1 -1
- package/web-app/dist/assets/{globe-CnM5-QEh.js → globe-CH2JF0Ao.js} +1 -1
- package/web-app/dist/assets/{hammer-BybFanZ-.js → hammer-Cj5E6zW1.js} +1 -1
- package/web-app/dist/assets/{index-CsEKqPjD.js → index-BxSKCoJB.js} +3 -3
- package/web-app/dist/assets/{layers-AsoI5QVF.js → layers-C7B1CRSW.js} +1 -1
- package/web-app/dist/assets/{loader-circle-BP-Dgm4_.js → loader-circle-CLm-JO6c.js} +1 -1
- package/web-app/dist/assets/{lock-9heWJfZK.js → lock-qPb-TBSc.js} +1 -1
- package/web-app/dist/assets/{package-B3oxVBPu.js → package-DmAR0Ll7.js} +1 -1
- package/web-app/dist/assets/{plus-Dk3jSp9T.js → plus-B7rYXFp5.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-D_EqfAM1.js → refresh-cw-VlmoP5U8.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-BYWk_Sh7.js → rotate-ccw-IJm4_17B.js} +1 -1
- package/web-app/dist/assets/{scroll-text-CLU6QkSK.js → scroll-text-R7twjS6p.js} +1 -1
- package/web-app/dist/assets/{server-BQVeYEi-.js → server-De6O84hn.js} +1 -1
- package/web-app/dist/assets/{shield-alert-CGdnbbuO.js → shield-alert-rm8URrpT.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-CqAiD7w7.js → thumbs-up-d5BvwuYN.js} +1 -1
- package/web-app/dist/assets/{trash-2-DOZ4MX9o.js → trash-2-Bj-3uyaP.js} +1 -1
- package/web-app/dist/assets/{trending-down-vm1A3ywr.js → trending-down-DkTl9WJ6.js} +1 -1
- package/web-app/dist/assets/{trending-up-CdGlmr5H.js → trending-up-DUXqt2N7.js} +1 -1
- package/web-app/dist/assets/{upload--DV5H13K.js → upload-b6DOZWGH.js} +1 -1
- package/web-app/dist/assets/{usePolling-CTvwKWlp.js → usePolling-C_tHlbhz.js} +1 -1
- package/web-app/dist/assets/{user-CQ-pSxyg.js → user-BluxyiHB.js} +1 -1
- package/web-app/dist/index.html +1 -1
package/README.md
CHANGED
|
@@ -167,7 +167,7 @@ macOS and Linux are supported.
|
|
|
167
167
|
- Agent Change Receipt format: [docs/AGENT-CHANGE-RECEIPT.md](docs/AGENT-CHANGE-RECEIPT.md)
|
|
168
168
|
- Issue to PR from GitHub Actions, no hosted service: [docs/examples/loki-issue-to-pr.yml.example](docs/examples/loki-issue-to-pr.yml.example)
|
|
169
169
|
- Jira and Linear intake: [docs/trackers.md](docs/trackers.md). Two-way Slack: [docs/slack.md](docs/slack.md). Multi-repo runs and composite receipts: [docs/WORKSPACES.md](docs/WORKSPACES.md). Deploy: [docs/DEPLOY-PLAN.md](docs/DEPLOY-PLAN.md)
|
|
170
|
-
- MCP: the bundled server exposes
|
|
170
|
+
- MCP: the bundled server exposes 48 tools over stdio (`loki mcp`), including starting a run, reading its status and verifying its receipt. One-click install: [Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=loki-mode&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsImxva2ktbW9kZSIsIm1jcCJdfQ==), [VS Code](vscode:mcp/install?%7B%22name%22%3A%22loki-mode%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22loki-mode%22%2C%22mcp%22%5D%7D). Or run `loki mcp install --client claude|cursor|vscode|windsurf`.
|
|
171
171
|
- Claude Code plugin: `claude plugin marketplace add asklokesh/loki-mode`, then `claude plugin install loki-mode@loki-mode`. The same marketplace ships [loki-seal](packages/loki-seal/README.md), a Stop hook that refuses "done" when tests newly fail or were weakened.
|
|
172
172
|
- Architecture: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md). Upgrading: [UPGRADING.md](UPGRADING.md)
|
|
173
173
|
|
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: Runs an autonomous software factory that knows what it is supposed to deliver and proves it did, with a signed receipt. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v11.
|
|
6
|
+
# Loki Mode v11.67.0
|
|
7
7
|
|
|
8
8
|
**Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the previous bash loop. PRD-file starts (`loki start ./prd.md`) and the opencode provider still run on it until FC38-SWEEP ports them; the legacy-engine command and the LOKI_ENGINE switch remain removed. Prefer `loki owner/repo#N` for issues.
|
|
9
9
|
|
|
@@ -476,4 +476,4 @@ Implemented, planned and deprecated items, with the version each landed in: `ski
|
|
|
476
476
|
|
|
477
477
|
---
|
|
478
478
|
|
|
479
|
-
**v11.
|
|
479
|
+
**v11.67.0 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
11.
|
|
1
|
+
11.67.0
|
package/autonomy/route.sh
CHANGED
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
# Bash 3.2 compatible (no associative arrays, no ${var,,}).
|
|
11
11
|
|
|
12
12
|
# Flags that take a separate value token.
|
|
13
|
-
_ROUTE_VALUE_FLAGS=" --provider --budget --budget-limit --max-cost --max-iterations --max-retries --session-model --completion-promise --base-wait --max-wait --prd --brief --attempts --spec --aider-model --aider-flags --cline-model --isolation --output --engine --mirofish-rounds --mirofish-timeout --max-duration --log-level --compliance --cost --remote --issue --bmad-project --openspec --mirofish-docker --destination --domain --env-file --health-url --health-match --workspace --config --vars "
|
|
13
|
+
_ROUTE_VALUE_FLAGS=" --provider --budget --budget-limit --max-cost --max-iterations --max-retries --session-model --completion-promise --base-wait --max-wait --prd --brief --attempts --spec --aider-model --aider-flags --cline-model --isolation --output --engine --mirofish-rounds --mirofish-timeout --max-duration --log-level --compliance --cost --remote --issue --bmad-project --openspec --mirofish-docker --destination --domain --env-file --health-url --health-match --workspace --config --vars --seal-existing "
|
|
14
14
|
# Flags whose value is optional (cmd_start reads one only when it is present): --mirofish takes a URL (a token that does not
|
|
15
15
|
# start with --, as _loki_start_optval_consumes). Declared here so a refused one still consumes its value. --parallel is NOT
|
|
16
16
|
# here: cmd_start treats it as a plain boolean (_loki_start_flag_kind), so "--parallel 3" leaves 3 as a positional.
|
|
17
17
|
_ROUTE_OPTVAL_FLAGS=" --mirofish "
|
|
18
18
|
# Flags engine10 honors as-is.
|
|
19
|
-
_ROUTE_E10_FLAGS=" --no-pr --deep --json --verbose --quiet --resume --provider --max-cost --spec --attempts "
|
|
19
|
+
_ROUTE_E10_FLAGS=" --no-pr --deep --json --verbose --quiet --resume --provider --max-cost --spec --attempts --seal-existing "
|
|
20
20
|
# The most a run cap can reach (capCeilingS(true) in loki-ts/src/util/run_cap.ts: the subscription ceiling).
|
|
21
21
|
_ROUTE_CAP_CEILING_S=3600
|
|
22
22
|
# Accepted and dropped (no-ops on a non-interactive run).
|
|
@@ -128,6 +128,7 @@ loki_route_resolve() {
|
|
|
128
128
|
-v) passthru+=(--verbose); continue ;;
|
|
129
129
|
--attempts) passthru+=(--attempts "$val"); continue ;;
|
|
130
130
|
--spec) passthru+=(--spec "$val"); continue ;;
|
|
131
|
+
--seal-existing) passthru+=(--seal-existing "$val"); continue ;;
|
|
131
132
|
--max-duration)
|
|
132
133
|
max_duration="$(_route_duration_s "$val")"
|
|
133
134
|
if [ -z "$max_duration" ] && [ -z "$cap_err" ]; then
|
package/dashboard/__init__.py
CHANGED
package/docs/CLI-REFERENCE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CLI reference
|
|
2
2
|
|
|
3
|
-
Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.
|
|
3
|
+
Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.67.0. Do not edit by hand.
|
|
4
4
|
Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
|
|
5
5
|
|
|
6
6
|
| Command | Description |
|
package/docs/COMPONENTS.md
CHANGED
|
@@ -247,7 +247,7 @@ search) to MCP clients.
|
|
|
247
247
|
**Purpose:** Make Loki's memory, tools, and search available over MCP.
|
|
248
248
|
|
|
249
249
|
**Key files:**
|
|
250
|
-
- `server.py` - MCP server (
|
|
250
|
+
- `server.py` - MCP server (48 tools: 32 in-file + magic + gated managed + 8 cp; plus
|
|
251
251
|
3 resources, 2 prompts).
|
|
252
252
|
- `magic_tools.py` - Magic Modules tools.
|
|
253
253
|
- `cp_tools.py` - Read-only Control Plane data tools (`cp_*`, GET only; the CP URL
|
package/docs/INSTALLATION.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Loki Mode, by [Autonomi](https://www.autonomi.dev/), turns a spec or an issue into a verified pull request with a receipt you can check. This page covers installing it, a first run, and the options around it.
|
|
4
4
|
|
|
5
|
-
**Version:** v11.
|
|
5
|
+
**Version:** v11.67.0
|
|
6
6
|
|
|
7
7
|
**Engine note:** `loki start` is the primary command. `loki start`, `loki "<task>"`, `loki owner/repo#N` and `loki quick` all run the Loki 10 engine, whatever the flag order or input form (PRD file, issue ref, task or one-word brief). The previous loop runs only on `--engine legacy`, `LOKI_ENGINE=legacy`, or for one call when a flag Loki 10 cannot honor is present. See the [user guide](v10/GUIDE.md) and the [5-minute quickstart](QUICKSTART.md).
|
|
8
8
|
|
|
@@ -53,7 +53,7 @@ Measured on this machine, not asserted.
|
|
|
53
53
|
| **1 Systems Thinking** | STRONG | 8 quality gates, RARV-C loop, council, Evidence Receipt, dual-route parity enforced by test |
|
|
54
54
|
| **2 Speed** | MEASURED, UNOPTIMISED | agent call = **980s = 96%** of iteration; all gates together = 44s |
|
|
55
55
|
| **3 Reliability** | STRONG, newly so | 73 mutation-proven trust invariants; four gates were shipping broken until v8.38.0 |
|
|
56
|
-
| **4 Extensibility** | STRONG | 5 providers, agent type registry, MCP (
|
|
56
|
+
| **4 Extensibility** | STRONG | 5 providers, agent type registry, MCP (48 tools), plugin marketplace |
|
|
57
57
|
| **5 Feedback Loops / Evals** | **BROKEN** | `cost_usd == 0` on **3 of 5** efficiency records; no eval score for our own harness |
|
|
58
58
|
|
|
59
59
|
**Principle 5 is the gap, and it is the one Wang weights highest.** He states the
|
|
@@ -1773,6 +1773,30 @@ L0 review rule (ENGINE-LAWS.md L0): a fix that adds an `if` or a regex about the
|
|
|
1773
1773
|
- Siblings swept: loki-ts/src/engine10 neither writes nor reads the pointer (`git grep -n last-proof-id -- loki-ts/src/engine10` returns nothing). The readers (run.sh, loki, run-summary.sh, trigger-server.py) are route-agnostic and unchanged.
|
|
1774
1774
|
- Mechanism: clearStaleProofPointer in runner/proof.ts, called once from runAutonomous right after makeContext.
|
|
1775
1775
|
- Fixture: loki-ts/tests/runner/autonomous.test.ts "#211 Bun-route sibling" seeds run-A, stops the run before proof with LOKI_PROOF=0, expects the pointer absent. Mutant: remove the call in runAutonomous; the test goes red.
|
|
1776
|
+
## FC-ENGINE-ROUTE-MOCKED-TOOL-PATH A flag an MCP tool passes to bin/loki was never registered in autonomy/route.sh, and the tool's mocked tests could not see the refusal
|
|
1777
|
+
- User-visible vs raw: user-visible. loki_seal_diff runs bin/loki under LOKI_ENGINE=v10, where route.sh refuses any flag it does not list as legacy_flag; the tool returned "loki exited 2 without a receipt" on every real call while its unit tests (a fake loki script) and the bun e2e (bin/loki without LOKI_ENGINE=v10) were green.
|
|
1778
|
+
- Law: a tool path is tested through the entry point the user takes (Engine Law: test the embedding path), not only against a stand-in for it.
|
|
1779
|
+
- Cause (measured): --seal-existing was added to supervisor.ts but not to _ROUTE_VALUE_FLAGS or _ROUTE_E10_FLAGS in autonomy/route.sh. The same slice carried three siblings of one class (trust boundary crossed by an unvalidated value): the patch path inherited by every child env, an engine-written run_id joined into a path unchecked, and a receipt naming the default model for a run no Loki session wrote.
|
|
1780
|
+
- Siblings swept: mcp/v10_tools.py passes bin/loki only a bare ref (v10_run) and the verify subcommand (v10_verify); seal_diff is the only caller that passes a flag.
|
|
1781
|
+
- Mechanism: one real-entry test class (RealEngineSealDiffTests in mcp/tests/test_v10_tools.py) runs seal_diff through the real bin/loki under v10_tools._env() with only the claude CLI stubbed; any future tool flag missing from route.sh fails it. The env, run_id and receipt fixes live in the one place each (worker.ts takes and deletes the patch path, v10_tools.RUN_ID_RE, seal.ts externalRun).
|
|
1782
|
+
- Fixture: mcp/tests/test_v10_tools.py RealEngineSealDiffTests, SealDiffTests.test_run_id_from_the_clone_is_validated_before_any_path_join, loki-ts/tests/engine10/seal_existing.test.ts (B2, B3). Mutations that go red: route.sh without --seal-existing, worker/session env not stripped, receipt model reverting to ctx.model, run_id unchecked, no fetch of refs/loki/seal.
|
|
1783
|
+
|
|
1784
|
+
## FC-EXTERNAL-SEAL-WITHOUT-WALL-VERIFIED An external diff sealed through the shipped path skips the Wall and is still VERIFIED
|
|
1785
|
+
- User-visible vs raw: user-visible. `loki_seal_diff` (v10_tools._env) and plain `loki "<intent>" --seal-existing p` do not set LOKI_E10_PLAN, so the E-64 lean path fired: wall stage.skipped "small task with a relevant test: cascade skips Wall", the receipt's wall files list was empty, and wrong code (`return a + b + 1`) sealed VERIFIED on the one existing add-only test. The CW-12 tests set LOKI_E10_PLAN=1, which forces a plan and hides the skip.
|
|
1786
|
+
- Law: an external diff has no implement session whose work the harness watched, so the Wall is its only independent proof; no Wall that ran means no VERIFIED.
|
|
1787
|
+
- Test-only plan knob (swept): src never sets LOKI_E10_PLAN, it only reads it (sizing.ts:57); the only setters are tests (sizing, route_record_agreement, route_matrix_lib, plan, seal_existing, runner_errors, router_optout_golden, plan_route, e2e, session_l1_model, scope, issue_ref_e2e, fc69_wall_e2e under loki-ts/tests/engine10, and mcp/tests/test_v10_tools.py). A forced plan is not a path a default user takes; seal_existing.test.ts (its default seal() helper keeps it; the B6 cases remove it) and the MCP real-engine class (it is now removed there) hid this one.
|
|
1788
|
+
- Non-external lean skip: see FC-LEAN-VERIFIED-WITHOUT-CHANGED-SYMBOL below, which carries the measured run and the fix.
|
|
1789
|
+
- Siblings swept: every Wall skip reason in wall.ts (LOKI_E10_WALL=0, lean path, no runnable test command, pytest-only under the system interpreter) reaches the same verdict, so the rule lives in verdictOf (seal.ts), not in each skip.
|
|
1790
|
+
- Mechanism: wallAuthor never takes the lean skip when ctx.externalPatch is set; verdictOf returns PARTIAL for an external run whose wall.files is empty, and seal adds a NOT PROVEN line naming it.
|
|
1791
|
+
- Fixture: loki-ts/tests/engine10/seal_existing.test.ts runs a wrong external body with LOKI_E10_PLAN absent and expects not VERIFIED plus the NOT PROVEN line; red on the previous head, and a mutant restoring either half (lean skip, or the verdictOf rule) turns a case red.
|
|
1792
|
+
|
|
1793
|
+
## FC-LEAN-VERIFIED-WITHOUT-CHANGED-SYMBOL A non-external run with no Wall is VERIFIED on a pre-existing test that never calls the changed symbol
|
|
1794
|
+
- User-visible vs raw: user-visible. Measured run (throwaway repo, stub claude from loki-ts/tests/engine10/fixtures/e2e, LOKI_E10_PLAN unset, task "add a multiply(a, b) function to calc.ts", implement appends multiply): outcome VERIFIED, stage.skipped wall "small task with a relevant test: cascade skips Wall", the receipt's only check is bun:calc.test.ts pass n=1 with provenance exogenous, and calc.test.ts contains no "multiply" (grep -c multiply = 0). The new function is untested and the receipt says VERIFIED.
|
|
1795
|
+
- Law: a VERIFIED verdict needs a passing check that exercises the changed code. With no Wall file that ran, the only candidate is a pre-existing test, so it must reference a symbol the diff declares or modifies; otherwise PARTIAL with a NOT PROVEN line naming the symbols.
|
|
1796
|
+
- Siblings swept: every no-Wall path (lean skip, LOKI_E10_WALL=0, no runnable test command, pytest-only under the system interpreter) reaches the same verdict, so the rule lives in seal (verdictOf plus one gap computation), not in wall.ts. External runs keep their own stricter rule (FC-EXTERNAL-SEAL-WITHOUT-WALL-VERIFIED). ALREADY_SATISFIED and runs with a Wall file are unchanged. A Wall that ran but does not exercise the changed symbol is not covered here.
|
|
1797
|
+
- Mechanism: util/check_result.ts changedSymbols reads a git diff -U0 for the names declared on added lines (plus the hunk's enclosing declaration when the hunk removes lines or declares nothing) and symbolGap checks the whole-word references in the passing checks' test files; seal passes the gap to verdictOf. Conservative by design: an unreferenced symbol (for example one only reached through a helper) downgrades to PARTIAL, never the reverse.
|
|
1798
|
+
- Fixture: loki-ts/tests/engine10/e2e.test.ts runs the stub fixture with LOKI_E10_PLAN absent and expects not VERIFIED plus the NOT PROVEN line, and a second case where the test calls multiply stays VERIFIED; unit cases in check_result.test.ts. Red on the previous head; mutants: drop the verdictOf rule, and make symbolGap always return empty. Added after rev-c: a third e2e case (stub mode localvar) where the diff has a local variable and a comment word that the test echoes is still PARTIAL; mutants: let symbolGap read comments, and let a const, let or var count at any indent.
|
|
1799
|
+
- Declaration scope (rev-c repro): const, let, var and val count only at column 0 or on an export line, because an indented one is a local; comment text is stripped from added lines and from test sources before matching. Known false-PARTIAL shapes, accepted as the conservative side: an Express-style handler body edit (the hunk context is a call, not a declaration), an import-line edit (declares nothing), and a helper reached only through its caller (the test names the caller, not the helper). Comments are stripped over the whole added hunk, so a multi-line block comment cannot leak names (rev-a B2). Known false-VERIFIED shape, accepted for now and filed as a follow-on: a test title string or a Python docstring that names the symbol still counts as a reference, because string literals are not stripped.
|
|
1776
1800
|
|
|
1777
1801
|
## FC-WALL-FILE-NOT-DISCOVERED-BY-RUNNER Verify runs the Wall only if the stack's test discovery also finds it, so a sealed loki_wall_*.py is never run and the receipt says "wall result not recorded by verify"
|
|
1778
1802
|
- User-visible vs raw: user-visible. A Python run with a Wall file (`loki_wall_x.py`) never executes the Wall in verify; wall_passed stays undefined and Seal lists "wall result not recorded by verify" (seal.ts:250) as NOT PROVEN even though the Wall was authored, sealed and green on the base run.
|