@polderlabs/bizar-omp 0.8.1 → 0.9.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 +284 -338
- package/dist/cli/doctor.d.ts +4 -4
- package/dist/core/types.d.ts +29 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/extension.d.ts.map +1 -1
- package/dist/extension.js +47 -11
- package/dist/extension.js.map +1 -1
- package/dist/omp/compatibility.d.ts +15 -5
- package/dist/omp/compatibility.d.ts.map +1 -1
- package/dist/omp/compatibility.js +12 -2
- package/dist/omp/compatibility.js.map +1 -1
- package/dist/omp/dispatch-lifecycle.d.ts +14 -0
- package/dist/omp/dispatch-lifecycle.d.ts.map +1 -1
- package/dist/omp/dispatch-lifecycle.js +10 -1
- package/dist/omp/dispatch-lifecycle.js.map +1 -1
- package/dist/omp/omb-sessions.d.ts +8 -1
- package/dist/omp/omb-sessions.d.ts.map +1 -1
- package/dist/omp/omb-sessions.js +20 -17
- package/dist/omp/omb-sessions.js.map +1 -1
- package/dist/omp/rpc.d.ts +3 -0
- package/dist/omp/rpc.d.ts.map +1 -1
- package/dist/omp/session-ownership.d.ts +64 -0
- package/dist/omp/session-ownership.d.ts.map +1 -0
- package/dist/omp/session-ownership.js +269 -0
- package/dist/omp/session-ownership.js.map +1 -0
- package/dist/omp/task-model-selector.d.ts +58 -0
- package/dist/omp/task-model-selector.d.ts.map +1 -0
- package/dist/omp/task-model-selector.js +144 -0
- package/dist/omp/task-model-selector.js.map +1 -0
- package/dist/scripts/emit-compatibility-receipt.js +13 -3
- package/dist/scripts/emit-compatibility-receipt.js.map +1 -1
- package/docs/assets/bizar-omp-banner.svg +51 -18
- package/docs/compatibility/baseline.json +9 -8
- package/docs/compatibility/supported-surfaces.json +11 -3
- package/docs/releases/0.9.0.md +35 -0
- package/docs/releases/support-matrix.md +1 -1
- package/package.json +1 -1
- package/skills/omp-native-development/SKILL.md +5 -3
- package/skills/omp-native-development/assets/tests/acceptance-matrix.json +417 -0
- package/skills/omp-native-development/references/accuracy-and-versioning.md +1 -1
- package/skills/omp-native-development/references/bizar-integration-contract.md +1 -1
- package/skills/omp-native-development/references/developer-handoff.md +3 -1
- package/skills/omp-native-development/references/execution-and-lifecycle.md +4 -0
- package/skills/omp-native-development/references/native-validation-matrix.md +25 -0
- package/skills/omp-native-development/references/sessions-sdk-rpc.md +17 -0
- package/skills/omp-native-development/references/settings-providers-security.md +11 -0
- package/skills/omp-native-development/references/source-manifest.json +20 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"researchDate": "2026-10-
|
|
3
|
+
"researchDate": "2026-10-05",
|
|
4
4
|
"bizarReference": {
|
|
5
5
|
"repository": "../BizarHarness",
|
|
6
6
|
"commit": "e13aa131bdcd368548118464f0da1bace302e64b",
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
},
|
|
9
9
|
"omp": {
|
|
10
10
|
"repository": "https://github.com/can1357/oh-my-pi",
|
|
11
|
-
"testedVersion": "18.
|
|
12
|
-
"testedCommit": "
|
|
11
|
+
"testedVersion": "18.6.1",
|
|
12
|
+
"testedCommit": "2a2c6dcbbb558c0f8145f67f28b3370984f2bf60",
|
|
13
13
|
"previouslyQualifiedVersions": [
|
|
14
14
|
"18.2.4",
|
|
15
15
|
"18.2.5",
|
|
@@ -21,12 +21,13 @@
|
|
|
21
21
|
"18.3.2",
|
|
22
22
|
"18.4.1",
|
|
23
23
|
"18.4.2",
|
|
24
|
-
"18.4.4"
|
|
24
|
+
"18.4.4",
|
|
25
|
+
"18.4.8"
|
|
25
26
|
],
|
|
26
27
|
"researchedMainCommit": "dbf3afad4894bde827d90f965e77b3fe1c5a95e5",
|
|
27
|
-
"releaseVersionSeenInResearch": "18.
|
|
28
|
-
"releaseCommitSeenInResearch": "
|
|
29
|
-
"qualification": "The npm package was tested at 18.
|
|
28
|
+
"releaseVersionSeenInResearch": "18.6.1",
|
|
29
|
+
"releaseCommitSeenInResearch": "2a2c6dcbbb558c0f8145f67f28b3370984f2bf60",
|
|
30
|
+
"qualification": "The npm package was tested at 18.6.1 with integrity sha512-UZoZWYUfflDgd0HVDP12X8r4hiYSps7XMf96U7o8ScThAuw6OoI+zBBIypRfTQnzg0QJljpchpa7i0xqCNyXcA==; 18.4.8 remains a separately qualified compatibility version. Package version alone does not prove source commit identity."
|
|
30
31
|
},
|
|
31
32
|
"bun": {
|
|
32
33
|
"minimum": "1.3.14",
|
|
@@ -34,7 +35,7 @@
|
|
|
34
35
|
},
|
|
35
36
|
"package": {
|
|
36
37
|
"name": "@polderlabs/bizar-omp",
|
|
37
|
-
"version": "0.
|
|
38
|
+
"version": "0.9.0",
|
|
38
39
|
"integrity": "computed by npm pack in CI",
|
|
39
40
|
"extensionEntry": "dist/extension.js"
|
|
40
41
|
}
|
|
@@ -12,10 +12,16 @@
|
|
|
12
12
|
"validated journal v2 and authorized torn-tail recovery",
|
|
13
13
|
"durable managed-resource registry with preview-first cleanup",
|
|
14
14
|
"offline evidence bundle export",
|
|
15
|
-
"dry-run migration"
|
|
15
|
+
"dry-run migration",
|
|
16
|
+
"managed native task admission gate (isolation, packaged specialists, per-call model selector)",
|
|
17
|
+
"dispatch routing provenance separating requested selector from host-resolved model, effort and fallback",
|
|
18
|
+
"OMB session ownership keyed on the native session id, taking OMP's own lease where the runtime exposes one",
|
|
19
|
+
"native per-subagent cancel and steer over RPC, scoped to the session's own subagent registry",
|
|
20
|
+
"RPC session fork with identity refresh from get_state"
|
|
16
21
|
],
|
|
17
22
|
"qualified": [
|
|
18
|
-
"OMP 18.
|
|
23
|
+
"OMP 18.6.1 / release commit 2a2c6dcbbb558c0f8145f67f28b3370984f2bf60",
|
|
24
|
+
"OMP 18.4.8 compatibility regression",
|
|
19
25
|
"OMP 18.4.4 compatibility regression",
|
|
20
26
|
"OMP 18.4.2 compatibility regression",
|
|
21
27
|
"OMP 18.4.1 compatibility regression",
|
|
@@ -34,7 +40,9 @@
|
|
|
34
40
|
"OS sandboxing",
|
|
35
41
|
"provider model quality",
|
|
36
42
|
"automatic application of worker changes",
|
|
37
|
-
"
|
|
43
|
+
"eval interception under the managed task gate",
|
|
44
|
+
"native per-child revival of a parked or finished background agent; cancel and steer are supported",
|
|
45
|
+
"OMP-native session-id ownership lease on any runtime below OMP 18.5.0",
|
|
38
46
|
"automatic cleanup of unqualified native isolation backends",
|
|
39
47
|
"live task/eval child completion without a host OMP session",
|
|
40
48
|
"Claude Code/AO compatibility"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
## Improvements
|
|
2
|
+
|
|
3
|
+
- Admit a native `task` call's per-call `model` selector instead of dropping it, and record requested routing beside what OMP actually resolved: the journal now separates specialist identity, requested selectors, effort, resolved model/identity/thinking level and native fallback, and a bare `agent_end` is never read as a route change (#204).
|
|
4
|
+
- Key OMB session ownership on the journal's native session id and take OMP's own session lease through its exported API when the installed runtime exposes one, so a plain `omp` process holding a conversation blocks delete, migrate and resume instead of only another OMB process (#204).
|
|
5
|
+
- Correct the bundled OMP development guidance, which told implementers the per-call `model` field did not exist, to the 18.5 selector contract and precedence, and document the `task.completionProbe` migration and session-id-keyed ownership (#204).
|
|
6
|
+
- Correct the mobile RPC contract: `prompt_result` now carries `status`, a sanitized `error` and `sessionSettled`, `agent_end` carries `yielded`/`awaitingAsyncWork`, and `session_settled` is documented as the authoritative quiescence signal that already existed at 18.5.0 (#204).
|
|
7
|
+
- Record OMP 18.5.0 as an explicit unqualified compatibility target with its tag commit and npm integrity, rather than implying support it had not earned. That record is retired in this change: 18.6.1 postdates it and is qualified on a real runtime instead (#204).
|
|
8
|
+
- Let the mobile host cancel or steer a single subagent, and fork a session, over native RPC. The id must already appear in this session's own subagent registry, so no arbitrary session or path can be named; cancelling or steering one child never becomes parent input; reviving a child is refused because OMP exposes no native equivalent. A fork moves the process to a different journal, so the host re-reads `get_state` and answers with the refreshed identity rather than the stale one (#204).
|
|
9
|
+
- Rebuild the Android companion UI from scratch: four tabs (Home, Agents, Tools, More) over a shared design system, with the agent conversation pushed from an agent row instead of occupying a tab of its own. The palette moves from a pink accent to a single blue, the component set moves into `src/ui/kit`, and every screen derives its rows from one tested view model rather than re-deriving status inline (#205).
|
|
10
|
+
- Give the Tools screen a capability-backed catalogue, so an *Available* badge always corresponds to a request the app can actually make. `session.directBash` is deliberately absent, matching the control-surface rule in `capabilityGates.ts`, and a test asserts the serialised catalogue stays free of it (#205).
|
|
11
|
+
|
|
12
|
+
## Bug Fixes
|
|
13
|
+
|
|
14
|
+
- Refuse a batch-container `task` `model` instead of letting it through unobserved, and reject the ambiguous `default`/`inherit` literals, blank selectors and empty selector lists at admission so no dispatch is journaled for work that cannot run (#204).
|
|
15
|
+
- Stop a brand-new session from being shut down when its journal has no session header yet; ownership is now refused for mutation only, where a journal's identity has to be established (#204).
|
|
16
|
+
- Claim one session lease for a whole legacy-journal migration instead of colliding with itself on the staged copy, which session-id keying would otherwise treat as a second writer (#204).
|
|
17
|
+
- Make `session.subagentAction` work on the RPC path instead of always answering `capability_unavailable`. The request existed and was dispatched, but the RPC controller only declared the hook as optional and never implemented it, so the actions worked over collab and silently failed over RPC (#204).
|
|
18
|
+
- Release the native session lease through its handle rather than an unbound copy of `release`. OMP's `FileLock.release` reaches a native exclusive reference through `this`, so the stored method reference threw `Failed to unwrap exclusive reference of FileLock` instead of releasing. Only a real runtime surfaces this — the existing stub was an arrow function and could not.
|
|
19
|
+
- Stop the scheduled OMP compatibility watch failing on every run. The update script rewrote the outgoing baseline *out of* the README's accepted-versions row, where it has to be retained as a previously qualified release, and `install.test.ts` asserted a hardcoded version literal the watch had already rewritten. Both are now derived from the qualified list, so an automated bump can go green.
|
|
20
|
+
- Make `npm run verify:omp` prove something about the version it names. It read metadata from `BIZAR_OMP_PACKAGE_ROOT` but executed whatever `omp` was on `PATH`, so a run could exercise a different OMP release than it reported. The binary now derives from the package root, and the run asserts the two agree.
|
|
21
|
+
- Retire a recorded unqualified target once a newer baseline supersedes it, so `UNQUALIFIED_OMP_TARGET` and `baseline.omp.unqualifiedTarget` cannot keep claiming a release is pending beside a qualified baseline that postdates it.
|
|
22
|
+
- Declare additive capability flags optional in `HostCapabilityFlags`, so adding one stops breaking every consumer that spells out a flag set, and correct the schema comment that claimed the set was strictly non-additive while five of its fields were optional.
|
|
23
|
+
- Regenerate the compatibility receipt after the watch applies new OMP metadata. The receipt embeds the qualified version and commit, so `verify:package` failed on a stale receipt one step *after* the update script ran: the watch could not have gone green even with the other fixes in place.
|
|
24
|
+
- Qualify the lease-bearing baseline and the newest release without it on every CI run, not only on releases. A single-version PR matrix left the fallback that serves the older advertised versions unproven on the exact change most likely to break it.
|
|
25
|
+
|
|
26
|
+
**OMP 18.6.1 is qualified.** `npm run verify:omp` ran against the real
|
|
27
|
+
`@oh-my-pi/pi-coding-agent@18.6.1` npm package (release commit
|
|
28
|
+
`2a2c6dcbbb558c0f8145f67f28b3370984f2bf60`) and passed: packed install, repeat
|
|
29
|
+
install, native extension discovery (18 tools, 8 agents, 8 skills), the
|
|
30
|
+
session-id-keyed ownership lease, and profile isolation. This is the first
|
|
31
|
+
native execution of the session-lease path introduced in #204, and it found a
|
|
32
|
+
real defect — the lease's `release` was stored unbound and threw on OMP's
|
|
33
|
+
native `FileLock`. 18.5.0 is **not** qualified: it is superseded by this
|
|
34
|
+
baseline, so its unqualified-target record is retired rather than left claiming
|
|
35
|
+
a release was still pending beside a newer qualified one.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
| --- | --- |
|
|
5
5
|
| Node | 22.x and 24.x in CI |
|
|
6
6
|
| Bun | 1.3.14 compatibility job |
|
|
7
|
-
| OMP | 18.
|
|
7
|
+
| OMP | 18.6.1 at release commit `2a2c6dcbbb558c0f8145f67f28b3370984f2bf60`; 18.4.8 remains regression-qualified |
|
|
8
8
|
| Install | `npx --yes @polderlabs/bizar-omp setup` is the supported full install; `omp plugin install <package-spec>` is extension-only and `omp plugin link <checkout>` is for development |
|
|
9
9
|
| Security | Trusted in-process extension; native task isolation required for managed editing |
|
|
10
10
|
| Workflow state | Journal v2 validation, candidate-bound acceptance, bounded inspection/projection, and offline evidence bundles are locally qualified; v1 state remains legacy input |
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@ Treat this skill as a source-grounded engineering procedure, not an assertion of
|
|
|
9
9
|
|
|
10
10
|
## Establish the target before implementing
|
|
11
11
|
|
|
12
|
-
Read [accuracy-and-versioning.md](references/accuracy-and-versioning.md) first. The current qualification target is `can1357/oh-my-pi` v18.
|
|
12
|
+
Read [accuracy-and-versioning.md](references/accuracy-and-versioning.md) first. The current qualification target is `can1357/oh-my-pi` v18.6.1 at commit `2a2c6dcbbb558c0f8145f67f28b3370984f2bf60`. Earlier accepted runtimes are listed in the repository compatibility baseline; this bundled research corpus retains source fingerprints for v18.2.6, v18.2.5, and v18.2.4 only. The bundled research corpus remains pinned to main commit `dbf3afad4894bde827d90f965e77b3fe1c5a95e5`, dated 2026-09-17, and must not be presented as the current release source.
|
|
13
13
|
|
|
14
14
|
Record the developer's actual OMP package version, lockfile/integrity, source commit when available, Bun version, execution mode, profile, cwd, and relevant settings. Never print secrets. Verify the exact exports and behavior of that target, rather than assuming these snapshots apply unchanged. A missing environment or unrun test means UNKNOWN or NOT RUN, never PASS.
|
|
15
15
|
|
|
@@ -50,8 +50,10 @@ For a feature, inspect its documentation, exported types, implementation callsit
|
|
|
50
50
|
Read [agent-and-model-roles.md](references/agent-and-model-roles.md) before modifying any routing or worker definition. Apply all of these constraints:
|
|
51
51
|
|
|
52
52
|
1. Distinguish agent type, spawned agent ID, model role, concrete model, thinking effort, provider service tier, and transport. Never substitute one for another.
|
|
53
|
-
2. Use native custom-agent frontmatter and exact-name dispatch.
|
|
54
|
-
3. Preserve native resolution precedence: agent-specific configured overrides, role-backed
|
|
53
|
+
2. Use native custom-agent frontmatter and exact-name dispatch. A per-item `model` selector is public and carries the highest native precedence; preserve it end to end instead of dropping it, and never infer a public eval API from internal request types.
|
|
54
|
+
3. Preserve native resolution precedence: the per-call `model` selector, then agent-specific configured overrides (`task.agentModelOverrides[agentName]`), then the agent definition's own `model`, then role-backed defaults and native inheritance/fallback. Re-read effective configuration through native execution paths.
|
|
55
|
+
|
|
56
|
+
The per-call selector accepts one `provider/model[:level]` pattern, a role alias such as `@bizar_build`, or an ordered array of them, and order is the caller's stated preference. Native preflight refuses a batch-container `model` rather than dropping it, so put it on each `tasks[]` item. A bare `default` or `inherit` literal is ambiguous and refused; `@default` is how a caller inherits the parent session's model. Whether a concrete selector matches an available model, whether its `:level` suffix is valid, and whether it has usable credentials are all host preflight decisions that need OMP's model catalog: do not re-decide them, and never let a credential-less request silently fall back to the parent model. Registered literal ids that end in `:max` or another suffix are still model ids, so do not split a selector on `:`.
|
|
55
57
|
4. At the pinned revision, built-in model roles are `default`, `smol`, `slow`, `vision`, `plan`, `commit`, `tiny`, `task`, `advisor`. Support arbitrary configured custom roles. Do not hard-code obsolete role names as built-ins.
|
|
56
58
|
5. Preserve aliases until native resolution. `@role` is canonical; `pi/role` is a supported legacy form and `*` denotes the default role. Use the native parser for suffixes and provider IDs; naive splitting on `:` or `@` corrupts valid selectors.
|
|
57
59
|
6. Preserve role identity alongside expanded patterns. Native retry fallback can depend on the original role. Record requested role AND actual resolved model, including subsequent changes.
|
|
@@ -797,6 +797,423 @@
|
|
|
797
797
|
"docs/extensions.md",
|
|
798
798
|
"docs/approval-mode.md"
|
|
799
799
|
]
|
|
800
|
+
},
|
|
801
|
+
{
|
|
802
|
+
"id": "M01",
|
|
803
|
+
"area": "Roles",
|
|
804
|
+
"scenario": "No explicit model selector",
|
|
805
|
+
"required_outcome": "Specialist frontmatter and exact-agent override stay authoritative; the journal records that no per-call override was requested.",
|
|
806
|
+
"status": "NOT_RUN",
|
|
807
|
+
"qualification": "Host-level: dispatch records requestedModelSelectors: [] and routingSource specialist-default. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
808
|
+
"source_paths": [
|
|
809
|
+
"docs/tools/task.md",
|
|
810
|
+
"docs/model-roles.md"
|
|
811
|
+
]
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
"id": "M02",
|
|
815
|
+
"area": "Roles",
|
|
816
|
+
"scenario": "Role-alias selector",
|
|
817
|
+
"required_outcome": "A requested role alias is visible to admission and journaled separately from the resolved model.",
|
|
818
|
+
"status": "NOT_RUN",
|
|
819
|
+
"qualification": "Host-level: selector journaled verbatim, resolved model recorded apart. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
820
|
+
"source_paths": [
|
|
821
|
+
"docs/tools/task.md",
|
|
822
|
+
"docs/model-roles.md"
|
|
823
|
+
]
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
"id": "M03",
|
|
827
|
+
"area": "Roles",
|
|
828
|
+
"scenario": "Concrete selector with effort suffix",
|
|
829
|
+
"required_outcome": "The host parses provider and suffix; Bizar neither splits nor re-resolves them.",
|
|
830
|
+
"status": "NOT_RUN",
|
|
831
|
+
"qualification": "Host-level: selector passed through untouched. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
832
|
+
"source_paths": [
|
|
833
|
+
"docs/tools/task.md",
|
|
834
|
+
"docs/model-roles.md"
|
|
835
|
+
]
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
"id": "M04",
|
|
839
|
+
"area": "Roles",
|
|
840
|
+
"scenario": "Ordered selector list",
|
|
841
|
+
"required_outcome": "Caller order is preserved and the whole list is journaled, not only the winner.",
|
|
842
|
+
"status": "NOT_RUN",
|
|
843
|
+
"qualification": "Host-level: order preserved in the journal. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
844
|
+
"source_paths": [
|
|
845
|
+
"docs/tools/task.md",
|
|
846
|
+
"docs/model-roles.md"
|
|
847
|
+
]
|
|
848
|
+
},
|
|
849
|
+
{
|
|
850
|
+
"id": "M05",
|
|
851
|
+
"area": "Roles",
|
|
852
|
+
"scenario": "Ambiguous default/inherit literals",
|
|
853
|
+
"required_outcome": "Preflight refuses; Bizar surfaces the refusal and does not journal it as settled work.",
|
|
854
|
+
"status": "NOT_RUN",
|
|
855
|
+
"qualification": "Host-level: refused at admission with no dispatch journaled. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
856
|
+
"source_paths": [
|
|
857
|
+
"docs/tools/task.md",
|
|
858
|
+
"docs/model-roles.md"
|
|
859
|
+
]
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
"id": "M06",
|
|
863
|
+
"area": "Roles",
|
|
864
|
+
"scenario": "Blank or empty selector list",
|
|
865
|
+
"required_outcome": "Preflight refusal; nothing admitted.",
|
|
866
|
+
"status": "NOT_RUN",
|
|
867
|
+
"qualification": "Host-level: blank, separator-only and empty-list selectors refused. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
868
|
+
"source_paths": [
|
|
869
|
+
"docs/tools/task.md",
|
|
870
|
+
"docs/model-roles.md"
|
|
871
|
+
]
|
|
872
|
+
},
|
|
873
|
+
{
|
|
874
|
+
"id": "M07",
|
|
875
|
+
"area": "Roles",
|
|
876
|
+
"scenario": "Invalid thinking suffix",
|
|
877
|
+
"required_outcome": "Preflight refusal.",
|
|
878
|
+
"status": "NOT_RUN",
|
|
879
|
+
"qualification": "NOT RUN: suffix validity needs OMP's model catalog; Bizar deliberately does not re-decide it. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
880
|
+
"source_paths": [
|
|
881
|
+
"docs/tools/task.md",
|
|
882
|
+
"docs/model-roles.md"
|
|
883
|
+
]
|
|
884
|
+
},
|
|
885
|
+
{
|
|
886
|
+
"id": "M08",
|
|
887
|
+
"area": "Roles",
|
|
888
|
+
"scenario": "Selector matching no available model",
|
|
889
|
+
"required_outcome": "Preflight refusal.",
|
|
890
|
+
"status": "NOT_RUN",
|
|
891
|
+
"qualification": "NOT RUN: requires the live model catalog. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
892
|
+
"source_paths": [
|
|
893
|
+
"docs/tools/task.md",
|
|
894
|
+
"docs/model-roles.md"
|
|
895
|
+
]
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
"id": "M09",
|
|
899
|
+
"area": "Roles",
|
|
900
|
+
"scenario": "Selector without usable credentials",
|
|
901
|
+
"required_outcome": "Spawn fails; no silent substitution to the parent model.",
|
|
902
|
+
"status": "NOT_RUN",
|
|
903
|
+
"qualification": "NOT RUN: requires real credentials and the host preflight. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
904
|
+
"source_paths": [
|
|
905
|
+
"docs/tools/task.md",
|
|
906
|
+
"docs/model-roles.md"
|
|
907
|
+
]
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
"id": "M10",
|
|
911
|
+
"area": "Roles",
|
|
912
|
+
"scenario": "Batch-container model",
|
|
913
|
+
"required_outcome": "Rejected rather than dropped.",
|
|
914
|
+
"status": "NOT_RUN",
|
|
915
|
+
"qualification": "Host-level: refused with an explicit compatibility error; the gate's outer catch would otherwise fail open. Host-level unit coverage exists (tests/omp-contract.test.ts); the native runtime scenario was NOT executed, so this is not a native pass.",
|
|
916
|
+
"source_paths": [
|
|
917
|
+
"docs/tools/task.md"
|
|
918
|
+
]
|
|
919
|
+
},
|
|
920
|
+
{
|
|
921
|
+
"id": "M11",
|
|
922
|
+
"area": "Roles",
|
|
923
|
+
"scenario": "Per-call selector precedence",
|
|
924
|
+
"required_outcome": "Per-call selector wins over task.agentModelOverrides and frontmatter.",
|
|
925
|
+
"status": "NOT_RUN",
|
|
926
|
+
"qualification": "NOT RUN: precedence is host-resolved. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
927
|
+
"source_paths": [
|
|
928
|
+
"docs/tools/task.md",
|
|
929
|
+
"docs/model-roles.md"
|
|
930
|
+
]
|
|
931
|
+
},
|
|
932
|
+
{
|
|
933
|
+
"id": "M12",
|
|
934
|
+
"area": "Roles",
|
|
935
|
+
"scenario": "Exact-agent override precedence",
|
|
936
|
+
"required_outcome": "task.agentModelOverrides wins over frontmatter.",
|
|
937
|
+
"status": "NOT_RUN",
|
|
938
|
+
"qualification": "NOT RUN: host-resolved. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
939
|
+
"source_paths": [
|
|
940
|
+
"docs/tools/task.md",
|
|
941
|
+
"docs/model-roles.md"
|
|
942
|
+
]
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
"id": "M13",
|
|
946
|
+
"area": "Roles",
|
|
947
|
+
"scenario": "Frontmatter precedence",
|
|
948
|
+
"required_outcome": "Specialist frontmatter wins when no selector and no exact-agent override exist.",
|
|
949
|
+
"status": "NOT_RUN",
|
|
950
|
+
"qualification": "NOT RUN: host-resolved. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
951
|
+
"source_paths": [
|
|
952
|
+
"docs/tools/task.md",
|
|
953
|
+
"docs/model-roles.md"
|
|
954
|
+
]
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"id": "M14",
|
|
958
|
+
"area": "Roles",
|
|
959
|
+
"scenario": "Inherited effort with a default selector",
|
|
960
|
+
"required_outcome": "Child receives the native inherited route and effort unless a higher-precedence source exists.",
|
|
961
|
+
"status": "NOT_RUN",
|
|
962
|
+
"qualification": "NOT RUN: requires a live session. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
963
|
+
"source_paths": [
|
|
964
|
+
"docs/tools/task.md",
|
|
965
|
+
"docs/model-roles.md"
|
|
966
|
+
]
|
|
967
|
+
},
|
|
968
|
+
{
|
|
969
|
+
"id": "M15",
|
|
970
|
+
"area": "Roles",
|
|
971
|
+
"scenario": "Fallback provenance",
|
|
972
|
+
"required_outcome": "Requested selector, selected model, fallback transition and final model stay distinguishable.",
|
|
973
|
+
"status": "NOT_RUN",
|
|
974
|
+
"qualification": "Host-level: observedRouting records resolvedModel, resolvedModelIsFallback and resolvedModelRoute separately from the requested selector. Host-level unit coverage exists (tests/omp-contract.test.ts); the native runtime scenario was NOT executed, so this is not a native pass.",
|
|
975
|
+
"source_paths": [
|
|
976
|
+
"docs/tools/task.md"
|
|
977
|
+
]
|
|
978
|
+
},
|
|
979
|
+
{
|
|
980
|
+
"id": "M16",
|
|
981
|
+
"area": "Roles",
|
|
982
|
+
"scenario": "Same-model retry is not fallback",
|
|
983
|
+
"required_outcome": "One same-model retry is not recorded as a route change.",
|
|
984
|
+
"status": "NOT_RUN",
|
|
985
|
+
"qualification": "Host-level: a settled result without the fallback flag is not recorded as one. Host-level unit coverage exists (tests/omp-contract.test.ts); the native runtime scenario was NOT executed, so this is not a native pass.",
|
|
986
|
+
"source_paths": [
|
|
987
|
+
"docs/tools/task.md"
|
|
988
|
+
]
|
|
989
|
+
},
|
|
990
|
+
{
|
|
991
|
+
"id": "S18-01",
|
|
992
|
+
"area": "Sessions",
|
|
993
|
+
"scenario": "OMP-native lease blocks OMB mutation",
|
|
994
|
+
"required_outcome": "A journal held by a plain OMP process cannot be deleted, migrated or resumed by OMB.",
|
|
995
|
+
"status": "NOT_RUN",
|
|
996
|
+
"qualification": "NOT RUN: no OMP runtime exports a session lease below 18.5.0, and this machine has no importable package. The seam is unit-tested only against a stand-in. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
997
|
+
"source_paths": [
|
|
998
|
+
"docs/tools/task.md",
|
|
999
|
+
"docs/session-storage.md"
|
|
1000
|
+
]
|
|
1001
|
+
},
|
|
1002
|
+
{
|
|
1003
|
+
"id": "S18-02",
|
|
1004
|
+
"area": "Sessions",
|
|
1005
|
+
"scenario": "Hardlink alias",
|
|
1006
|
+
"required_outcome": "A hard link to the same journal cannot become a second writer.",
|
|
1007
|
+
"status": "NOT_RUN",
|
|
1008
|
+
"qualification": "Host-level: refused while held, claimable after release. Host-level unit coverage exists (tests/omp-contract.test.ts); the native runtime scenario was NOT executed, so this is not a native pass.",
|
|
1009
|
+
"source_paths": [
|
|
1010
|
+
"docs/tools/task.md",
|
|
1011
|
+
"docs/session-storage.md"
|
|
1012
|
+
]
|
|
1013
|
+
},
|
|
1014
|
+
{
|
|
1015
|
+
"id": "S18-03",
|
|
1016
|
+
"area": "Sessions",
|
|
1017
|
+
"scenario": "Symlink alias",
|
|
1018
|
+
"required_outcome": "A symlink to the same journal cannot produce two writers.",
|
|
1019
|
+
"status": "NOT_RUN",
|
|
1020
|
+
"qualification": "Host-level: refused while held. Host-level unit coverage exists (tests/omp-contract.test.ts); the native runtime scenario was NOT executed, so this is not a native pass.",
|
|
1021
|
+
"source_paths": [
|
|
1022
|
+
"docs/tools/task.md",
|
|
1023
|
+
"docs/session-storage.md"
|
|
1024
|
+
]
|
|
1025
|
+
},
|
|
1026
|
+
{
|
|
1027
|
+
"id": "S18-04",
|
|
1028
|
+
"area": "Sessions",
|
|
1029
|
+
"scenario": "Path now holds a different session",
|
|
1030
|
+
"required_outcome": "A journal whose header no longer carries the recorded id is refused for mutation.",
|
|
1031
|
+
"status": "NOT_RUN",
|
|
1032
|
+
"qualification": "Host-level: a journal with no readable session id is refused. Host-level unit coverage exists (tests/omp-contract.test.ts); the native runtime scenario was NOT executed, so this is not a native pass.",
|
|
1033
|
+
"source_paths": [
|
|
1034
|
+
"docs/tools/task.md",
|
|
1035
|
+
"docs/session-storage.md"
|
|
1036
|
+
]
|
|
1037
|
+
},
|
|
1038
|
+
{
|
|
1039
|
+
"id": "S18-05",
|
|
1040
|
+
"area": "Sessions",
|
|
1041
|
+
"scenario": "Move conflict",
|
|
1042
|
+
"required_outcome": "Ownership follows the session id across a move; both files stay intact.",
|
|
1043
|
+
"status": "NOT_RUN",
|
|
1044
|
+
"qualification": "Host-level: the claim is still held after rename. Host-level unit coverage exists (tests/omp-contract.test.ts); the native runtime scenario was NOT executed, so this is not a native pass.",
|
|
1045
|
+
"source_paths": [
|
|
1046
|
+
"docs/tools/task.md",
|
|
1047
|
+
"docs/session-storage.md"
|
|
1048
|
+
]
|
|
1049
|
+
},
|
|
1050
|
+
{
|
|
1051
|
+
"id": "S18-06",
|
|
1052
|
+
"area": "Sessions",
|
|
1053
|
+
"scenario": "Fork reason",
|
|
1054
|
+
"required_outcome": "session_before_branch/session_branch reason fork is handled as fork semantics.",
|
|
1055
|
+
"status": "NOT_RUN",
|
|
1056
|
+
"qualification": "NOT RUN: not implemented; mobile fork RPC is out of scope for this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1057
|
+
"source_paths": [
|
|
1058
|
+
"docs/tools/task.md",
|
|
1059
|
+
"docs/session-storage.md"
|
|
1060
|
+
]
|
|
1061
|
+
},
|
|
1062
|
+
{
|
|
1063
|
+
"id": "S18-07",
|
|
1064
|
+
"area": "Sessions",
|
|
1065
|
+
"scenario": "BTW reason",
|
|
1066
|
+
"required_outcome": "reason btw does not trigger destructive branch assumptions.",
|
|
1067
|
+
"status": "NOT_RUN",
|
|
1068
|
+
"qualification": "NOT RUN: not implemented. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1069
|
+
"source_paths": [
|
|
1070
|
+
"docs/tools/task.md",
|
|
1071
|
+
"docs/session-storage.md"
|
|
1072
|
+
]
|
|
1073
|
+
},
|
|
1074
|
+
{
|
|
1075
|
+
"id": "BG01",
|
|
1076
|
+
"area": "Execution",
|
|
1077
|
+
"scenario": "Async acknowledgement is not completion",
|
|
1078
|
+
"required_outcome": "Dispatch becomes admitted/running; the work item is not accepted.",
|
|
1079
|
+
"status": "NOT_RUN",
|
|
1080
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1081
|
+
"source_paths": [
|
|
1082
|
+
"docs/async.md",
|
|
1083
|
+
"docs/tools/task.md"
|
|
1084
|
+
]
|
|
1085
|
+
},
|
|
1086
|
+
{
|
|
1087
|
+
"id": "BG02",
|
|
1088
|
+
"area": "Execution",
|
|
1089
|
+
"scenario": "Concurrent independent specialists",
|
|
1090
|
+
"required_outcome": "Non-overlapping ready work runs concurrently up to capacity with unique identities.",
|
|
1091
|
+
"status": "NOT_RUN",
|
|
1092
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1093
|
+
"source_paths": [
|
|
1094
|
+
"docs/async.md",
|
|
1095
|
+
"docs/tools/task.md"
|
|
1096
|
+
]
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
"id": "BG03",
|
|
1100
|
+
"area": "Execution",
|
|
1101
|
+
"scenario": "Parent continues while workers run",
|
|
1102
|
+
"required_outcome": "The orchestrator stays usable; the dashboard still reports background activity.",
|
|
1103
|
+
"status": "NOT_RUN",
|
|
1104
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1105
|
+
"source_paths": [
|
|
1106
|
+
"docs/async.md",
|
|
1107
|
+
"docs/tools/task.md"
|
|
1108
|
+
]
|
|
1109
|
+
},
|
|
1110
|
+
{
|
|
1111
|
+
"id": "BG04",
|
|
1112
|
+
"area": "Execution",
|
|
1113
|
+
"scenario": "Child result wakes the parent",
|
|
1114
|
+
"required_outcome": "Completion is correlated to the correct dispatch, never to transcript text.",
|
|
1115
|
+
"status": "NOT_RUN",
|
|
1116
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1117
|
+
"source_paths": [
|
|
1118
|
+
"docs/async.md",
|
|
1119
|
+
"docs/tools/task.md"
|
|
1120
|
+
]
|
|
1121
|
+
},
|
|
1122
|
+
{
|
|
1123
|
+
"id": "BG05",
|
|
1124
|
+
"area": "Execution",
|
|
1125
|
+
"scenario": "Targeted cancellation",
|
|
1126
|
+
"required_outcome": "One worker settles cancelled; siblings and the parent continue.",
|
|
1127
|
+
"status": "NOT_RUN",
|
|
1128
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1129
|
+
"source_paths": [
|
|
1130
|
+
"docs/async.md",
|
|
1131
|
+
"docs/tools/task.md"
|
|
1132
|
+
]
|
|
1133
|
+
},
|
|
1134
|
+
{
|
|
1135
|
+
"id": "BG06",
|
|
1136
|
+
"area": "Execution",
|
|
1137
|
+
"scenario": "Targeted steer",
|
|
1138
|
+
"required_outcome": "Only the addressed child receives the message; admitted scope cannot be widened.",
|
|
1139
|
+
"status": "NOT_RUN",
|
|
1140
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1141
|
+
"source_paths": [
|
|
1142
|
+
"docs/async.md",
|
|
1143
|
+
"docs/tools/task.md"
|
|
1144
|
+
]
|
|
1145
|
+
},
|
|
1146
|
+
{
|
|
1147
|
+
"id": "BG07",
|
|
1148
|
+
"area": "Execution",
|
|
1149
|
+
"scenario": "Session not settled while background work remains",
|
|
1150
|
+
"required_outcome": "Idle is asserted only from the runtime's own quiescence signal.",
|
|
1151
|
+
"status": "NOT_RUN",
|
|
1152
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1153
|
+
"source_paths": [
|
|
1154
|
+
"docs/async.md",
|
|
1155
|
+
"docs/tools/task.md"
|
|
1156
|
+
]
|
|
1157
|
+
},
|
|
1158
|
+
{
|
|
1159
|
+
"id": "BG08",
|
|
1160
|
+
"area": "Execution",
|
|
1161
|
+
"scenario": "Isolated parallel implementation",
|
|
1162
|
+
"required_outcome": "Editing specialists run in separate native workspaces; integration stays serial.",
|
|
1163
|
+
"status": "NOT_RUN",
|
|
1164
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1165
|
+
"source_paths": [
|
|
1166
|
+
"docs/async.md",
|
|
1167
|
+
"docs/tools/task.md"
|
|
1168
|
+
]
|
|
1169
|
+
},
|
|
1170
|
+
{
|
|
1171
|
+
"id": "BG09",
|
|
1172
|
+
"area": "Execution",
|
|
1173
|
+
"scenario": "One worker failure",
|
|
1174
|
+
"required_outcome": "Failure is correlated to its work item only; dependents follow workflow policy.",
|
|
1175
|
+
"status": "NOT_RUN",
|
|
1176
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1177
|
+
"source_paths": [
|
|
1178
|
+
"docs/async.md",
|
|
1179
|
+
"docs/tools/task.md"
|
|
1180
|
+
]
|
|
1181
|
+
},
|
|
1182
|
+
{
|
|
1183
|
+
"id": "BG10",
|
|
1184
|
+
"area": "Execution",
|
|
1185
|
+
"scenario": "Parked/revived worker",
|
|
1186
|
+
"required_outcome": "A revived worker is rebound to a new dispatch rather than inheriting stale scope.",
|
|
1187
|
+
"status": "NOT_RUN",
|
|
1188
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1189
|
+
"source_paths": [
|
|
1190
|
+
"docs/async.md",
|
|
1191
|
+
"docs/tools/task.md"
|
|
1192
|
+
]
|
|
1193
|
+
},
|
|
1194
|
+
{
|
|
1195
|
+
"id": "BG11",
|
|
1196
|
+
"area": "Execution",
|
|
1197
|
+
"scenario": "Reconnect/recovery",
|
|
1198
|
+
"required_outcome": "Reconnect reconstructs agents from native state plus the journal without duplicating workers.",
|
|
1199
|
+
"status": "NOT_RUN",
|
|
1200
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1201
|
+
"source_paths": [
|
|
1202
|
+
"docs/async.md",
|
|
1203
|
+
"docs/tools/task.md"
|
|
1204
|
+
]
|
|
1205
|
+
},
|
|
1206
|
+
{
|
|
1207
|
+
"id": "BG12",
|
|
1208
|
+
"area": "Execution",
|
|
1209
|
+
"scenario": "Run cancellation with multiple workers",
|
|
1210
|
+
"required_outcome": "Cancellation is journaled first, fanned out natively, and every terminal state observed.",
|
|
1211
|
+
"status": "NOT_RUN",
|
|
1212
|
+
"qualification": "NOT RUN: section 12 background-agent suite is not implemented in this change. Native/Bizar acceptance scenario; not proved by offline utility unit tests.",
|
|
1213
|
+
"source_paths": [
|
|
1214
|
+
"docs/async.md",
|
|
1215
|
+
"docs/tools/task.md"
|
|
1216
|
+
]
|
|
800
1217
|
}
|
|
801
1218
|
]
|
|
802
1219
|
}
|
|
@@ -18,7 +18,7 @@ Separate five kinds of statement: DOCUMENTED, SOURCE-OBSERVED, TESTED, PROPOSED
|
|
|
18
18
|
|
|
19
19
|
## Target fingerprint
|
|
20
20
|
|
|
21
|
-
Current qualification target: `v18.
|
|
21
|
+
Current qualification target: `v18.6.1@2a2c6dcbbb558c0f8145f67f28b3370984f2bf60`, npm integrity `sha512-UZoZWYUfflDgd0HVDP12X8r4hiYSps7XMf96U7o8ScThAuw6OoI+zBBIypRfTQnzg0QJljpchpa7i0xqCNyXcA==`.
|
|
22
22
|
Earlier accepted runtimes are listed in `docs/compatibility/baseline.json`. This pinned research corpus records source fingerprints for `v18.2.6@78b753124d11f8dd3ae73e2524125890ff7c977e`, `v18.2.5@37273117021129e96bd05d8277b140ec3fd61990`, and `v18.2.4@1c0303b1f2ec515cbf4b44a9a49d68a029531aac`; it does not provide source fingerprints for every accepted runtime.
|
|
23
23
|
Research source: `can1357/oh-my-pi@dbf3afad4894bde827d90f965e77b3fe1c5a95e5`; it remains a source/documentation corpus pin, not a claim about the current package release. Compare artifacts/commits, not just a semver string.
|
|
24
24
|
|
|
@@ -49,7 +49,7 @@ Run static profile lint, then native role resolution, then an actual child routi
|
|
|
49
49
|
|
|
50
50
|
## 4. Dispatch and observation
|
|
51
51
|
|
|
52
|
-
Native task payloads identify the specialist by `agent
|
|
52
|
+
Native task payloads identify the specialist by `agent`, and may carry a per-item `model` selector that outranks both `task.agentModelOverrides` and the agent's own frontmatter. Preserve that selector, record it as requested routing, and keep it distinct from the model the host actually resolved. A batch-container `model` is refused by the host rather than dropped, so reject it explicitly instead of letting it pass unobserved. Use exact names and inspect which source definition won native discovery. Preserve native parent spawn/depth restrictions and skill autoload behavior.
|
|
53
53
|
|
|
54
54
|
Record the following when observable from supported interfaces: run/task ID, native spawned ID, agent name and source, settings revision, requested role, winning override source, resolved provider/model, effective reasoning selector, service tier, fallback flags, native job status, output schema, artifact references and final verification outcome. Mark unobservable fields UNKNOWN; do not fabricate them from prompt text.
|
|
55
55
|
|
|
@@ -104,7 +104,9 @@ primary docs/source through the pinned manifest or the actual target checkout.
|
|
|
104
104
|
Preserve native custom roles, task.agentModelOverrides, model-role storage, tags,
|
|
105
105
|
cycle order, effort, service tiers, prewalk, advisors, native fallback and user
|
|
106
106
|
model selection. Keep requested role and actual effective model separately.
|
|
107
|
-
|
|
107
|
+
The per-item `model` selector is a real public task parameter at this pin, so
|
|
108
|
+
preserve it rather than inventing one or dropping it. Never add parameters the
|
|
109
|
+
host does not expose, and never build a competing Bizar model router.
|
|
108
110
|
|
|
109
111
|
Implement source/type tests and the relevant cases in assets/tests/acceptance-matrix.json
|
|
110
112
|
before claiming the integration works. Start with one actual discovered specialist,
|
|
@@ -63,6 +63,10 @@ The following are PROPOSED Bizar guarantees, not automatic OMP behavior: require
|
|
|
63
63
|
|
|
64
64
|
Associate evidence with candidate content/tree identity, check command and cwd, toolchain, outcome, output digests and time. After integration, run the relevant proving checks against the integrated target. A worker statement, successful spawn or passing test on a different revision must not mark the objective complete.
|
|
65
65
|
|
|
66
|
+
Read-only command output is not transcript evidence. At this pin `/changelog`, `/context`, `/tools`, `/hotkeys`, `/advisor status`, `/memory …`, the mental-model reports, `/jobs`, `/mcp …` and `/ssh …` render through a report UI instead of appending a message, so a workflow that expects one of them to leave a transcript entry will find nothing there. Keep durable state in Bizar's own journal and run log; never make a claim depend on report text being replayable. `/dump all` produces a ZIP of the main transcript, the request JSON and every nested subagent transcript, with killed subagents marked aborted — use it for support and diagnosis, but treat the archive as a snapshot rather than a stable runtime API.
|
|
67
|
+
|
|
68
|
+
Recording per-spawn model routing is likewise not optional garnish: `SingleResult` carries `modelOverride`, `modelRole`, `resolvedModel`, `resolvedModelIdentity`, `resolvedThinkingLevel`, `resolvedModelIsFallback` and `resolvedModelRoute`, and those are host-owned facts. Mark them absent when the host omits them rather than inferring the resolution source, and keep them separate from what the caller requested.
|
|
69
|
+
|
|
66
70
|
## 7. Sources
|
|
67
71
|
|
|
68
72
|
- [Native task contract](https://github.com/can1357/oh-my-pi/blob/dbf3afad4894bde827d90f965e77b3fe1c5a95e5/docs/tools/task.md)
|