omnius 1.0.674 → 1.0.676

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.
@@ -54,6 +54,7 @@ export default defineConfig({
54
54
  items: [
55
55
  { text: "Bring Your Own Inference", link: "/guides/bring-your-own-inference" },
56
56
  { text: "Tools And Web Search", link: "/guides/tools-and-web-search" },
57
+ { text: "Evidence-Bound Adjudication", link: "/ADJUDICATION" },
57
58
  { text: "Categorized OSINT Research", link: "/guides/osint-research" },
58
59
  { text: "Agent Integration", link: "/guides/agent-integration" },
59
60
  { text: "TUI Workflows", link: "/guides/tui-workflows" },
@@ -0,0 +1,270 @@
1
+ # Evidence-bound adjudication
2
+
3
+ `adjudicate` resolves a genuine decision impasse. It does not replace normal
4
+ engineering judgment. It creates a small, tools-free decision environment. It
5
+ then runs independent constituent assessments and a final judge.
6
+
7
+ The tool separates three things:
8
+
9
+ 1. Evidence is part of the caller-supplied admissible record.
10
+ 2. Arguments are claims about that evidence. Arguments are not evidence.
11
+ 3. Constituent findings are analysis. Agreement between constituents does not
12
+ create a new fact.
13
+
14
+ The host validates all identifiers, citations, panel results, and the verdict.
15
+ The tool holds the case when it cannot validate the required quorum or final
16
+ contract. It does not guess a result.
17
+
18
+ ## Availability
19
+
20
+ `adjudicate` is an agent-bound tool in the top-level interactive TUI. Start
21
+ `omnius` and ask the active agent to adjudicate an exact impasse with an
22
+ admissible evidence record. The tool is intentionally unavailable to child
23
+ agents. This prevents nested panels, recursive terminal projections, and
24
+ unbounded inference fan-out.
25
+
26
+ The daemon direct-tool registry does not currently expose this tool. Do not
27
+ infer `GET /v1/tools/adjudicate` or
28
+ `POST /v1/tools/adjudicate/call` from the tool name. Use
29
+ `omnius show tool.adjudicate` for its static discovery contract.
30
+
31
+ ## When to use it
32
+
33
+ Use `adjudicate` when all of these conditions are true:
34
+
35
+ - The active task has one exact, unresolved decision.
36
+ - Two or more outcomes remain materially plausible.
37
+ - The decision affects the next action.
38
+ - The available evidence conflicts or supports different risk tradeoffs.
39
+ - A fresh, impartial context can assess the decision more reliably than the
40
+ main loop's large working context.
41
+
42
+ Do not use it for an ordinary implementation choice, a factual lookup, or a
43
+ way to avoid gathering missing evidence.
44
+
45
+ ## Minimum call
46
+
47
+ ```json
48
+ {
49
+ "question": "Should the failed release be rolled back or repaired in place?",
50
+ "allowedOutcomes": ["rollback", "repair_in_place"],
51
+ "evidence": [
52
+ {
53
+ "id": "E1",
54
+ "kind": "test_result",
55
+ "source": "integration run 2026-08-31T18:00:00Z",
56
+ "content": "The post-deploy integration suite failed 14 of 80 tests."
57
+ },
58
+ {
59
+ "id": "E2",
60
+ "kind": "artifact",
61
+ "source": "release receipt sha256:abc",
62
+ "content": "The prior artifact matches the last known-good receipt."
63
+ }
64
+ ]
65
+ }
66
+ ```
67
+
68
+ The case framer derives three distinct constituent assignments by default. Set
69
+ `panelSize` from 2 through 6 to change that count.
70
+
71
+ ## Detailed call
72
+
73
+ ```json
74
+ {
75
+ "caseId": "release-impasse-2026-08-31",
76
+ "question": "Should the failed release be rolled back or repaired in place?",
77
+ "context": "The release is paused. No mutation is authorized during this decision.",
78
+ "allowedOutcomes": ["rollback", "repair_in_place"],
79
+ "burdenOfProof": "clear_and_convincing",
80
+ "decisionRules": [
81
+ "Prefer verified recovery evidence.",
82
+ "Do not infer a successful recovery from panel agreement."
83
+ ],
84
+ "evidence": [
85
+ {
86
+ "id": "E1",
87
+ "kind": "test_result",
88
+ "source": "integration run 2026-08-31T18:00:00Z",
89
+ "content": "The post-deploy integration suite failed 14 of 80 tests.",
90
+ "reliability": 0.98
91
+ },
92
+ {
93
+ "id": "E2",
94
+ "kind": "artifact",
95
+ "source": "release receipt sha256:abc",
96
+ "content": "The prior artifact matches the last known-good receipt."
97
+ },
98
+ {
99
+ "id": "E3",
100
+ "kind": "observation",
101
+ "source": "operations log",
102
+ "content": "No rollback rehearsal exists for the new migration."
103
+ }
104
+ ],
105
+ "arguments": [
106
+ {
107
+ "id": "A1",
108
+ "position": "rollback",
109
+ "claim": "The known-good artifact makes rollback more reversible.",
110
+ "citedEvidenceIds": ["E1", "E2"]
111
+ },
112
+ {
113
+ "id": "A2",
114
+ "position": "repair_in_place",
115
+ "claim": "Rollback has untested migration risk.",
116
+ "citedEvidenceIds": ["E3"]
117
+ }
118
+ ],
119
+ "constituents": [
120
+ {
121
+ "id": "correctness",
122
+ "label": "Correctness",
123
+ "question": "Which outcome is best supported by functional evidence?",
124
+ "evidenceIds": ["E1", "E2"],
125
+ "argumentIds": ["A1"],
126
+ "decisionRuleIds": ["rule-1", "rule-2"]
127
+ },
128
+ {
129
+ "id": "reversibility",
130
+ "label": "Reversibility",
131
+ "question": "Which outcome has the safest verified recovery path?",
132
+ "evidenceIds": ["E2", "E3"],
133
+ "argumentIds": ["A1", "A2"],
134
+ "decisionRuleIds": ["rule-1", "rule-2"]
135
+ },
136
+ {
137
+ "id": "risk",
138
+ "label": "Operational risk",
139
+ "question": "What unsupported risk remains for each outcome?",
140
+ "evidenceIds": ["E1", "E3"],
141
+ "argumentIds": ["A2"],
142
+ "decisionRuleIds": ["rule-1", "rule-2"]
143
+ }
144
+ ],
145
+ "quorum": 2,
146
+ "maxConcurrency": 3,
147
+ "timeoutMs": 120000,
148
+ "maxTokensPerConstituent": 2048,
149
+ "maxJudgeTokens": 3072
150
+ }
151
+ ```
152
+
153
+ `insufficient_evidence` is a reserved verdict. Do not include it in
154
+ `allowedOutcomes`. The host makes it available to constituents and the judge.
155
+ It produces a held case instead of a binding decision.
156
+
157
+ ## Execution phases
158
+
159
+ ### 1. Record admission
160
+
161
+ The host validates the input before inference. It rejects duplicate IDs,
162
+ unknown citations, invalid outcome names, incomplete manual assignment
163
+ coverage, and a quorum that exceeds the panel size.
164
+
165
+ The host creates a canonical case record and SHA-256 record hash.
166
+
167
+ ### 2. Case framing
168
+
169
+ If the caller omits `constituents`, a tools-free case framer creates 2 through
170
+ 6 assignments. Each assignment has a distinct question and an explicit subset
171
+ of evidence, arguments, and decision rules.
172
+
173
+ The host rejects unknown IDs and incomplete evidence coverage. It retries one
174
+ time with validation codes only. The invalid model output is not added to the
175
+ repair prompt.
176
+
177
+ ### 3. Constituent fan-out
178
+
179
+ The host runs assignments with bounded concurrency. Each constituent gets a
180
+ fresh context that contains only:
181
+
182
+ - the exact case question and allowed outcomes;
183
+ - the stated burden;
184
+ - its assignment;
185
+ - its assigned decision rules;
186
+ - its assigned evidence;
187
+ - its assigned arguments.
188
+
189
+ The constituent gets no tools. It has no mutation authority. It must return a
190
+ public assessment, a recommendation, confidence, cited evidence IDs, claims,
191
+ counterarguments, and uncertainties.
192
+
193
+ The host rejects unassigned citations, unknown outcomes, identity mismatches,
194
+ and invalid schemas. One strict repair attempt is allowed.
195
+
196
+ ### 4. Quorum
197
+
198
+ The default quorum is two thirds of the requested panel, rounded up, with a
199
+ minimum of two. A caller can set a stricter quorum.
200
+
201
+ The tool holds the case if too few findings pass host validation. It does not
202
+ invoke the judge without quorum.
203
+
204
+ ### 5. Judge synthesis
205
+
206
+ The judge gets the immutable full case record and validated constituent
207
+ findings. The prompt labels findings as analysis rather than evidence.
208
+
209
+ The judge must:
210
+
211
+ - apply the burden and decision rules;
212
+ - cite only admitted evidence IDs;
213
+ - consider every validated constituent;
214
+ - accept or reject every constituent finding exactly once;
215
+ - preserve material dissent;
216
+ - select an allowed outcome or `insufficient_evidence`.
217
+
218
+ The host validates this contract. It holds the case after two invalid judge
219
+ responses.
220
+
221
+ ### 6. Durable receipt
222
+
223
+ Artifacts are written atomically under:
224
+
225
+ ```text
226
+ .omnius/adjudications/<case-id>/run-<timestamp>/
227
+ case.json
228
+ assignments.json
229
+ findings.json
230
+ verdict.json
231
+ receipt.json
232
+ ```
233
+
234
+ `verdict.json` is absent when the case holds before a valid verdict. The
235
+ receipt records hashes, quorum, validation failures, elapsed time, and final
236
+ status.
237
+
238
+ ## CLI display
239
+
240
+ The CLI opens one live block when record admission starts. It shows:
241
+
242
+ - case identity and decision question;
243
+ - record size, burden, and allowed outcomes;
244
+ - constituent assignments;
245
+ - separately attributed public assessment streams;
246
+ - host validation results;
247
+ - the judge's public rationale stream;
248
+ - final verdict, citations, status, and receipt path.
249
+
250
+ The block has a `read mode` row. Select it to expand all retained rows. The
251
+ display retains a bounded amount of text. It strips terminal controls and uses
252
+ the normal secret redactor. It does not display provider hidden reasoning.
253
+
254
+ ## Harness
255
+
256
+ Run the deterministic impasse harness:
257
+
258
+ ```bash
259
+ pnpm harness:adjudication
260
+ ```
261
+
262
+ The harness does not load a model and does not use a GPU. It verifies parallel
263
+ constituent overlap, streamed public assessments, judge synthesis, and receipt
264
+ persistence. The focused automated tests also cover invalid citations, strict
265
+ repair, partial valid quorum, automatic case framing, and no-judge behavior
266
+ when quorum fails.
267
+
268
+ The implementation lives in
269
+ `packages/orchestrator/src/adjudication.ts`. The live projection lives in
270
+ `packages/cli/src/tui/adjudication-live-block.ts`.
@@ -70,6 +70,11 @@
70
70
  "query": "web search tool exposure agent bound",
71
71
  "expand": "workflow.agent-bound-tools"
72
72
  },
73
+ {
74
+ "intent": "Resolve an evidence-based decision impasse",
75
+ "query": "adjudicate impartial evidence quorum verdict",
76
+ "expand": "workflow.evidence-bound-adjudication"
77
+ },
73
78
  {
74
79
  "intent": "Debug a stale or unhealthy daemon",
75
80
  "query": "daemon version port logs health debug",
@@ -28266,6 +28271,36 @@
28266
28271
  "api.tools"
28267
28272
  ]
28268
28273
  },
28274
+ {
28275
+ "id": "guide.adjudication-uppercase",
28276
+ "kind": "guide",
28277
+ "title": "Evidence-bound adjudication",
28278
+ "summary": "adjudicate resolves a genuine decision impasse. It does not replace normal engineering judgment. It creates a small, tools-free decision environment. It then runs independent constituent assessments and a final judge.",
28279
+ "keywords": [
28280
+ "ADJUDICATION",
28281
+ "md"
28282
+ ],
28283
+ "maturity": "stable",
28284
+ "audiences": [
28285
+ "user",
28286
+ "integrator",
28287
+ "coding-agent"
28288
+ ],
28289
+ "layer": "documentation",
28290
+ "interfaces": [
28291
+ {
28292
+ "type": "file",
28293
+ "target": "docs/ADJUDICATION.md"
28294
+ }
28295
+ ],
28296
+ "references": [
28297
+ {
28298
+ "type": "documentation",
28299
+ "target": "docs/ADJUDICATION.md",
28300
+ "relation": "canonical-artifact"
28301
+ }
28302
+ ]
28303
+ },
28269
28304
  {
28270
28305
  "id": "guide.agent-memory-index",
28271
28306
  "kind": "guide",
@@ -36048,6 +36083,109 @@
36048
36083
  "packages/cli/src/tui/omnius-directory.ts"
36049
36084
  ]
36050
36085
  },
