open-multi-agent-kit 0.90.5 → 0.90.6

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 (88) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +9 -9
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +1 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/codexbar-cli.d.ts +39 -0
  7. package/dist/codexbar-cli.d.ts.map +1 -0
  8. package/dist/codexbar-cli.js +230 -0
  9. package/dist/codexbar-cli.js.map +1 -0
  10. package/dist/commands/doctor-provider.d.ts.map +1 -1
  11. package/dist/commands/doctor-provider.js +16 -3
  12. package/dist/commands/doctor-provider.js.map +1 -1
  13. package/dist/core/agent-session.d.ts.map +1 -1
  14. package/dist/core/agent-session.js +30 -8
  15. package/dist/core/agent-session.js.map +1 -1
  16. package/dist/core/codexbar-adapter.d.ts +44 -0
  17. package/dist/core/codexbar-adapter.d.ts.map +1 -0
  18. package/dist/core/codexbar-adapter.js +211 -0
  19. package/dist/core/codexbar-adapter.js.map +1 -0
  20. package/dist/core/compaction/index.d.ts +2 -0
  21. package/dist/core/compaction/index.d.ts.map +1 -1
  22. package/dist/core/compaction/index.js +2 -0
  23. package/dist/core/compaction/index.js.map +1 -1
  24. package/dist/core/compaction/model-policy.d.ts +9 -0
  25. package/dist/core/compaction/model-policy.d.ts.map +1 -0
  26. package/dist/core/compaction/model-policy.js +37 -0
  27. package/dist/core/compaction/model-policy.js.map +1 -0
  28. package/dist/core/compaction/resume-policy.d.ts +6 -0
  29. package/dist/core/compaction/resume-policy.d.ts.map +1 -0
  30. package/dist/core/compaction/resume-policy.js +8 -0
  31. package/dist/core/compaction/resume-policy.js.map +1 -0
  32. package/dist/core/domain-loadouts.d.ts.map +1 -1
  33. package/dist/core/domain-loadouts.js +68 -1
  34. package/dist/core/domain-loadouts.js.map +1 -1
  35. package/dist/core/extensions/loader.d.ts.map +1 -1
  36. package/dist/core/extensions/loader.js +12 -0
  37. package/dist/core/extensions/loader.js.map +1 -1
  38. package/dist/core/extensions/runner.d.ts.map +1 -1
  39. package/dist/core/extensions/runner.js +3 -0
  40. package/dist/core/extensions/runner.js.map +1 -1
  41. package/dist/core/extensions/types.d.ts +15 -0
  42. package/dist/core/extensions/types.d.ts.map +1 -1
  43. package/dist/core/extensions/types.js.map +1 -1
  44. package/dist/core/grok-harness-dispatch.d.ts +22 -0
  45. package/dist/core/grok-harness-dispatch.d.ts.map +1 -0
  46. package/dist/core/grok-harness-dispatch.js +44 -0
  47. package/dist/core/grok-harness-dispatch.js.map +1 -0
  48. package/dist/core/grok-harness.d.ts +25 -0
  49. package/dist/core/grok-harness.d.ts.map +1 -0
  50. package/dist/core/grok-harness.js +61 -0
  51. package/dist/core/grok-harness.js.map +1 -0
  52. package/dist/core/grok-playbook.d.ts +7 -0
  53. package/dist/core/grok-playbook.d.ts.map +1 -0
  54. package/dist/core/grok-playbook.js +34 -0
  55. package/dist/core/grok-playbook.js.map +1 -0
  56. package/dist/core/sdk.d.ts.map +1 -1
  57. package/dist/core/sdk.js +31 -12
  58. package/dist/core/sdk.js.map +1 -1
  59. package/dist/main.d.ts.map +1 -1
  60. package/dist/main.js +4 -0
  61. package/dist/main.js.map +1 -1
  62. package/dist/utils/tools-manager.d.ts +3 -2
  63. package/dist/utils/tools-manager.d.ts.map +1 -1
  64. package/dist/utils/tools-manager.js +42 -17
  65. package/dist/utils/tools-manager.js.map +1 -1
  66. package/docs/correctness-wall.md +117 -0
  67. package/docs/grok-harness.md +63 -0
  68. package/docs/loadout-domains/README.md +2 -1
  69. package/docs/loadout-domains/ai-agent-ops.md +8 -1
  70. package/docs/loadout-domains/grok-harness.md +74 -0
  71. package/docs/providers.md +4 -0
  72. package/examples/extensions/correctness-wall/LOADOUT.md +87 -0
  73. package/examples/extensions/correctness-wall/README.md +111 -0
  74. package/examples/extensions/correctness-wall/adjudication-fixture.ts +151 -0
  75. package/examples/extensions/correctness-wall/index.ts +470 -0
  76. package/examples/extensions/correctness-wall/repair-state.ts +77 -0
  77. package/examples/extensions/correctness-wall/wall-cache.ts +81 -0
  78. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  79. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  80. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  81. package/examples/extensions/gondolin/package-lock.json +2 -2
  82. package/examples/extensions/gondolin/package.json +1 -1
  83. package/examples/extensions/sandbox/package-lock.json +2 -2
  84. package/examples/extensions/sandbox/package.json +1 -1
  85. package/examples/extensions/with-deps/package-lock.json +2 -2
  86. package/examples/extensions/with-deps/package.json +1 -1
  87. package/npm-shrinkwrap.json +12 -12
  88. package/package.json +5 -5
@@ -0,0 +1,117 @@
1
+ # Correctness Wall (B2C patch safety harness)
2
+
3
+ ## Purpose
4
+
5
+ The **Correctness Wall** is a **policy- and evidence-limited screen** for AI-proposed patches in OMK. It runs **before** `edit` / `write` apply (via the `correctness-wall` extension) or on demand through the `correctness_wall_evaluate` tool.
6
+
7
+ It helps answer:
8
+
9
+ - Are changed paths inside an **approved write scope**?
10
+ - Does the diff look like it may contain **secrets**?
11
+ - When run evidence exists, does **outcome adjudication** corroborate success?
12
+
13
+ It does **not** prove that code is correct, complete, or safe for production.
14
+
15
+ ## 4-state user verdict
16
+
17
+ | Verdict | Meaning (default apply behavior) |
18
+ |---------|----------------------------------|
19
+ | **PASS** | Fast wall (and optional OA) found no blocking issues. |
20
+ | **ADVISORY** | Proceed with caution; preview limits or weak discrimination may apply. |
21
+ | **INCONCLUSIVE** | Not enough evidence (empty diff, missing fixture, verifier error). |
22
+ | **BLOCKED** | Scope, secret heuristic, or OA contradiction — do not apply by default. |
23
+
24
+ Structured next steps on the verdict card: **Apply**, **Deep Check**, **Regenerate** (see `packages/adaptorch-wpl` B2C mapper).
25
+
26
+ **Can apply** vs **should submit** are separate gates on the verification receipt: mechanical apply safety is not the same as trusting downstream submission.
27
+
28
+ ## Fast wall vs deep wall
29
+
30
+ - **Fast wall (default):** Pure policy — diff paths, scope globs, secret-shaped lines, preview-only limits (`BATCH1_NO_DOCKER_RUNNER`). No Docker runner in batch 1.
31
+ - **Deep wall (Pro / future):** Hermetic paired base/patch replay. Today `deepWall: true` returns **unavailable** with the same batch-1 limit code.
32
+
33
+ ## Relationship to Adaptorch
34
+
35
+ - Hidden engine: `omk-adaptorch-wpl` (`evaluateCorrectnessWall`, outcome adjudicator, repair hints).
36
+ - Optional OA path: `runIds` + `previewOnly: false` + in-memory or MCP transport.
37
+ - Adaptorch **preview** planning is separate; see [adaptorch-preview.md](./adaptorch-preview.md).
38
+
39
+ ## Operator environment
40
+
41
+ ```bash
42
+ omk --extension packages/coding-agent/examples/extensions/correctness-wall/index.ts
43
+ ```
44
+
45
+ | Variable | Role |
46
+ |----------|------|
47
+ | `OMK_PATCH_SAFETY_WALL_MODE` | `shadow` (default), `soft`, `hard` |
48
+ | `OMK_WALL_SCOPE` | Comma-separated path globs |
49
+ | `OMK_WALL_OVERRIDE` | Soft-mode override for BLOCKED |
50
+ | `OMK_WALL_REPAIR_BUDGET` | Capped regenerate hints (default 1) |
51
+ | `OMK_WALL_OA_FIXTURE_PATH` | JSON fixture for local OA adjudication |
52
+ | `OMK_WALL_AUTO_REGENERATE` | Capped `regeneratePacket` in tool JSON (hints only) |
53
+ | `OMK_WALL_RECEIPT_SIGNING_SECRET` | Optional HMAC `signedReceipt` on verification receipt |
54
+ | `OMK_WALL_DEEP_PHASE` | `stub` (default) or `docker` (intent only; runner not wired) |
55
+ | `OMK_WALL_OA_TRANSPORT` | `fixture` (default) or `mcp` / `live` (session `callTool` injection) |
56
+
57
+ Telemetry (no diff bodies): `.omk/wall-cache/latest.json`, `shadow-telemetry.ndjson`, `repair-budget.json`.
58
+
59
+ ## Explicit non-goals
60
+
61
+ - **Not proof of correctness** or formal verification.
62
+ - Does not replace human review, CI, or full `npm run check` / test suites.
63
+ - Does not expose internal thresholds, AST overlap, or raw repro bodies to end users.
64
+
65
+ ## Loadout & preset
66
+
67
+ The correctness wall is **not** part of the default `omk-core-verified` preset or any built-in role loadout in `packages/coding-agent/src/core/loadouts.ts`. Operators opt in explicitly:
68
+
69
+ | Surface | How to enable |
70
+ |---------|----------------|
71
+ | **Session** | `omk --extension packages/coding-agent/examples/extensions/correctness-wall/index.ts` (or a copy under `~/.omk/agent/extensions/correctness-wall/`) |
72
+ | **Scope** | `OMK_WALL_SCOPE` — comma-separated path globs that approve write targets in the diff |
73
+ | **Mode** | `OMK_PATCH_SAFETY_WALL_MODE` — `shadow` \| `soft` \| `hard` (see [Operator environment](#operator-environment)) |
74
+ | **Role loadouts** | `code` / `executor` lanes still get `pre-shell-guard`, `protect-secrets`, and `typecheck-after-edit`; the wall **adds** a pre-apply policy gate on `edit` / `write` only when the extension is loaded |
75
+ | **Domain router** | No dedicated domain profile today; patch-safety work may route to [`ai-agent-ops`](./loadout-domains/ai-agent-ops.md) for harness/eval discipline, but that does **not** auto-load this extension |
76
+
77
+ **Future hook (code, not batch-1):** `packages/coding-agent/src/core/domain-loadouts.ts` could gain triggers (e.g. `patch safety`, `correctness wall`) and a curated extension entry pointing at the correctness-wall example. Until then, document-only reference — do not hand-edit auto-generated files under `docs/loadout-domains/`.
78
+
79
+ Regression coverage for the wall library surface lives in `packages/coding-agent/test/suite/regressions/018-b2c-correctness-wall.test.ts` (imports `omk-adaptorch-wpl` the same way the extension does).
80
+
81
+ ## Recommended rollout: shadow → soft → hard
82
+
83
+ Roll out in **three phases** so telemetry and false positives are understood before writes are blocked.
84
+
85
+ | Phase | `OMK_PATCH_SAFETY_WALL_MODE` | Operator expectation |
86
+ |-------|------------------------------|--------------------|
87
+ | **1 — Shadow** | `shadow` (default) | All `edit` / `write` calls proceed. Verdicts land in `.omk/wall-cache/latest.json` and `shadow-telemetry.ndjson`. Review BLOCKED/INCONCLUSIVE rates and tune `OMK_WALL_SCOPE`. |
88
+ | **2 — Soft** | `soft` | **BLOCKED** verdicts block apply unless `OMK_WALL_OVERRIDE=1` (or `true` / `yes`). **INCONCLUSIVE** still applies in shadow-like fashion for scope tuning. Use for pilot teams with an explicit override path. |
89
+ | **3 — Hard** | `hard` | **BLOCKED** and **INCONCLUSIVE** both block `edit` / `write`. Reserve for repos with stable scope globs, OA fixtures wired (`OMK_WALL_RUN_IDS` + `OMK_WALL_OA_FIXTURE_PATH`), and acceptable INCONCLUSIVE rate (missing files, empty diff). |
90
+
91
+ **Checklist between phases**
92
+
93
+ 1. AC-1 vitest green for `packages/adaptorch-wpl` and regression `018-b2c-correctness-wall`.
94
+ 2. Root `npm run check` green after any source touch (includes unrelated **browser-smoke** esbuild gate — wall work does not require loading the extension in that script).
95
+ 3. Shadow NDJSON reviewed: no systematic secret false negatives; scope globs cover intended packages only.
96
+ 4. Document team override policy before enabling **soft**.
97
+
98
+ ## Wave 2 / Wave 3 roadmap (pointer)
99
+
100
+ Goal orchestration v2 artifacts (planner P3) live beside batch-1 plan files:
101
+
102
+ | Artifact | Path |
103
+ |----------|------|
104
+ | 11-step evaluation algorithm + decision table | `.omk/goals/b2c-correctness-wall-2026-07-08/algorithm-v2.md` |
105
+ | Three-wave execution DAG (JSON) | `.omk/goals/b2c-correctness-wall-2026-07-08/dag-v2.json` |
106
+ | Explorer: browser-smoke vs extension load + loadout gaps | `.omk/goals/b2c-correctness-wall-2026-07-08/laneE-explorer.md` |
107
+
108
+ **Wave 2 (prove / integrate):** wire `AdaptOrchClient` on hooks when session has run context; lift `BATCH1_NO_DOCKER_RUNNER` for non-preview deep wall; optional preset documentation in `~/.omk/runtime-preset.json` comments only (no default-on extension).
109
+
110
+ **Wave 3 (productize):** publish `omk-adaptorch-wpl` from `dist/` for out-of-monorepo extensions; optional `domain-loadouts.ts` profile + `gen-domain-docs.mjs` regen; default **soft** for internal dogfood presets after Wave 2 evidence.
111
+
112
+ ## See also
113
+
114
+ - [adaptorch-preview.md](./adaptorch-preview.md)
115
+ - [LOADOUT.md](../examples/extensions/correctness-wall/LOADOUT.md) — copy-paste for `omk-core-verified` sessions
116
+ - Goal artifacts: `.omk/goals/b2c-correctness-wall-2026-07-08/` (`algorithm-v2.md`, `dag-v2.json`)
117
+ - Extension README: `packages/coding-agent/examples/extensions/correctness-wall/README.md`
@@ -0,0 +1,63 @@
1
+ # Grok harness
2
+
3
+ This page is the project-local operator guide for running OMK with the xAI OAuth proxy. The canonical Grok playbook remains `~/.omk/agent/grok.md`; keep this page as a short routing and preset reference, not a duplicate source of truth.
4
+
5
+ ## Presets
6
+
7
+ Project presets live in `.omk/presets.json` and are consumed by the preset extension from `packages/coding-agent/examples/extensions/preset.ts`. The shared Grok presets intentionally omit the `tools` key so role/domain lane grants keep control of the active tools.
8
+
9
+ | Preset | Provider | Model | Thinking | Use |
10
+ | --- | --- | --- | --- | --- |
11
+ | `grok-verified` | `grok-oauth-proxy` | `grok-4.5` | `high` | Default Grok text-chat baseline (local OAuth proxy). |
12
+ | `grok-adaptorch-prod` | `grok-oauth-proxy` | `grok-4.5` | `high` | Same baseline, with AdaptOrch reserved for explicit DAG routing, synthesis, or consistency-verification lanes. |
13
+
14
+ Register the provider in `~/.omk/agent/models.json` with `baseUrl: http://127.0.0.1:9996/v1` and chat models including `grok-4.5` (and optional fallbacks such as `grok-4.3`). Loopback proxy accepts a dummy `apiKey`; do not put OAuth tokens in models.json. Confirm proxy health with `curl -fsS http://127.0.0.1:9996/health` before long sessions.
15
+
16
+ Suggested TUI flow:
17
+
18
+ 1. Run `/grok` to inject the pointer to `~/.omk/agent/grok.md`.
19
+ 2. Select `/preset grok-verified` for normal chat/coding work.
20
+ 3. Select `/preset grok-adaptorch-prod` only when the task has an explicit DAG, routing, or synthesis objective.
21
+ 4. Keep credentials and OAuth material out of preset JSON.
22
+
23
+ ## Domain routing
24
+
25
+ Domain routing is opt-in. Start OMK with `OMK_DOMAIN_ROUTING=1` when you want the domain router to compose the role loadout with a domain profile before dispatch. With the variable unset or any value other than `1`, the domain dispatch layer does not apply a domain access policy.
26
+
27
+ The router selects one of the documented domain profiles under [`loadout-domains/`](loadout-domains/README.md), then composes that profile with the active role loadout. Grok presets do not replace this mechanism; they only set provider, model, thinking level, and instruction pointers.
28
+
29
+ ## Composer model
30
+
31
+ `grok-composer-2.5-fast` is a valid Grok chat model, but the project presets keep `grok-4.5` as the default. Use Composer only for explicit Composer validation or comparison work. `grok-4.3` remains a supported fallback chat model. Do not use `grok-imagine-*` ids as chat models; session `setModel` / `prompt` reject them on `grok-oauth-proxy`.
32
+
33
+ ## Imagine tools
34
+
35
+ Imagine media generation is tool-based, not model-selection-based:
36
+
37
+ | Task | OMK tool |
38
+ | --- | --- |
39
+ | Text-to-image, image edits, restyles | `grok_imagine_image` |
40
+ | Text-to-video or image-to-video | `grok_imagine_video` |
41
+
42
+ Do not select `grok-imagine-image`, `grok-imagine-image-quality`, `grok-imagine-video`, or similar Imagine ids as the chat model. For media tasks, require tool output evidence such as the final saved path or URL before claiming success.
43
+
44
+ ## Skill and MCP matrix summary
45
+
46
+ Use the normal OMK lane grant model: grant the smallest skill and MCP surface that matches the task, and keep media exceptions explicit.
47
+
48
+ | Task class | Skills | MCP |
49
+ | --- | --- | --- |
50
+ | Multi-package or repo-context work | `packages`; add `headroom` only under context pressure | none by default |
51
+ | Repo graph or broad comprehension | `understand-anything`; optionally `packages` | `understand-anything` |
52
+ | DAG planning or synthesis | `adaptorch` / `adaptorch-route` / `adaptorch-synthesize` | `adaptorch` |
53
+ | TypeScript/Rust/Python/Go edits | `programming`; add `lsp` or `ast-grep` only for symbol/structural work | none by default |
54
+ | Runtime failures or broken behavior | `debugging` | task-specific only |
55
+ | UI/TUI verification | `visual-qa` | `playwright` only when browser/UI evidence is required |
56
+ | Current public URL or docs lookup | task skill as needed | `fetch` |
57
+ | Image prompts or media generation | explicit-only `image-prompt`, `omnigen-vault`, or `gpt-image-2-prompts` | none by default |
58
+
59
+ Relevant evidence hooks for Grok lanes are `pre-shell-guard`, `protect-secrets`, `typecheck-after-edit`, and `stop-verify`. Hook output is incremental evidence; code changes still need the project's required final verification command before claiming type/lint cleanliness.
60
+
61
+ ## Canonical reference
62
+
63
+ For proxy health checks, chat model rules, Imagine tool behavior, Hermes parity, Telegram behavior, and unsafe `GROK.MD` handling, read `~/.omk/agent/grok.md`.
@@ -21,7 +21,7 @@ OMK routes incoming tasks to a **domain capability profile** ("inherited documen
21
21
 
22
22
  Thresholds: `STRONG_THRESHOLD = 8`, `WEAK_THRESHOLD = 4`, `AMBIGUITY_MARGIN = 2`.
23
23
 
24
- ## Domains (12 + 1 fallback)
24
+ ## Domains (13 + 1 fallback)
25
25
 
26
26
  - [`frontend-ui`](frontend-ui.md) — Frontend & UI
27
27
  - [`visual-qa`](visual-qa.md) — Visual QA & Website Cloning
@@ -34,6 +34,7 @@ Thresholds: `STRONG_THRESHOLD = 8`, `WEAK_THRESHOLD = 4`, `AMBIGUITY_MARGIN = 2`
34
34
  - [`mobile`](mobile.md) — Mobile (iOS / Android / KMP)
35
35
  - [`docs-writing`](docs-writing.md) — Docs & Technical Writing
36
36
  - [`qa-testing`](qa-testing.md) — QA & Testing
37
+ - [`grok-harness`](grok-harness.md) — Grok xAI Harness
37
38
  - [`ai-agent-ops`](ai-agent-ops.md) — AI Agent Engineering & Ops
38
39
  - [`general`](general.md) — General (fallback)
39
40
 
@@ -29,6 +29,8 @@ SEQUENCE:
29
29
  6. Orchestration: harness (team-architecture factory) for multi-agent topology; dispatching-parallel-agents / subagent-driven-development for parallel lanes; ralphinho-rfc-pipeline for DAG + merge queue.
30
30
 
31
31
  HARD RULES: every agent/skill change has an eval; prompts are versioned and tested, not vibe-edited; MCP servers validate inputs; autonomy is bounded by explicit stop conditions + stop-verify hook.
32
+
33
+ PATCH SAFETY (B2C Correctness Wall): for pre-apply patch screening, load the correctness-wall extension explicitly (not in default preset). Read packages/coding-agent/docs/correctness-wall.md and examples/extensions/correctness-wall/README.md. Roll out shadow → soft → hard; never claim formal correctness proof.
32
34
  ```
33
35
 
34
36
  ## Curated skills (23)
@@ -71,7 +73,7 @@ HARD RULES: every agent/skill change has an eval; prompts are versioned and test
71
73
  - `stop-verify`
72
74
  - `subagent-stop-audit`
73
75
 
74
- ## Routing triggers (18)
76
+ ## Routing triggers (23)
75
77
 
76
78
  | kind | pattern | weight |
77
79
  |---|---|---|
@@ -93,3 +95,8 @@ HARD RULES: every agent/skill change has an eval; prompts are versioned and test
93
95
  | path | `.claude/agents` | 6 |
94
96
  | path | `.omk/` | 5 |
95
97
  | path | `SKILL.md` | 5 |
98
+ | keyword | `correctness wall` | 8 |
99
+ | keyword | `patch safety` | 8 |
100
+ | regex | `\bpatch[- ]safety\b` | 7 |
101
+ | path | `correctness-wall` | 7 |
102
+ | path | `adaptorch-wpl` | 5 |
@@ -0,0 +1,74 @@
1
+ # Grok xAI Harness (`grok-harness`)
2
+
3
+ > Inherited domain capability document. Auto-generated from `src/core/domain-loadouts.ts` — do not edit by hand.
4
+
5
+
6
+ ## Identity
7
+
8
+ | field | value |
9
+ |---|---|
10
+ | id | `grok-harness` |
11
+ | authority | `write-scoped` |
12
+ | tools | read, grep, find, ls, edit, write, bash |
13
+ | command mode | `scoped-shell` |
14
+
15
+ ## Routing prompt
16
+
17
+ > Prepended to the lane task prompt when the router selects this domain.
18
+
19
+ ```text
20
+ DOMAIN: Grok xAI Harness. You are operating in a Grok/xAI integration lane.
21
+ Prioritize the Grok operational playbook, small capability loadouts, and evidence-bound provider/tool routing.
22
+
23
+ SEQUENCE:
24
+ 1. Before implementing or routing Grok/xAI provider work, read and enforce ~/.omk/agent/grok.md. Treat it as the required Grok playbook for chat models vs Imagine tools, proxy health, tool-use/loop discipline, and Telegram parity unless higher-priority instructions conflict.
25
+ 2. Keep text chat flows and Imagine/media tool flows separate. Text work uses Grok chat/OAuth/provider surfaces; image/video/Imagine work routes through explicit Imagine tools only. Never conflate model ids with Imagine tool names.
26
+ 3. Capability discipline: load at most 2-3 skills for any lane. The allowed skill gate is packages, headroom, programming, debugging, adaptorch-route, adaptorch-synthesize, and understand-anything; choose the smallest subset and add headroom only under context pressure.
27
+ 4. Adaptorch is advisory only. Use adaptorch-route for routing/decomposition advice and adaptorch-synthesize for evidence synthesis, but do not treat Adaptorch as an automatic executor, source of truth, permission grant, or substitute for explicit tests.
28
+ 5. Use minimal MCP: adaptorch for advice/synthesis, fetch for bounded public retrieval, understand-anything for repo comprehension, and playwright only when browser or Imagine UI behavior needs real verification.
29
+ 6. Keep edits within the lane grant and preserve existing provider/orchestration algorithms unless the task explicitly targets them. Never route through legacy KIMICLI or deleted wrappers.
30
+ 7. Verification: run the narrowest relevant test/typecheck after edits. Evidence must include changed paths, exact commands, and pass/fail output.
31
+
32
+ HARD RULES: grok.md is mandatory context for Grok/xAI harness work; text chat surfaces and Imagine tools are distinct; maximum 2-3 active skills; Adaptorch is advisory route/synthesis support only; never log OAuth tokens, cookies, or proxy credentials; protect-secrets applies.
33
+ ```
34
+
35
+ ## Curated skills (7)
36
+
37
+ - `packages`
38
+ - `headroom`
39
+ - `programming`
40
+ - `debugging`
41
+ - `adaptorch-route`
42
+ - `adaptorch-synthesize`
43
+ - `understand-anything`
44
+
45
+ ## Curated MCP servers (4)
46
+
47
+ - `adaptorch`
48
+ - `fetch`
49
+ - `understand-anything`
50
+ - `playwright`
51
+
52
+ ## Curated hooks (5)
53
+
54
+ - `pre-shell-guard`
55
+ - `protect-secrets`
56
+ - `typecheck-after-edit`
57
+ - `stop-verify`
58
+ - `session-context`
59
+
60
+ ## Routing triggers (11)
61
+
62
+ | kind | pattern | weight |
63
+ |---|---|---|
64
+ | keyword | `grok` | 8 |
65
+ | keyword | `xai` | 7 |
66
+ | keyword | `grok-oauth` | 8 |
67
+ | keyword | `grok oauth` | 8 |
68
+ | keyword | `imagine` | 6 |
69
+ | keyword | `composer` | 5 |
70
+ | keyword | `adaptorch` | 7 |
71
+ | keyword | `adaptorch-route` | 8 |
72
+ | keyword | `adaptorch-synthesize` | 8 |
73
+ | regex | `\b(grok(?:[- ]oauth)?|xai|imagine|composer)\b` | 7 |
74
+ | regex | `\badapt\s*orch\b|\badaptorch[- ]?(route|routing|synthes(?:is|ize))\b` | 8 |
package/docs/providers.md CHANGED
@@ -35,6 +35,10 @@ Anthropic subscription auth is active for Claude Pro/Max accounts. Third-party h
35
35
  - Press Enter for github.com, or enter your GitHub Enterprise Server domain
36
36
  - If you get "model not supported", enable it in VS Code: Copilot Chat → model selector → select model → "Enable"
37
37
 
38
+ ### Grok harness presets
39
+
40
+ For `grok-oauth-proxy` project presets, Composer routing, and Imagine tool guidance, see [Grok harness](grok-harness.md).
41
+
38
42
  ## API Keys
39
43
 
40
44
  ### Environment Variables or Auth File
@@ -0,0 +1,87 @@
1
+ # Correctness Wall — optional loadout (copy-paste)
2
+
3
+ Use this when you run OMK with the default **`omk-core-verified`** preset and want a **B2C patch safety screen** on `edit` / `write` before changes land on disk. The wall is policy- and evidence-limited; it is **not** proof of correctness. Canonical operator doc: [`docs/correctness-wall.md`](../../docs/correctness-wall.md).
4
+
5
+ ## When to enable
6
+
7
+ | Situation | Action |
8
+ |-----------|--------|
9
+ | AI-generated or high-risk patches in a scoped lane | Load extension + set `OMK_WALL_SCOPE` |
10
+ | Shadow telemetry only (no blocking) | `OMK_PATCH_SAFETY_WALL_MODE=shadow` (default) |
11
+ | Block out-of-scope or secret-shaped diffs | `soft` or `hard` + explicit scope globs |
12
+ | Full outcome adjudication (OA) | Call tool `correctness_wall_evaluate` with fixture — not on the edit hook path |
13
+
14
+ **Routing note:** Domain router may send similar work to [`qa-testing`](../../docs/loadout-domains/qa-testing.md) (`execute-tests`, green-run evidence). The wall complements that lane: it gates **apply**, not **test execution**. For monorepo layout and extension paths, load skill **`packages`** when wiring paths from a checkout.
15
+
16
+ ## Copy-paste: session start
17
+
18
+ From repo root (paths assume monorepo checkout):
19
+
20
+ ```bash
21
+ export OMK_PATCH_SAFETY_WALL_MODE=shadow
22
+ export OMK_WALL_SCOPE='packages/coding-agent/**,packages/adaptorch-wpl/**'
23
+ export OMK_WALL_REPAIR_BUDGET=1
24
+
25
+ omk --extension packages/coding-agent/examples/extensions/correctness-wall/index.ts
26
+ ```
27
+
28
+ Persistent install (user extensions dir):
29
+
30
+ ```bash
31
+ cp -r packages/coding-agent/examples/extensions/correctness-wall ~/.omk/agent/extensions/correctness-wall/
32
+ # Then start omk; discovery depends on your agent config loading ~/.omk/agent/extensions/
33
+ ```
34
+
35
+ ## Dogfood phase 2 (soft) — internal lanes
36
+
37
+ After shadow telemetry review (see [correctness-wall.md](../../docs/correctness-wall.md#recommended-rollout-shadow--soft--hard)):
38
+
39
+ ```bash
40
+ export OMK_PATCH_SAFETY_WALL_MODE=soft
41
+ export OMK_WALL_SCOPE='packages/adaptorch-wpl/**,packages/coding-agent/examples/extensions/correctness-wall/**'
42
+ export OMK_WALL_OVERRIDE= # set only for intentional human override
43
+ omk --extension packages/coding-agent/examples/extensions/correctness-wall/index.ts
44
+ ```
45
+
46
+ Live OA (optional): `OMK_WALL_OA_TRANSPORT=mcp`. The extension entry calls `autoWireLiveAdaptOrch(omk)` so live transport uses host `omk.callMcpTool` when the harness binds a handler at `bindCore`. Until a session MCP hub binds that handler, invocations throw and fixture transport remains the safe default. Manual `setWallAdaptOrchCallTool` is still available for tests.
47
+
48
+ ## Copy-paste: `omk-core-verified` + extension
49
+
50
+ Keep your usual preset (`~/.omk/runtime-preset.json` or project default). Add **one** extra flag for this harness:
51
+
52
+ ```bash
53
+ omk --extension packages/coding-agent/examples/extensions/correctness-wall/index.ts
54
+ ```
55
+
56
+ Optional hardening for a single lane (example owned paths only):
57
+
58
+ ```bash
59
+ export OMK_PATCH_SAFETY_WALL_MODE=soft
60
+ export OMK_WALL_SCOPE='packages/coding-agent/examples/extensions/correctness-wall/**'
61
+ export OMK_WALL_OVERRIDE= # unset unless human override is intentional
62
+ ```
63
+
64
+ ## On-demand evaluation (tool)
65
+
66
+ Does not require blocking mode; useful for planners/reviewers:
67
+
68
+ - Tool: `correctness_wall_evaluate`
69
+ - Params: `kind`, optional `diffPath`, `approvedWriteScope`, `previewOnly`, `runIds`, `adjudicationFixturePath`
70
+ - OA fixture format: see [README.md](./README.md#oa-adjudication-fixture-format)
71
+
72
+ ## Evidence & cache (no secrets in logs)
73
+
74
+ | Artifact | Purpose |
75
+ |----------|---------|
76
+ | `.omk/wall-cache/latest.json` | Last verdict summary |
77
+ | `.omk/wall-cache/shadow-telemetry.ndjson` | Shadow-mode audit trail |
78
+ | `.omk/wall-cache/repair-budget.json` | Capped repair hints per packet |
79
+
80
+ Final claims still need project rules: e.g. `npm run check` / targeted tests per [`AGENTS.md`](../../../../AGENTS.md) — the wall does not replace those.
81
+
82
+ ## See also
83
+
84
+ - [correctness-wall.md](../../docs/correctness-wall.md) — verdicts, fast vs deep wall, Adaptorch relationship
85
+ - [adaptorch-preview.md](../../docs/adaptorch-preview.md) — preview planning (separate from apply gate)
86
+ - [README.md](./README.md) — env vars, hook behavior, limitations
87
+ - Domain catalog: [loadout-domains/README.md](../../docs/loadout-domains/README.md)
@@ -0,0 +1,111 @@
1
+ # Correctness Wall extension
2
+
3
+ B2C patch safety gate for `edit` and `write` tool calls, plus an explicit `correctness_wall_evaluate` tool. Policy checks come from `omk-adaptorch-wpl` via a **relative import** (no workspace `package.json` dependency).
4
+
5
+ ## Usage
6
+
7
+ From the `packages/coding-agent` directory (or repo root with a valid path):
8
+
9
+ ```bash
10
+ omk --extension examples/extensions/correctness-wall/index.ts
11
+ ```
12
+
13
+ Copy into user extensions for auto-discovery:
14
+
15
+ ```bash
16
+ cp -r examples/extensions/correctness-wall ~/.omk/agent/extensions/correctness-wall/
17
+ ```
18
+
19
+ ## Claim boundaries
20
+
21
+ - **In scope**: unified-diff preview for pending `edit`/`write`, fast policy wall (write scope, flags), optional OA adjudication when `correctness_wall_evaluate` is called with `runIds`, `previewOnly: false`, and an OA fixture file (env or tool param).
22
+ - **Out of scope**: Replacing core hooks, modifying `packages/adaptorch-wpl` from this lane, or adding npm workspace dependencies. The extension only **imports** `evaluateCorrectnessWall` and `AdaptOrchClient` from `../../../../adaptorch-wpl/src/index.ts`.
23
+
24
+ ## Environment variables
25
+
26
+ | Variable | Default | Meaning |
27
+ |----------|---------|---------|
28
+ | `OMK_PATCH_SAFETY_WALL_MODE` | `shadow` | `shadow` — log/notify only, never block. `soft` — block `BLOCKED` unless override. `hard` — block `BLOCKED` and `INCONCLUSIVE`. |
29
+ | `OMK_WALL_SCOPE` | *(empty)* | Comma-separated glob/path prefixes allowed in the diff. Empty means scope checks do not approve any path (out-of-scope diffs can trigger blocking flags when paths are present). |
30
+ | `OMK_WALL_OVERRIDE` | unset | When `1` / `true` / `yes`, `soft` mode does not block `BLOCKED` verdicts (human override). |
31
+ | `OMK_WALL_REPAIR_BUDGET` | `1` | Capped regenerate budget: max **blocked attempts** per packet (keyed by `packetId` or SHA-256 of `kind` + sorted `OMK_WALL_SCOPE`) before repair hints are treated as exhausted. Also caps hint string count in UI/JSON. Persisted in `.omk/wall-cache/repair-budget.json`. Hints only — no auto-regenerate. |
32
+ | `OMK_WALL_RUN_IDS` | *(empty)* | Comma-separated AdaptOrch run ids. On `edit`/`write` hooks, when non-empty **and** `OMK_WALL_OA_FIXTURE_PATH` (or per-tool `adjudicationFixturePath`) is set, evaluation uses `previewOnly: false` and OA adjudication via `resolveOaClientForEvaluation`. Otherwise hooks stay preview-only. |
33
+ | `OMK_WALL_OA_FIXTURE_PATH` | unset | Path to OA adjudication fixture JSON. Used when `correctness_wall_evaluate` runs with `previewOnly: false` and non-empty `runIds`, and on edit/write hooks when combined with `OMK_WALL_RUN_IDS`. Overridden per call by `adjudicationFixturePath`. |
34
+ | `OMK_WALL_AUTO_REGENERATE` | unset | When `1` / `true` / `yes`, `correctness_wall_evaluate` JSON may include a `regeneratePacket` (capped hints only; no automatic patch apply). |
35
+ | `OMK_WALL_RECEIPT_SIGNING_SECRET` | unset | When set, verification receipts include `signedReceipt` (HMAC-SHA256 over digest composite). Never log or commit this value. |
36
+ | `OMK_WALL_DEEP_PHASE` | `stub` | `docker` records deep-wall intent; hermetic runner still unavailable (batch-2). |
37
+ | `OMK_WALL_OA_TRANSPORT` | `fixture` | `mcp` or `live` uses session-injected MCP `callTool` via `setWallAdaptOrchCallTool` (see `adjudication-fixture.ts`). Fixture path optional for receipt metadata when using `mcp`. |
38
+
39
+ ## OA adjudication fixture format
40
+
41
+ Fixture file (JSON object). Each `run_id` must define the three AdaptOrch introspection payloads the in-memory client serves:
42
+
43
+ ```json
44
+ {
45
+ "wall_version": "1",
46
+ "dispatchRecordId": "local-dev-dispatch",
47
+ "runsById": {
48
+ "run-oa-1": {
49
+ "run": { "run_id": "run-oa-1", "status": "completed" },
50
+ "artifacts": [{ "path": "out.md", "size_bytes": 42 }],
51
+ "traces": [{ "kind": "write", "level": "info" }]
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ - **`wall_version`**: optional string copied onto the verification **receipt** returned by `correctness_wall_evaluate` (defaults to extension version `1`).
58
+ - **`dispatchRecordId`**: optional; passed to OA adjudication when not set elsewhere.
59
+ - **`runsById`**: required map; keys must match `runIds` in the tool call.
60
+
61
+ `createInMemoryAdaptOrchClient` (in `adjudication-fixture.ts`) wraps these entries with the same transport pattern as `packages/adaptorch-wpl/test/b2c-wall-oa.test.ts`.
62
+
63
+ ## Tools
64
+
65
+ ### `correctness_wall_evaluate`
66
+
67
+ Parameters:
68
+
69
+ - `kind` (string, required)
70
+ - `approvedWriteScope` (optional string array)
71
+ - `previewOnly` (optional boolean, default `true`)
72
+ - `diffPath` (optional string) — if omitted, returns an `INCONCLUSIVE` verdict card JSON
73
+ - `runIds` (optional string array)
74
+ - `packetId` (optional string)
75
+ - `adjudicationFixturePath` (optional string) — OA fixture file; falls back to `OMK_WALL_OA_FIXTURE_PATH`
76
+
77
+ Returns JSON text: `{ verdictCard, receipt }`, and `repairHints` when `verdictCard.verdict` is `BLOCKED`.
78
+
79
+ The **`receipt`** includes standard `VerificationReceipt` fields from adaptorch-wpl plus **`wall_version`** (from the fixture or default).
80
+
81
+ Example receipt fragment:
82
+
83
+ ```json
84
+ {
85
+ "schemaVersion": 1,
86
+ "evaluatedAt": "2026-07-08T12:00:00.000Z",
87
+ "kind": "code-edit",
88
+ "runIds": ["run-oa-1"],
89
+ "previewOnly": false,
90
+ "wall_version": "1",
91
+ "adjudicationVerdict": "CONFIRMED",
92
+ "policyFlags": []
93
+ }
94
+ ```
95
+
96
+ ## Edit/write gate
97
+
98
+ On each `edit` or `write` `tool_call` hook:
99
+
100
+ 1. Build a unified diff preview from `event.input` (edits or write content).
101
+ 2. Call `evaluateCorrectnessWall` with scope from `OMK_WALL_SCOPE`. Default `previewOnly: true`; when `OMK_WALL_RUN_IDS` is non-empty and an OA fixture path is set (`OMK_WALL_OA_FIXTURE_PATH`), hooks use `previewOnly: false`, pass `runIds`, and supply the OA client from `resolveOaClientForEvaluation`.
102
+ 3. Apply `OMK_PATCH_SAFETY_WALL_MODE` blocking rules; blocked calls return `{ block: true, reason: "<short user message>" }`.
103
+ 4. Write a summary snapshot to `.omk/wall-cache/latest.json` (mode, verdict, `wouldBlock`, compact card summary, timestamp — no full diff or secrets).
104
+ 5. In `shadow` mode, append one NDJSON line per gated tool call to **`.omk/wall-cache/shadow-telemetry.ndjson`** (`event`, `wall_version`, `mode`, `verdict`, `wouldBlock`, `kind`, `tool`, `previewOnly`, `usedOaFixture`, `timestamp` — no diff or secrets).
105
+ 6. On `BLOCKED`, increment per-packet attempts in `.omk/wall-cache/repair-budget.json`. In `shadow` mode, append capped repair hints to the UI notification; when `attempts >= OMK_WALL_REPAIR_BUDGET`, append a repair-budget-exhausted message.
106
+
107
+ ## Limitations
108
+
109
+ - Edit preview reads the target file from disk relative to session `cwd`; if the file is missing or paths are wrong, the hook may return `INCONCLUSIVE` (and block in `hard` mode).
110
+ - Hook OA requires both `OMK_WALL_RUN_IDS` and a fixture path; if either is missing, hooks remain preview-only. Explicit `correctness_wall_evaluate` can still pass `runIds`, `previewOnly: false`, and `adjudicationFixturePath` per call.
111
+ - Relative imports require loading this extension from the monorepo layout (or an equivalent path to `adaptorch-wpl` and `coding-agent` sources).
@@ -0,0 +1,151 @@
1
+ /**
2
+ * OA adjudication fixture loader and in-memory AdaptOrch client for local/dev evaluation.
3
+ */
4
+
5
+ import { readFile } from "node:fs/promises";
6
+ import type { AdaptOrchCallToolFn, AdaptOrchClient } from "../../../../adaptorch-wpl/src/index.ts";
7
+ import {
8
+ createLiveAdaptOrchClient,
9
+ createInMemoryAdaptOrchClient as createWplInMemoryClient,
10
+ parseOaTransportModeFromEnv,
11
+ } from "../../../../adaptorch-wpl/src/index.ts";
12
+
13
+ /** Optional session-injected MCP `callTool` when `OMK_WALL_OA_TRANSPORT=mcp`. */
14
+ let wallAdaptOrchCallTool: AdaptOrchCallToolFn | undefined;
15
+
16
+ export function setWallAdaptOrchCallTool(fn: AdaptOrchCallToolFn | undefined): void {
17
+ wallAdaptOrchCallTool = fn;
18
+ }
19
+
20
+ /** Minimal capability surface an extension host may expose for live MCP transport. */
21
+ export interface McpCallToolCapable {
22
+ callMcpTool?(server: string, name: string, args: Record<string, unknown>): Promise<unknown>;
23
+ }
24
+
25
+ /** Default MCP server name used by the live adaptorch transport. */
26
+ export const ADAPTORCH_MCP_SERVER = "adaptorch";
27
+
28
+ /**
29
+ * Build an {@link AdaptOrchCallToolFn} that forwards to a session MCP capability,
30
+ * or return `undefined` when the host does not expose `callMcpTool`. The adaptorch
31
+ * server name is used as the MCP target by default. Pure: does not touch module state.
32
+ */
33
+ export function buildLiveCallToolFromCapability(
34
+ api: McpCallToolCapable,
35
+ server: string = ADAPTORCH_MCP_SERVER,
36
+ ): AdaptOrchCallToolFn | undefined {
37
+ if (typeof api.callMcpTool !== "function") return undefined;
38
+ return (name, args) => api.callMcpTool!(server, name, args);
39
+ }
40
+
41
+ /**
42
+ * Auto-wire live adaptorch MCP transport when the host exposes `callMcpTool`.
43
+ * Called once from the extension entry. Idempotent and a no-op when the capability
44
+ * is absent (fixture transport remains the default). Using the live client is still
45
+ * gated by `OMK_WALL_OA_TRANSPORT=mcp` (explicit operator opt-in).
46
+ */
47
+ export function autoWireLiveAdaptOrch(api: McpCallToolCapable): void {
48
+ setWallAdaptOrchCallTool(buildLiveCallToolFromCapability(api));
49
+ }
50
+
51
+ export const CORRECTNESS_WALL_EXTENSION_VERSION = "1" as const;
52
+
53
+ /** Per-run payloads returned by fake adaptorch_get_run / _get_artifacts / _get_traces. */
54
+ export interface OaRunFixture {
55
+ run: unknown;
56
+ artifacts: unknown;
57
+ traces: unknown;
58
+ }
59
+
60
+ export interface AdjudicationFixtureFile {
61
+ /** Extension / fixture schema version (surfaced on verification receipts as wall_version). */
62
+ wall_version?: string;
63
+ /** Optional default dispatch record id for adjudication requests. */
64
+ dispatchRecordId?: string;
65
+ /** Map of AdaptOrch run_id → MCP tool payloads. */
66
+ runsById: Record<string, OaRunFixture>;
67
+ }
68
+
69
+ function isRecord(value: unknown): value is Record<string, unknown> {
70
+ return typeof value === "object" && value !== null && !Array.isArray(value);
71
+ }
72
+
73
+ function parseFixtureJson(raw: unknown): AdjudicationFixtureFile {
74
+ if (!isRecord(raw)) {
75
+ throw new Error("OA fixture root must be a JSON object");
76
+ }
77
+ const runsById = raw.runsById;
78
+ if (!isRecord(runsById)) {
79
+ throw new Error("OA fixture missing runsById object");
80
+ }
81
+ const normalized: Record<string, OaRunFixture> = {};
82
+ for (const [runId, entry] of Object.entries(runsById)) {
83
+ if (!isRecord(entry)) {
84
+ throw new Error(`OA fixture runsById.${runId} must be an object`);
85
+ }
86
+ if (!("run" in entry) || !("artifacts" in entry) || !("traces" in entry)) {
87
+ throw new Error(`OA fixture runsById.${runId} must include run, artifacts, and traces`);
88
+ }
89
+ normalized[runId] = {
90
+ run: entry.run,
91
+ artifacts: entry.artifacts,
92
+ traces: entry.traces,
93
+ };
94
+ }
95
+ return {
96
+ wall_version:
97
+ typeof raw.wall_version === "string" && raw.wall_version.length > 0
98
+ ? raw.wall_version
99
+ : CORRECTNESS_WALL_EXTENSION_VERSION,
100
+ dispatchRecordId: typeof raw.dispatchRecordId === "string" ? raw.dispatchRecordId : undefined,
101
+ runsById: normalized,
102
+ };
103
+ }
104
+
105
+ export async function loadAdjudicationFixtureFile(filePath: string): Promise<AdjudicationFixtureFile> {
106
+ const text = await readFile(filePath, "utf-8");
107
+ const parsed: unknown = JSON.parse(text);
108
+ return parseFixtureJson(parsed);
109
+ }
110
+
111
+ /** In-memory {@link AdaptOrchClient} backed by fixture run payloads (delegates to omk-adaptorch-wpl). */
112
+ export function createInMemoryAdaptOrchClient(fixture: AdjudicationFixtureFile): AdaptOrchClient {
113
+ return createWplInMemoryClient(fixture.runsById);
114
+ }
115
+
116
+ export function resolveAdjudicationFixturePath(toolParamPath?: string): string | undefined {
117
+ const fromTool = toolParamPath?.trim();
118
+ if (fromTool) return fromTool;
119
+ const fromEnv = process.env.OMK_WALL_OA_FIXTURE_PATH?.trim();
120
+ return fromEnv && fromEnv.length > 0 ? fromEnv : undefined;
121
+ }
122
+
123
+ export async function resolveOaClientForEvaluation(options: {
124
+ previewOnly: boolean;
125
+ runIds?: string[];
126
+ adjudicationFixturePath?: string;
127
+ }): Promise<{ client?: AdaptOrchClient; fixture?: AdjudicationFixtureFile }> {
128
+ const runIds = options.runIds ?? [];
129
+ if (options.previewOnly || runIds.length === 0) {
130
+ return {};
131
+ }
132
+ const transportMode = parseOaTransportModeFromEnv();
133
+ if (transportMode === "mcp" && wallAdaptOrchCallTool !== undefined) {
134
+ const fixturePath = resolveAdjudicationFixturePath(options.adjudicationFixturePath);
135
+ const fixture = fixturePath !== undefined ? await loadAdjudicationFixtureFile(fixturePath) : undefined;
136
+ return {
137
+ client: createLiveAdaptOrchClient(wallAdaptOrchCallTool),
138
+ fixture,
139
+ };
140
+ }
141
+ const fixturePath = resolveAdjudicationFixturePath(options.adjudicationFixturePath);
142
+ if (!fixturePath) {
143
+ return {};
144
+ }
145
+ const fixture = await loadAdjudicationFixtureFile(fixturePath);
146
+ return { client: createInMemoryAdaptOrchClient(fixture), fixture };
147
+ }
148
+
149
+ export function wallVersionFromFixture(fixture?: AdjudicationFixtureFile): string {
150
+ return fixture?.wall_version ?? CORRECTNESS_WALL_EXTENSION_VERSION;
151
+ }