36086
+ {
36087
+ "id": "tool.adjudicate",
36088
+ "kind": "tool",
36089
+ "title": "Evidence-bound adjudication",
36090
+ "summary": "Resolve one genuine decision impasse through an isolated evidence record, independently scoped constituent review, host-validated citations and quorum, a final judge, and a durable verdict receipt.",
36091
+ "aliases": [
36092
+ "adjudicate",
36093
+ "adjudication",
36094
+ "decision impasse",
36095
+ "impartial decision",
36096
+ "evidence-bound decision"
36097
+ ],
36098
+ "keywords": [
36099
+ "agent-bound",
36100
+ "impasse",
36101
+ "evidence",
36102
+ "constituents",
36103
+ "quorum",
36104
+ "judge",
36105
+ "verdict",
36106
+ "dissent"
36107
+ ],
36108
+ "maturity": "stable",
36109
+ "layer": "orchestration",
36110
+ "audiences": [
36111
+ "coding-agent",
36112
+ "maintainer",
36113
+ "interactive-user"
36114
+ ],
36115
+ "direct_callable": false,
36116
+ "use_when": [
36117
+ "The top-level interactive agent has one exact unresolved decision with at least two materially plausible outcomes",
36118
+ "The admissible evidence supports conflicting conclusions or risk tradeoffs",
36119
+ "The decision changes the next action and benefits from isolated impartial review"
36120
+ ],
36121
+ "avoid_when": [
36122
+ "The question is an ordinary implementation choice, factual lookup, or substitute for gathering missing evidence",
36123
+ "The caller is a child agent, daemon direct-tool client, REST run, or Telegram tool loop"
36124
+ ],
36125
+ "interfaces": [
36126
+ {
36127
+ "type": "tui-agent-tool",
36128
+ "target": "omnius",
36129
+ "description": "Registered only in the top-level interactive agent tool catalog"
36130
+ }
36131
+ ],
36132
+ "references": [
36133
+ {
36134
+ "type": "guide",
36135
+ "target": "docs/ADJUDICATION.md",
36136
+ "relation": "canonical-guide"
36137
+ },
36138
+ {
36139
+ "type": "source",
36140
+ "target": "packages/orchestrator/src/adjudication.ts",
36141
+ "relation": "implementation"
36142
+ },
36143
+ {
36144
+ "type": "source",
36145
+ "target": "packages/cli/src/tui/interactive.ts",
36146
+ "relation": "top-level-registration"
36147
+ },
36148
+ {
36149
+ "type": "source",
36150
+ "target": "packages/cli/src/tui/adjudication-live-block.ts",
36151
+ "relation": "live-projection"
36152
+ }
36153
+ ],
36154
+ "related": [
36155
+ "workflow.evidence-bound-adjudication",
36156
+ "layer.orchestration",
36157
+ "layer.observability",
36158
+ "module.orchestrator",
36159
+ "guide.adjudication-uppercase"
36160
+ ],
36161
+ "verification": [
36162
+ {
36163
+ "check": "Run pnpm harness:adjudication",
36164
+ "expected": "Parallel constituent streams, judge synthesis, and a durable receipt complete without loading a real model"
36165
+ },
36166
+ {
36167
+ "check": "Inspect the top-level and child-agent tool registration tests",
36168
+ "expected": "The top-level tool list includes adjudicate and child-agent lists exclude it"
36169
+ }
36170
+ ],
36171
+ "failure_modes": [
36172
+ {
36173
+ "symptom": "A caller attempts /v1/tools/adjudicate/call",
36174
+ "likely_cause": "Static tool discovery was mistaken for daemon direct-tool exposure",
36175
+ "recovery": "Use the top-level interactive TUI agent"
36176
+ },
36177
+ {
36178
+ "symptom": "The case returns held instead of a verdict",
36179
+ "likely_cause": "Admission, citation validation, quorum, or final verdict validation failed",
36180
+ "recovery": "Inspect the receipt and provide a corrected admissible record; do not infer a decision"
36181
+ }
36182
+ ],
36183
+ "source_of_truth": [
36184
+ "docs/ADJUDICATION.md",
36185
+ "packages/orchestrator/src/adjudication.ts",
36186
+ "packages/cli/src/tui/interactive.ts"
36187
+ ]
36188
+ },
36051
36189
  {
36052
36190
  "id": "tool.agenda",
36053
36191
  "kind": "tool",
@@ -43985,6 +44123,122 @@
43985
44123
  "packages/execution/src/tools/tool-manifest.ts"
43986
44124
  ]
43987
44125
  },
44126
+ {
44127
+ "id": "workflow.evidence-bound-adjudication",
44128
+ "kind": "workflow",
44129
+ "title": "Resolve an evidence-bound decision impasse",
44130
+ "summary": "Admit one exact decision record, isolate constituent review, validate citations and quorum, synthesize a verdict through a final judge, and preserve a durable receipt without granting the panel tools or mutation authority.",
44131
+ "aliases": [
44132
+ "adjudicate impasse",
44133
+ "impartial review",
44134
+ "decision court",
44135
+ "constituent panel"
44136
+ ],
44137
+ "keywords": [
44138
+ "evidence",
44139
+ "arguments",
44140
+ "quorum",
44141
+ "judge",
44142
+ "verdict",
44143
+ "dissent",
44144
+ "receipt"
44145
+ ],
44146
+ "maturity": "stable",
44147
+ "layer": "orchestration",
44148
+ "audiences": [
44149
+ "coding-agent",
44150
+ "maintainer",
44151
+ "interactive-user"
44152
+ ],
44153
+ "prerequisites": [
44154
+ "Top-level interactive TUI agent",
44155
+ "One exact unresolved decision",
44156
+ "At least two allowed outcomes",
44157
+ "Caller-supplied admissible evidence"
44158
+ ],
44159
+ "inputs": [
44160
+ "question",
44161
+ "allowed outcomes",
44162
+ "evidence",
44163
+ "optional arguments, decision rules, burden, constituents, and quorum"
44164
+ ],
44165
+ "outputs": [
44166
+ "validated findings",
44167
+ "verdict or held status",
44168
+ "durable receipt"
44169
+ ],
44170
+ "workflow": [
44171
+ {
44172
+ "step": "1",
44173
+ "action": "Confirm that a genuine impasse exists and submit an immutable record with stable evidence and argument IDs.",
44174
+ "expected": "Host admission succeeds and creates a record hash"
44175
+ },
44176
+ {
44177
+ "step": "2",
44178
+ "action": "Frame or validate distinct constituent assignments with explicit evidence subsets.",
44179
+ "expected": "Every admitted evidence item is covered without unknown IDs"
44180
+ },
44181
+ {
44182
+ "step": "3",
44183
+ "action": "Run tools-free constituent assessments in fresh scoped contexts with bounded concurrency.",
44184
+ "expected": "Public findings cite only assigned evidence"
44185
+ },
44186
+ {
44187
+ "step": "4",
44188
+ "action": "Validate findings and require quorum before invoking the judge.",
44189
+ "expected": "Invalid findings cannot create facts or satisfy quorum"
44190
+ },
44191
+ {
44192
+ "step": "5",
44193
+ "action": "Have the judge apply the burden and rules, preserve material dissent, and select an allowed outcome or insufficient_evidence.",
44194
+ "expected": "A host-validated verdict or held case"
44195
+ },
44196
+ {
44197
+ "step": "6",
44198
+ "action": "Inspect the CLI block and durable receipt before acting on the decision.",
44199
+ "expected": "The decision is traceable to the admitted record, validated findings, and receipt hashes"
44200
+ }
44201
+ ],
44202
+ "avoid_when": [
44203
+ "Using adjudication to replace normal judgment, gather evidence, or let a child agent spawn nested panels",
44204
+ "Inferring a REST, daemon direct-call, or Telegram exposure that is not registered"
44205
+ ],
44206
+ "verification": [
44207
+ {
44208
+ "check": "Run pnpm harness:adjudication",
44209
+ "expected": "The deterministic panel overlaps constituent work, streams attributed assessments, synthesizes a verdict, and persists a receipt"
44210
+ },
44211
+ {
44212
+ "check": "Inspect .omnius/adjudications/<case-id>/<run>/receipt.json",
44213
+ "expected": "Hashes, quorum, validation failures, elapsed time, and final status are present"
44214
+ }
44215
+ ],
44216
+ "failure_modes": [
44217
+ {
44218
+ "symptom": "The case is held before judgment",
44219
+ "likely_cause": "The record, framing, findings, or quorum failed host validation",
44220
+ "recovery": "Use receipt validation codes to correct the admissible record; do not guess an outcome"
44221
+ },
44222
+ {
44223
+ "symptom": "A direct REST call is attempted",
44224
+ "likely_cause": "Agent-bound static discovery was confused with direct registry exposure",
44225
+ "recovery": "Invoke through the top-level interactive TUI agent only"
44226
+ }
44227
+ ],
44228
+ "source_of_truth": [
44229
+ "docs/ADJUDICATION.md",
44230
+ "packages/orchestrator/src/adjudication.ts",
44231
+ "packages/cli/src/tui/interactive.ts",
44232
+ "scripts/adjudication-impasse-harness.mjs"
44233
+ ],
44234
+ "related": [
44235
+ "tool.adjudicate",
44236
+ "layer.orchestration",
44237
+ "layer.observability",
44238
+ "module.orchestrator",
44239
+ "guide.adjudication-uppercase"
44240
+ ]
44241
+ },
43988
44242
  {
43989
44243
  "id": "workflow.extend-omnius",
43990
44244
  "kind": "workflow",
package/docs/DISCOVERY.md CHANGED
@@ -403,6 +403,7 @@ Daemon equivalents are `GET /v1/discovery/bootstrap`, `GET /v1/discovery?q=<inte
403
403
 
404
404
  | ID | Title | Summary |
405
405
  | --- | --- | --- |
406
+ | `guide.adjudication-uppercase` | Evidence-bound adjudication | adjudicate resolves a genuine decision impasse. It does not replace normal engineering judgment. It creates a small, tools-free decision environment. It then runs independent constituent assessments and a final judge. |
406
407
  | `guide.agent-memory-index` | Agent Memory Index | Use the Omnius docs skills when an agent needs to explore the documentation corpus instead of loading the whole docs tree. |
407
408
  | `guide.agent-memory-index-uppercase` | Agent-Explorable Documentation | Omnius documentation is exposed to agents through project-local AIWG-style bundles under .aiwg/addons/. |
408
409
  | `guide.architecture-agent-system-map` | Omnius Agent System Map | Use this page when you need to understand how a user-visible behavior travels through Omnius, where its state lives, and which package owns a change. For a specific task recipe, search the generated catalog first: |
@@ -647,6 +648,7 @@ Daemon equivalents are `GET /v1/discovery/bootstrap`, `GET /v1/discovery?q=<inte
647
648
 
648
649
  | ID | Title | Summary |
649
650
  | --- | --- | --- |
651
+ | `tool.adjudicate` | Evidence-bound adjudication | Resolve one genuine decision impasse through an isolated evidence record, independently scoped constituent review, host-validated citations and quorum, a final judge, and a durable verdict receipt. |
650
652
  | `tool.agenda` | Agenda | agenda is a directly callable Omnius tool. |
651
653
  | `tool.agent` | Agent | agent is a directly callable Omnius tool. |
652
654
  | `tool.aiwg-health` | Aiwg Health | aiwg_health is a directly callable Omnius tool. |
@@ -792,6 +794,7 @@ Daemon equivalents are `GET /v1/discovery/bootstrap`, `GET /v1/discovery?q=<inte
792
794
  | `workflow.daemon-tray-update` | Operate daemon, tray, and updates | Ensure one current daemon owns the service port, start the tray against it, install updates through the real global npm flow, stream progress, restart components, and verify the target runtime. |
793
795
  | `workflow.debug-runtime` | Debug an Omnius runtime failure | Diagnose from identity and ownership outward: version, health, port/process, live contract, status/events, state scope, logs/evidence, then the owning module. |
794
796
  | `workflow.direct-tool-call` | Call a directly exposed tool | Inspect live metadata, confirm direct-call exposure and safety, submit the exact schema, and verify the tool result. |
797
+ | `workflow.evidence-bound-adjudication` | Resolve an evidence-bound decision impasse | Admit one exact decision record, isolate constituent review, validate citations and quorum, synthesize a verdict through a final judge, and preserve a durable receipt without granting the panel tools or mutation authority. |
795
798
  | `workflow.extend-omnius` | Extend or modify Omnius safely | Locate the owning layer/module and canonical registry, change the smallest source boundary, update discovery/docs/contracts, and run targeted plus freshness tests. |
796
799
  | `workflow.provider-selection` | Select an inference provider and model | Resolve an explicit provider protocol, credentials, endpoint, and model; verify live reachability and hardware placement for local inference. |
797
800
  | `workflow.publish-package` | Build and publish the Omnius package | Follow the repository Minimal Publish SOP: clean all workspaces, rebuild, bundle publish/, inspect a local-cache tarball, patch-bump, publish only from publish/, and verify npm metadata. |
@@ -9,6 +9,10 @@ Omnius documentation is exposed to agents through project-local AIWG-style bundl
9
9
  | `omnius-docs` | General Omnius docs entrypoint and feature guides |
10
10
  | `omnius-rest-docs` | REST API docs entrypoint and endpoint-family map |
11
11
 
12
+ Evidence-bound decision questions route through `omnius-tools-docs` to
13
+ `docs/ADJUDICATION.md`. The catalog entry is `tool.adjudicate`; the operational
14
+ workflow is `workflow.evidence-bound-adjudication`.
15
+
12
16
  ## Agent Use Pattern
13
17
 
14
18
  1. Run `omnius discover "<need>"` or search `GET /v1/discovery`.
@@ -29,6 +29,7 @@
29
29
  {"intent": "Run a long coding task asynchronously", "query": "long horizon coding REST run poll cancel", "expand": "workflow.async-agent-run"},
30
30
  {"intent": "Understand where state is stored", "query": "project global state sessions memory config", "expand": "store.project"},
31
31
  {"intent": "Use web search", "query": "web search tool exposure agent bound", "expand": "workflow.agent-bound-tools"},
32
+ {"intent": "Resolve an evidence-based decision impasse", "query": "adjudicate impartial evidence quorum verdict", "expand": "workflow.evidence-bound-adjudication"},
32
33
  {"intent": "Debug a stale or unhealthy daemon", "query": "daemon version port logs health debug", "expand": "workflow.debug-runtime"},
33
34
  {"intent": "Add or change Omnius code", "query": "module ownership extend command endpoint tool", "expand": "workflow.extend-omnius"}
34
35
  ],
@@ -109,6 +110,7 @@
109
110
  {"id":"workflow.stateful-chat","kind":"workflow","title":"Use stateful daemon chat","summary":"Create or select a real chat session, send conversational turns, and load its history without treating control commands such as /quit as chats.","aliases":["chat sessions","history"],"keywords":["session","conversation","history"],"maturity":"stable","layer":"memory","audiences":["integrator","service-agent"],"workflow":[{"step":"1","action":"List or create sessions through the documented chat/session routes.","interface":"GET /v1/chats and chat creation route"},{"step":"2","action":"Send user content through POST /v1/chat with the selected session identity.","interface":"POST /v1/chat"},{"step":"3","action":"Load message history when selecting the session and distinguish UI/control events from conversational turns.","expected":"The selected chat displays its saved conversation"}],"verification":[{"check":"Reload the selected session","expected":"History is restored and control-only commands are absent from the chat list"}],"failure_modes":[{"symptom":"Chats named quit or duplicate Last task summaries appear","likely_cause":"Control/task metadata was projected as a chat session","recovery":"Use the canonical session registry and filter non-conversational control records"}],"source_of_truth":["packages/cli/src/api/chat-session.ts","packages/cli/src/api/session-summary.ts","packages/cli/src/api/web-ui.ts"]},
110
111
  {"id":"workflow.direct-tool-call","kind":"workflow","title":"Call a directly exposed tool","summary":"Inspect live metadata, confirm direct-call exposure and safety, submit the exact schema, and verify the tool result.","aliases":["tool REST call"],"keywords":["direct_callable","schema"],"maturity":"stable","layer":"execution","audiences":["integrator","service-agent"],"workflow":[{"step":"1","action":"Inspect the tool metadata and direct_callable flag.","interface":"GET /v1/tools/{name}","expected":"A rest-call interface is explicitly present"},{"step":"2","action":"Validate arguments against the returned parameter schema and call the exact route.","interface":"POST /v1/tools/{name}/call"},{"step":"3","action":"Inspect the structured output and any side effects.","expected":"Tool-specific verified result"}],"avoid_when":["The tool is agent-bound, unavailable, profile-gated, or lacks a rest-call interface"],"verification":[{"check":"Metadata, schema, and result all agree","expected":"No inferred route or unvalidated arguments"}],"failure_modes":[{"symptom":"Direct call returns not found or not callable","likely_cause":"The route was inferred or live exposure changed","recovery":"Re-read GET /v1/tools/{name}; use an agent-bound workflow when no rest-call interface exists"}],"source_of_truth":["packages/cli/src/api/direct-tool-registry.ts","packages/execution/src/tools/tool-manifest.ts"]},
111
112
  {"id":"workflow.agent-bound-tools","kind":"workflow","title":"Use agent-bound tools such as web_search","summary":"Offer a non-direct tool to an Omnius agent loop through run/chat instead of inventing a direct REST call.","aliases":["web search","daemon tools"],"keywords":["agent loop","web_search","tool exposure"],"maturity":"stable","layer":"execution","audiences":["integrator","coding-agent"],"workflow":[{"step":"1","action":"Inspect live tool metadata, security classification, availability, and schema.","interface":"GET /v1/tools/web_search"},{"step":"2","action":"Offer the tool through an agent-capable surface and a compatible tool profile.","interface":"POST /v1/run or POST /v1/chat/completions with agent_loop=true"},{"step":"3","action":"Require source/provenance verification appropriate to the research task.","expected":"The agent executes the bound tool and returns evidence"}],"avoid_when":["Calling POST /v1/tools/web_search/call unless live metadata explicitly adds direct exposure"],"verification":[{"check":"Inspect run/chat tool events and returned source evidence","expected":"The intended tool actually ran and its claims are traceable"}],"failure_modes":[{"symptom":"Direct tool URL is missing","likely_cause":"The tool is intentionally agent-bound","recovery":"Use /v1/run or agent-loop chat with the tool offered"}],"source_of_truth":["docs/guides/tools-and-web-search.md","packages/execution/src/tools/web-search.ts"]},
113
+ {"id":"workflow.evidence-bound-adjudication","kind":"workflow","title":"Resolve an evidence-bound decision impasse","summary":"Admit one exact decision record, isolate constituent review, validate citations and quorum, synthesize a verdict through a final judge, and preserve a durable receipt without granting the panel tools or mutation authority.","aliases":["adjudicate impasse","impartial review","decision court","constituent panel"],"keywords":["evidence","arguments","quorum","judge","verdict","dissent","receipt"],"maturity":"stable","layer":"orchestration","audiences":["coding-agent","maintainer","interactive-user"],"prerequisites":["Top-level interactive TUI agent","One exact unresolved decision","At least two allowed outcomes","Caller-supplied admissible evidence"],"inputs":["question","allowed outcomes","evidence","optional arguments, decision rules, burden, constituents, and quorum"],"outputs":["validated findings","verdict or held status","durable receipt"],"workflow":[{"step":"1","action":"Confirm that a genuine impasse exists and submit an immutable record with stable evidence and argument IDs.","expected":"Host admission succeeds and creates a record hash"},{"step":"2","action":"Frame or validate distinct constituent assignments with explicit evidence subsets.","expected":"Every admitted evidence item is covered without unknown IDs"},{"step":"3","action":"Run tools-free constituent assessments in fresh scoped contexts with bounded concurrency.","expected":"Public findings cite only assigned evidence"},{"step":"4","action":"Validate findings and require quorum before invoking the judge.","expected":"Invalid findings cannot create facts or satisfy quorum"},{"step":"5","action":"Have the judge apply the burden and rules, preserve material dissent, and select an allowed outcome or insufficient_evidence.","expected":"A host-validated verdict or held case"},{"step":"6","action":"Inspect the CLI block and durable receipt before acting on the decision.","expected":"The decision is traceable to the admitted record, validated findings, and receipt hashes"}],"avoid_when":["Using adjudication to replace normal judgment, gather evidence, or let a child agent spawn nested panels","Inferring a REST, daemon direct-call, or Telegram exposure that is not registered"],"verification":[{"check":"Run pnpm harness:adjudication","expected":"The deterministic panel overlaps constituent work, streams attributed assessments, synthesizes a verdict, and persists a receipt"},{"check":"Inspect .omnius/adjudications/<case-id>/<run>/receipt.json","expected":"Hashes, quorum, validation failures, elapsed time, and final status are present"}],"failure_modes":[{"symptom":"The case is held before judgment","likely_cause":"The record, framing, findings, or quorum failed host validation","recovery":"Use receipt validation codes to correct the admissible record; do not guess an outcome"},{"symptom":"A direct REST call is attempted","likely_cause":"Agent-bound static discovery was confused with direct registry exposure","recovery":"Invoke through the top-level interactive TUI agent only"}],"source_of_truth":["docs/ADJUDICATION.md","packages/orchestrator/src/adjudication.ts","packages/cli/src/tui/interactive.ts","scripts/adjudication-impasse-harness.mjs"],"related":["tool.adjudicate","layer.orchestration","layer.observability","module.orchestrator","guide.adjudication-uppercase"]},
112
114
  {"id":"workflow.provider-selection","kind":"workflow","title":"Select an inference provider and model","summary":"Resolve an explicit provider protocol, credentials, endpoint, and model; verify live reachability and hardware placement for local inference.","aliases":["BYOI","model selection"],"keywords":["provider","endpoint","protocol"],"maturity":"stable","layer":"inference","audiences":["operator","integrator","coding-agent"],"workflow":[{"step":"1","action":"Discover and expand the provider descriptor; do not infer protocol from a label or API key."},{"step":"2","action":"Configure endpoint/protocol/credential using the documented scope."},{"step":"3","action":"For local model work, perform the required hardware preflight before any token-generating request."},{"step":"4","action":"Verify the selected provider and exact model through live metadata."}],"verification":[{"check":"Live model/provider status matches the intended endpoint, protocol, and hardware","expected":"No silent fallback"}],"failure_modes":[{"symptom":"Model listing works but inference fails or uses the wrong protocol","likely_cause":"Endpoint display label was used instead of the provider descriptor","recovery":"Resolve the stable provider ID/protocol and re-test the exact endpoint before execution"}],"source_of_truth":["packages/backend-vllm/src/providerRegistry.ts","docs/guides/bring-your-own-inference.md"]},
113
115
  {"id":"workflow.voice-asr-tts","kind":"workflow","title":"Select and use ASR/TTS engines","summary":"Discover installed and supported ASR/TTS systems, perform managed setup when needed, activate one exact engine/model/device, and use the documented REST or TUI surface.","aliases":["speech","voice engines"],"keywords":["ASR","TTS","VibeVoice","transcribe_cli","LuxTTS"],"maturity":"stable","layer":"media","audiences":["integrator","operator","user"],"workflow":[{"step":"1","action":"List engines/models and inspect status before activation.","interface":"GET /v1/asr/engines; GET /v1/asr/status; voice model routes"},{"step":"2","action":"Run explicit managed setup for missing runtimes/weights and an exact accelerator when required."},{"step":"3","action":"Activate the selected engine/model and verify active status."},{"step":"4","action":"Transcribe or synthesize through the OpenAPI-documented route and validate the output artifact."}],"verification":[{"check":"Status reports the requested active engine/model/device and a small non-live test succeeds","expected":"No interpreter override or fallback to a different engine"}],"failure_modes":[{"symptom":"transcribe_cli is missing although a managed environment exists","likely_cause":"TRANSCRIBE_PYTHON points at an older Whisper environment","recovery":"Use the canonical managed transcribe runtime selection and re-check ASR status"}],"source_of_truth":["packages/execution/src/asr/registry.ts","packages/execution/src/transcribe-python-runtime.ts","packages/cli/src/api/voice-runtime.ts"]},
114
116
  {"id":"workflow.daemon-tray-update","kind":"workflow","title":"Operate daemon, tray, and updates","summary":"Ensure one current daemon owns the service port, start the tray against it, install updates through the real global npm flow, stream progress, restart components, and verify the target runtime.","aliases":["update Omnius","indicator update"],"keywords":["npm global","restart","version"],"maturity":"stable","layer":"operations","audiences":["operator","coding-agent"],"workflow":[{"step":"1","action":"Read installed and running identities from /version; diagnose port ownership before restart."},{"step":"2","action":"Start/reclaim the daemon through its managed lifecycle and confirm health."},{"step":"3","action":"Start the indicator and require daemon-online state before enabling service actions."},{"step":"4","action":"Run the update service, stream its live progress, restart the daemon/indicator, and compare /version with the target."}],"verification":[{"check":"Installed package, daemon /version, and indicator version all equal the update target","expected":"Verified target runtime, not merely queued or process-started"}],"failure_modes":[{"symptom":"UI remains on updating/queued","likely_cause":"The update worker was never executed or progress was not connected","recovery":"Inspect update job status/log stream and fail explicitly if no worker owns it"},{"symptom":"Restart verification fails","likely_cause":"Old daemon retained port ownership or new runtime did not become ready","recovery":"Resolve exact port PID, preserve unrelated processes, restart, then verify /health and /version"}],"source_of_truth":["packages/cli/src/update-service.ts","packages/cli/src/update-worker.ts","packages/cli/src/daemon.ts","packages/cli/src/tray.ts"]},