@open-agent-toolkit/cli 0.2.53 → 0.2.54

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 (87) hide show
  1. package/assets/agents/recon-worker.md +105 -0
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/cli-utilities/tool-packs.md +62 -8
  4. package/assets/docs/contributing/skills.md +26 -0
  5. package/assets/docs/workflows/skills/index.md +3 -0
  6. package/assets/docs/workflows/skills/recon.md +194 -0
  7. package/assets/public-package-versions.json +4 -4
  8. package/assets/skills/oat-dispatch-subagents/SKILL.md +105 -4
  9. package/assets/skills/oat-dispatch-subagents/references/record-schema.md +226 -0
  10. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +2 -2
  11. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +2 -2
  12. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +2 -2
  13. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +2 -2
  14. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +2 -2
  15. package/assets/skills/recon/SKILL.md +260 -0
  16. package/assets/skills/recon/references/packet-contract.md +307 -0
  17. package/assets/skills/recon/references/profiles.md +58 -0
  18. package/assets/skills/recon/references/worker-contract.md +71 -0
  19. package/assets/skills/recon/scripts/create-review-brief.mjs +452 -0
  20. package/assets/skills/recon/scripts/lib/canonical-json.mjs +55 -0
  21. package/assets/skills/recon/scripts/lib/contracts.mjs +2462 -0
  22. package/assets/skills/recon/scripts/lib/safe-path.mjs +120 -0
  23. package/assets/skills/recon/scripts/lib/validated-run.mjs +86 -0
  24. package/assets/skills/recon/scripts/reconcile-ledger.mjs +360 -0
  25. package/assets/skills/recon/scripts/render-packet.mjs +392 -0
  26. package/assets/skills/recon/scripts/validate-artifact.mjs +96 -0
  27. package/assets/skills/recon/scripts/validate-packet.mjs +2359 -0
  28. package/dist/commands/doctor/index.js +5 -5
  29. package/dist/commands/init/index.d.ts.map +1 -1
  30. package/dist/commands/init/index.js +6 -7
  31. package/dist/commands/status/index.d.ts +2 -2
  32. package/dist/commands/status/index.d.ts.map +1 -1
  33. package/dist/commands/status/index.js +7 -4
  34. package/dist/commands/sync/index.d.ts.map +1 -1
  35. package/dist/commands/sync/index.js +24 -8
  36. package/dist/commands/sync/sync.types.d.ts +2 -2
  37. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  38. package/dist/commands/tools/migrate/index.d.ts.map +1 -1
  39. package/dist/commands/tools/migrate/index.js +25 -1
  40. package/dist/commands/tools/migrate/migrate-pack.d.ts +5 -0
  41. package/dist/commands/tools/migrate/migrate-pack.d.ts.map +1 -1
  42. package/dist/commands/tools/migrate/migrate-pack.js +66 -7
  43. package/dist/commands/tools/remove/index.js +1 -1
  44. package/dist/commands/tools/remove/remove-tools.d.ts +5 -1
  45. package/dist/commands/tools/remove/remove-tools.d.ts.map +1 -1
  46. package/dist/commands/tools/remove/remove-tools.js +81 -1
  47. package/dist/commands/tools/shared/apply-pack-reconcile.d.ts +3 -0
  48. package/dist/commands/tools/shared/apply-pack-reconcile.d.ts.map +1 -1
  49. package/dist/commands/tools/shared/apply-pack-reconcile.js +40 -9
  50. package/dist/commands/tools/shared/format-pack-inventory.d.ts.map +1 -1
  51. package/dist/commands/tools/shared/format-pack-inventory.js +3 -0
  52. package/dist/commands/tools/shared/install-sync-context.d.ts +2 -1
  53. package/dist/commands/tools/shared/install-sync-context.d.ts.map +1 -1
  54. package/dist/commands/tools/shared/install-sync-context.js +14 -3
  55. package/dist/commands/tools/shared/pack-dependencies.d.ts +14 -0
  56. package/dist/commands/tools/shared/pack-dependencies.d.ts.map +1 -0
  57. package/dist/commands/tools/shared/pack-dependencies.js +54 -0
  58. package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -1
  59. package/dist/commands/tools/shared/pack-inventory.js +9 -9
  60. package/dist/commands/tools/shared/pack-lifecycle.d.ts +9 -1
  61. package/dist/commands/tools/shared/pack-lifecycle.d.ts.map +1 -1
  62. package/dist/commands/tools/shared/pack-lifecycle.js +102 -9
  63. package/dist/commands/tools/shared/pack-manifest.d.ts +2 -2
  64. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  65. package/dist/commands/tools/shared/pack-manifest.js +91 -2
  66. package/dist/commands/tools/shared/pack-reconcile.d.ts +15 -1
  67. package/dist/commands/tools/shared/pack-reconcile.d.ts.map +1 -1
  68. package/dist/commands/tools/shared/pack-reconcile.js +75 -13
  69. package/dist/commands/tools/shared/scoped-pack-intent.d.ts +8 -0
  70. package/dist/commands/tools/shared/scoped-pack-intent.d.ts.map +1 -1
  71. package/dist/commands/tools/shared/scoped-pack-intent.js +61 -15
  72. package/dist/commands/tools/shared/types.d.ts +7 -0
  73. package/dist/commands/tools/shared/types.d.ts.map +1 -1
  74. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  75. package/dist/commands/tools/update/update-tools.js +7 -1
  76. package/dist/config/oat-config.d.ts +5 -1
  77. package/dist/config/oat-config.d.ts.map +1 -1
  78. package/dist/config/oat-config.js +19 -0
  79. package/dist/engine/index.d.ts +1 -1
  80. package/dist/engine/index.d.ts.map +1 -1
  81. package/dist/engine/scanner.d.ts +9 -1
  82. package/dist/engine/scanner.d.ts.map +1 -1
  83. package/dist/engine/scanner.js +61 -4
  84. package/dist/shared/types.d.ts +1 -0
  85. package/dist/shared/types.d.ts.map +1 -1
  86. package/dist/shared/types.js +3 -0
  87. package/package.json +2 -2
@@ -0,0 +1,105 @@
1
+ ---
2
+ name: recon-worker
3
+ version: 1.0.0
4
+ description: Executes one bounded recon packet assignment as a non-interactive leaf worker and writes exactly one declared artifact.
5
+ tools: Read, Bash, Grep, Glob, Write, WebSearch, WebFetch
6
+ color: cyan
7
+ ---
8
+
9
+ ## Role
10
+
11
+ You are a non-interactive recon leaf worker. Execute exactly one assignment in
12
+ one declared mode: `map`, `gather`, `compile`, `verify`, `adversary`, `coverage`,
13
+ or `reconcile`. No other mode is valid.
14
+
15
+ ## Assignment Gate
16
+
17
+ Before work, require a complete envelope containing run, wave, and lane IDs;
18
+ mode; bounded objective; included and excluded scope; allowed inputs; excluded
19
+ inputs; source-read authority and read-only tools; sole write path; artifact
20
+ kind and schema version; output schema; enforcement level; and deadline.
21
+
22
+ Reject the assignment if inputs overlap exclusions, source authority is
23
+ missing, the write path is not unique and packet-contained, the schema is
24
+ unknown, or the mode is undeclared. Never infer missing authority.
25
+
26
+ ## Universal Invariants
27
+
28
+ - Read only the declared allowed inputs under the stated source-read authority.
29
+ - Write only the assigned artifact at the sole `writePath`.
30
+ - Never modify investigated sources, shared manifests, canonical ledgers, or
31
+ another lane's artifact.
32
+ - Never interact with the user.
33
+ - Never dispatch children, helpers, reviewers, or replacement workers.
34
+ - Never request credentials or broaden permissions.
35
+ - Preserve exact typed locators and minimal display excerpts.
36
+ - Report uncertainty, contradictions, missing evidence, and unavailable inputs
37
+ explicitly; never emit numeric confidence.
38
+ - Redact detected secret spans before persistence and never persist a sensitive
39
+ value or its digest.
40
+
41
+ ## Mode Behavior
42
+
43
+ ### `map`
44
+
45
+ Inventory only the assigned source partition. Emit candidate evidence areas,
46
+ source identities, unavailable inputs, and coverage gaps. Do not form canonical
47
+ claims.
48
+
49
+ ### `gather`
50
+
51
+ Inspect assigned sources and emit findings with typed locators, minimal display
52
+ excerpts, observations, uncertainty, contradictions, and gaps. Do not assign a
53
+ canonical claim status.
54
+
55
+ ### `compile`
56
+
57
+ Consume only the designated dossiers. Deduplicate their findings into a
58
+ provisional claim-ledger candidate and cite direct input artifacts. Do not
59
+ reopen excluded sources or invent evidence.
60
+
61
+ ### `verify`
62
+
63
+ Consume only an immutable verification brief. Reopen the declared sources,
64
+ test the provided locators and claim semantics, and emit claim-level
65
+ dispositions plus newly observed evidence. Do not read dossiers, compiler
66
+ reasoning, synthesis prose, or prior reviews.
67
+
68
+ ### `adversary`
69
+
70
+ Consume only declared scope, questions, and provisional statements. Search for
71
+ counterevidence, unsupported inference, incompatible interpretations, and
72
+ missing alternatives. Do not read gathering or prior-review conclusions.
73
+
74
+ ### `coverage`
75
+
76
+ Compare the declared scope and questions with the permitted ledger projection.
77
+ Emit covered items, missing areas, and material gaps. Do not read gatherer
78
+ reasoning.
79
+
80
+ ### `reconcile`
81
+
82
+ Apply permitted review dispositions and contradiction outcomes to a new ledger
83
+ candidate. Preserve the prior revision, legal state transitions, evidence
84
+ links, qualifications, and unresolved issues. Never invent evidence or update
85
+ the existing ledger in place.
86
+
87
+ ## Output
88
+
89
+ Write one JSON artifact matching the supplied schema. Include kind, schema
90
+ version, identities, mode, outcome, honored inputs and exclusions, findings or
91
+ dispositions, uncertainty, contradictions, gaps, safe diagnostics, and direct
92
+ input references where applicable.
93
+
94
+ Return only the artifact path and compact outcome. Do not return source bodies,
95
+ worker reasoning, or dossier contents to the controller.
96
+
97
+ ## Critical Rules
98
+
99
+ **ONE MODE. ONE ARTIFACT.** Perform only the assigned mode and write only its
100
+ assigned artifact.
101
+
102
+ **LEAF ONLY.** Never interact with the user and never dispatch any child.
103
+
104
+ **HONEST EVIDENCE.** Surface uncertainty and contradiction; do not manufacture
105
+ coverage or assurance.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.53"
3
+ "oatVersion": "0.2.54"
4
4
  }
@@ -24,7 +24,7 @@ This page covers CLI commands that manage bundled OAT tool packs and installed O
24
24
  | `ideas` | Lightweight ideation and promotion flows plus idea templates | project, user | user |
25
25
  | `utility` | Review and repo-maintenance helpers plus portable subagent-selection guidance and the provider-neutral dispatch engine | project, user | user |
26
26
  | `project-management` | File-backed backlog/reference skills plus backlog, roadmap, current-state, file-per-record decision, and AGENTS-guide templates | project, user | user |
27
- | `research` | Research, analysis, comparison, and synthesis skills plus the skeptical-evaluator agent | project, user | user |
27
+ | `research` | Recon evidence packets, research, analysis, comparison, and synthesis skills plus the recon-worker and skeptical-evaluator agents | project, user | user |
28
28
  | `brainstorm` | Always-on brainstorming entry point with visual companion | project, user | user |
29
29
 
30
30
  Every reusable pack is a complete user-scope capability. On a **fresh** install
@@ -116,6 +116,46 @@ present without the utility contracts, it fails closed and reports the missing
116
116
  dependency instead of inventing a fallback route. Non-project analytical
117
117
  skills can use the utility guidance and dispatch layers directly.
118
118
 
119
+ ### Research-pack dispatch dependencies
120
+
121
+ The research pack owns `recon` and `recon-worker`, but the utility pack retains
122
+ exclusive ownership of the two reusable dispatch skills that recon needs:
123
+
124
+ - `oat-dispatch-subagents`; and
125
+ - `subagent-orchestration`.
126
+
127
+ Installing research acquires those two utility assets at the same scope. OAT
128
+ records the research request as direct intent (`tools.research: true`) and a
129
+ transitive lease under `tools.requiredBy.utility`, which includes `research`.
130
+ The lease makes the selected utility assets available without pretending that
131
+ research owns them or that the entire utility pack was directly installed.
132
+
133
+ Direct utility intent and transitive leases are independent. If
134
+ `tools.utility: true` already exists, removing research releases only the
135
+ research lease and keeps the direct utility installation. When several packs
136
+ require utility, each name remains in the sorted, deduplicated `requiredBy`
137
+ list; dependency assets are removed only after no direct intent and no other
138
+ lease retains them.
139
+
140
+ Dependency lifecycle follows the root pack:
141
+
142
+ - install and update reconcile the declared dependency assets idempotently at
143
+ the root pack's scope;
144
+ - migration acquires and verifies destination leases before releasing source
145
+ leases, then removes the source only after the destination is complete; and
146
+ - removal releases the root pack's lease, removes only dependency assets with
147
+ no remaining owner, and prunes provider views only for canonical assets that
148
+ were actually removed.
149
+
150
+ Use explicit scopes when installing or updating recon's pack:
151
+
152
+ ```bash
153
+ oat tools install research --scope user
154
+ oat tools update --pack research --scope user
155
+ oat tools install research --scope project
156
+ oat tools update --pack research --scope project
157
+ ```
158
+
119
159
  ### Cross-pack explainer dependency
120
160
 
121
161
  The public explainer family also spans two packs:
@@ -151,10 +191,12 @@ the usage and lifecycle contract.
151
191
 
152
192
  Two independent facts describe a pack:
153
193
 
154
- - **Intent** is what you asked for. It is stored per scope as
155
- `tools.<pack>: true` in that scope's config file (`.oat/config.json` for
156
- project scope, `~/.oat/config.json` for user scope). Intent is _true-or-absent_:
157
- removing a pack deletes the key rather than writing `false`.
194
+ - **Intent** is why a pack is present. Direct intent is stored per scope as
195
+ `tools.<pack>: true`; transitive dependency intent is stored as a sorted,
196
+ deduplicated `tools.requiredBy.<pack>` list. Both live in that scope's config
197
+ file (`.oat/config.json` for project scope, `~/.oat/config.json` for user
198
+ scope). Direct intent remains _true-or-absent_: removing a direct pack deletes
199
+ its key rather than writing `false`.
158
200
  - **Inventory** is what is actually on disk right now: every managed asset the
159
201
  release manifest declares for that pack and scope, its presence, and its
160
202
  version or content digest.
@@ -575,6 +617,8 @@ Key behavior:
575
617
  - Compares installed versions and canonical content against bundled assets and
576
618
  copies updates; equal version metadata does not hide content drift
577
619
  - For `--pack <pack>` and `--all`, an already-installed pack is reconciled to the **current** release membership in the scopes where it is installed, adding newly bundled skills, agents, templates, and scripts
620
+ - Pack dependencies are reconciled at the same scope without converting a
621
+ transitive-only dependency into direct pack intent
578
622
  - A pack whose managed assets are all missing but whose intent is still declared is repaired from intent rather than skipped
579
623
  - Managed template and script companions are refreshed at **user** scope. A project-scope repository template is an owner override and is left alone
580
624
  - Non-versioned assets are compared by content digest, so an identical refresh is a no-op instead of a rewrite
@@ -608,6 +652,9 @@ Key behavior:
608
652
  intent was eligible to be cleared; `removed: false` is a no-op and preserves
609
653
  intent.
610
654
  - Removal-triggered sync prunes exactly the canonical provider views for the removed paths in that scope, leaving other scopes and packs untouched
655
+ - Removing a root pack releases its `requiredBy` leases. A dependency asset is
656
+ retained while its owning pack has direct intent or another pack still
657
+ requires that asset
611
658
  - Dry-run mode with `--dry-run`; auto-sync after mutations by default
612
659
  - Use `--no-sync` to skip auto-sync
613
660
 
@@ -629,6 +676,8 @@ Key behavior:
629
676
  - **Destination first, source second.** The destination is installed and
630
677
  re-inventoried, and destination intent is written only after the pack is
631
678
  verified complete there. Only then is source removal offered
679
+ - Dependency leases follow the same order: acquire and verify destination
680
+ leases before releasing source leases, so a failed move remains retryable
632
681
  - Source removal requires an interactive confirmation. Declining leaves the
633
682
  pack installed at **both** scopes with the destination verified — a safe,
634
683
  recoverable state, not a failure. Non-interactive runs stop at the same point
@@ -650,7 +699,7 @@ To roll a migration back, run it in the opposite direction. Because the
650
699
  destination is always verified before the source is touched, a rollback is the
651
700
  same safe two-phase operation.
652
701
 
653
- ## Pack intent: `tools.<pack>`
702
+ ## Pack intent: `tools.<pack>` and `tools.requiredBy`
654
703
 
655
704
  Pack intent is recorded per scope, in that scope's own config file:
656
705
 
@@ -661,10 +710,14 @@ Pack intent is recorded per scope, in that scope's own config file:
661
710
 
662
711
  - Intent is **true-or-absent**. Installing writes `true` for the scope you
663
712
  installed into; removing deletes the key. OAT never writes `false`.
713
+ - `tools.requiredBy.<pack>` is a sorted list of packs that currently lease
714
+ selected assets from that pack at the same scope. It is transitive intent,
715
+ not a substitute for `tools.<pack>: true`.
664
716
  - A user-scope install never writes repository config, and a project-scope
665
717
  install never writes user config.
666
718
  - Intent for one pack is never derived from another pack's key, and no
667
- command writes the full eight-pack map.
719
+ command writes the full eight-pack map. Dependency operations update only
720
+ the owning pack's `requiredBy` entry.
668
721
  - `.oat/config.local.json` is not an intent surface; per-developer state stays
669
722
  out of pack intent.
670
723
  - A manual `oat config set tools.<pack> true` is an override that the next
@@ -876,7 +929,8 @@ Installing the `project-management` pack does not adopt a repository. Run
876
929
 
877
930
  ### The `tools` config map is now sparse
878
931
 
879
- Pack intent is written as [true-or-absent](#pack-intent-toolspack). Earlier
932
+ Pack intent is written as
933
+ [true-or-absent](#pack-intent-toolspack-and-toolsrequiredby). Earlier
880
934
  releases wrote all eight pack keys as explicit `true`/`false` on reconcile;
881
935
  current releases write `true` for installed packs and delete the key otherwise.
882
936
 
@@ -140,6 +140,32 @@ Codex, so a canonical fix must survive bundling and Codex sync as well. No test
140
140
  yet gates the generated `.claude` or `.cursor` agent views, so regenerate and
141
141
  spot-check those by hand.
142
142
 
143
+ ### Declare cross-pack dependencies in the pack manifest
144
+
145
+ When a shipped skill depends on assets owned by another pack, declare exact
146
+ asset IDs in `PACK_MANIFEST` instead of duplicating those assets or relying on
147
+ ambient installation. Pack dependencies are same-scope: installation and
148
+ update acquire a `tools.requiredBy.<owner-pack>` lease, while a direct install
149
+ of the owner remains represented separately by `tools.<owner-pack>: true`.
150
+
151
+ The owner pack keeps asset ownership. Removal releases only the caller's lease
152
+ and may delete a dependency asset only when neither direct owner intent nor
153
+ another pack lease retains it. Migration acquires and verifies destination
154
+ leases before releasing the source leases. Keep dependency graphs acyclic,
155
+ deduplicate edges, and make every dependency asset support the caller's scope.
156
+
157
+ ### Mark user-materializable pack agents explicitly
158
+
159
+ Set `userMaterializable: true` only on a managed agent that supports user
160
+ scope and has a bundled canonical source. User sync derives eligible agents
161
+ from installed pack inventory, validates the installed and bundled definitions,
162
+ and projects only those declared agents through active provider adapters.
163
+
164
+ Do not use this marker to expose arbitrary user Markdown or to transfer role
165
+ ownership to a provider view. Canonical/provider destination collisions fail
166
+ closed, and removal keeps the projection while another installed pack or
167
+ direct managed-role intent still retains the canonical agent.
168
+
143
169
  ## Contract components
144
170
 
145
171
  - Mode assertion (purpose, blocked/allowed activities)
@@ -14,6 +14,7 @@ Use this section when you want to choose the right OAT skill for a task. If you
14
14
  - [Explainer Kit](explainer-kit.md) - Core and OAT adapter usage, recipes and expansion profiles, the two authoring paths, warnings and QA severity, themes, lifecycle policy, durability, and publishing.
15
15
  - [Explainer Provider Integration](explainer-kit-providers.md) - Provider-neutral planner, author, trusted browser-session, and visual-critic contracts.
16
16
  - [Repo Improve](repo-improve.md) - Source modes, external-plan boundaries, optional tracking, and OAT import handoff.
17
+ - [Recon Evidence Packets](recon.md) - Approved worker profiles, validated claim states, packet layout, partial outcomes, and directory-only handoff.
17
18
 
18
19
  ## Key Skills by Use Case
19
20
 
@@ -37,6 +38,7 @@ Use this section when you want to choose the right OAT skill for a task. If you
37
38
  - Generate a shipping digest or scheduled recap: `oat-wrap-up`
38
39
  - Run a wave program over a corpus of external plans: `oat-wave-program` (durable program artifact: new/refresh/wave-close) and `oat-wave-execute` (one wave as a wrapper project) — see [Wave Workflows](../wave-workflows.md)
39
40
  - Research a topic in depth: `deep-research`
41
+ - Acquire and validate bounded evidence for another workflow: `recon`
40
42
  - Analyze an artifact, codebase, or document: `analyze`
41
43
  - Compare options with domain-aware dimensions: `compare`
42
44
  - Verify a claim adversarially: `skeptic`
@@ -123,6 +125,7 @@ Use this section when you want to choose the right OAT skill for a task. If you
123
125
 
124
126
  === "Research"
125
127
 
128
+ - `recon`
126
129
  - `deep-research`
127
130
  - `analyze`
128
131
  - `compare`
@@ -0,0 +1,194 @@
1
+ ---
2
+ title: Recon Evidence Packets
3
+ description: 'Use recon to gather and validate bounded evidence through approved worker waves, then hand off one durable packet directory.'
4
+ ---
5
+
6
+ # Recon Evidence Packets
7
+
8
+ `recon` turns a bounded investigation into a durable evidence-packet directory.
9
+ It gathers source-grounded findings through approved worker waves, validates
10
+ their locators and assurance state, and gives the next consumer one compact
11
+ entry point instead of every worker transcript.
12
+
13
+ The first release is standalone. It does not automatically run from project
14
+ discovery, quick start, `analyze`, or `deep-research`. Those workflows can
15
+ consume an explicitly supplied packet path without changing their own
16
+ invocation behavior.
17
+
18
+ ## Choose the Right Research Skill
19
+
20
+ | Need | Use |
21
+ | ------------------------------------------------------------------ | --------------- |
22
+ | Acquire and validate bounded evidence for another workflow | `recon` |
23
+ | Interpret a concrete artifact, codebase, document, system, or idea | `analyze` |
24
+ | Research a broader external topic and produce a narrative artifact | `deep-research` |
25
+
26
+ Use `recon` when the evidence, exact source locators, contradictions, and gaps
27
+ are the deliverable. It does not make the final product, architecture,
28
+ security, or release decision, and it does not modify the investigated system.
29
+
30
+ ## Install or Update the Research Pack
31
+
32
+ Install at user scope when you want `recon` available across repositories:
33
+
34
+ ```bash
35
+ oat tools install research --scope user
36
+ oat tools update --pack research --scope user
37
+ ```
38
+
39
+ Install at project scope when the repository should own the capability:
40
+
41
+ ```bash
42
+ oat tools install research --scope project
43
+ oat tools update --pack research --scope project
44
+ ```
45
+
46
+ The research pack acquires its two dispatch dependencies from the utility pack
47
+ at the same scope. You do not need to select a named model during installation.
48
+ At run time, OAT resolves a currently available target that meets the planned
49
+ work's task-class floor and asks you to approve the exact provider, model,
50
+ effort, role, topology, authority, and execution limits before any worker
51
+ launches.
52
+
53
+ ## Run a Recon
54
+
55
+ Provide a bounded question or target, then optionally choose a profile, scope,
56
+ context source, output directory, or strict authority:
57
+
58
+ ```text
59
+ /recon "How is provider sync materialized?" --profile standard --scope packages/cli/src/providers
60
+ ```
61
+
62
+ The default profile is `standard`. Every run uses one approved model and effort
63
+ for every pass. Profiles change pass topology, redundancy, lane caps, and
64
+ maximum concurrency; they do not silently choose a different model tier.
65
+
66
+ | Profile | Use it for | Required assurance work | Claim ceiling |
67
+ | ---------- | ------------------------------------------- | ---------------------------------------------------------------------------------------- | ------------- |
68
+ | `quick` | Bounded orientation | Mapping, gathering, compilation, schema validation, and locator validation | `supported` |
69
+ | `standard` | Load-bearing evidence | Quick work plus blind semantic verification, adversarial review, coverage, and reconcile | `verified` |
70
+ | `thorough` | Expensive failure or correlated blind spots | Standard work plus redundant gathering and verification and contradiction resolution | `verified` |
71
+
72
+ The approval manifest shows the exact adaptive lane count, concurrency, pass
73
+ topology, conditional lane caps, deadlines, retries, and source/write authority.
74
+ Declining approval launches nothing. A material change to a provider, model,
75
+ effort, route, role, service tier, or execution cap requires renewed approval;
76
+ there is no silent substitution after approval.
77
+
78
+ ## Destination Precedence
79
+
80
+ `recon` always creates a new topic-and-run directory. It never overwrites an
81
+ existing run. The packet parent is selected in this order:
82
+
83
+ 1. an explicit `--output` override;
84
+ 2. the active project's `references/evidence/` directory when a caller supplies
85
+ that project context;
86
+ 3. the repository's `.oat/repo/reference/evidence/` directory;
87
+ 4. a fallback destination that the caller approves.
88
+
89
+ An OAT project is optional. Standalone recon remains available when no project
90
+ or repository evidence directory exists.
91
+
92
+ ## Packet Layout and Consumption
93
+
94
+ Every structurally publishable run uses this top-level layout; a
95
+ non-publishable candidate generation withdraws any existing `packet.md`:
96
+
97
+ ```text
98
+ <topic>-<run-id>/
99
+ ├── packet.md
100
+ ├── manifest.json
101
+ ├── claims.json
102
+ ├── reviews/
103
+ └── raw/
104
+ ```
105
+
106
+ - `packet.md` is the compact consumer view and is published last.
107
+ - `claims.json` is the canonical claim ledger.
108
+ - `manifest.json` records request, source, dispatch, topology, stage, and gap
109
+ provenance.
110
+ - `reviews/` contains compact locator, semantic, adversarial, coverage, and
111
+ reconciliation evidence.
112
+ - `raw/` contains worker dossiers, dispatch receipts, candidate artifacts, and
113
+ safe failure diagnostics. It is not normal consumer input.
114
+
115
+ The ledger compiler and packet validator enforce categorical referential
116
+ integrity on `synthesis.keyClaimIds` and `synthesis.unresolvedQuestionIds`. Any
117
+ reference to an unknown claim or question ID fails validation with
118
+ `SYNTHESIS_REFERENCE_MISSING`.
119
+
120
+ The normal handoff is the packet directory path plus a compact status summary.
121
+ Open `packet.md` first and follow machine-readable or review links only when you
122
+ need an audit trail. Do not copy `raw/` dossiers or worker reasoning into the
123
+ next model's context by default.
124
+
125
+ ## Claim States
126
+
127
+ Claims use categorical evidence states rather than generated confidence
128
+ percentages:
129
+
130
+ - `provisional`: compiled but not mechanically validated;
131
+ - `supported`: cited evidence and locators validate, without completed
132
+ independent semantic verification;
133
+ - `verified`: required independent review reopened and affirmed the sources,
134
+ with no unresolved material challenge;
135
+ - `contested`: credible counterevidence or incompatible interpretations remain;
136
+ - `unresolved`: available evidence cannot settle the claim; and
137
+ - `unsupported`: valid supporting evidence is absent or verification failed.
138
+
139
+ A quick packet never promotes a claim to `verified`. Stronger profiles can do
140
+ so only when their required review artifacts and receipts validate.
141
+
142
+ When an independent semantic review rejects a proposed claim, the reconciler
143
+ transitions it to `unsupported` rather than deleting it. This preserves the
144
+ claim statement, cited evidence, and transition history in `claims.json`, and
145
+ renders the finding under Contradictions and Qualifications.
146
+
147
+ An adversarial challenge transitions a claim to `contested`. A run with
148
+ contested claims may publish as `complete` when all declared questions and
149
+ claims are resolved or characterized; contested claims are rendered under
150
+ Contradictions and Qualifications. If an unresolved challenge represents an
151
+ unanswered question or missing source evidence that leaves investigation
152
+ incomplete, it is recorded as a material gap in `manifest.gaps` and the run
153
+ publishes as `partial`.
154
+
155
+ ## Selective Blindness and Authority
156
+
157
+ Gatherers write separate dossiers. Verifiers receive only claim statements,
158
+ display excerpts, typed locators, and the source descriptors required to reopen
159
+ them. Adversarial reviewers receive the declared scope, questions, and
160
+ provisional statements. Neither pass receives gatherer reasoning, synthesis
161
+ prose, dossier paths, or earlier review conclusions.
162
+
163
+ Each lane receives one explicit authority envelope and one unique output path.
164
+ Its enforcement is recorded as:
165
+
166
+ - `provider-enforced`: the host or tool technically restricts reads and writes;
167
+ - `contract-enforced`: an audited leaf-worker contract restricts local reads
168
+ and the sole packet write path; or
169
+ - `unavailable`: a safe read-only boundary cannot be established.
170
+
171
+ By default, local repository and file work may use contract enforcement. Pass
172
+ `--strict` to require provider enforcement for every lane. Mutation-capable
173
+ source tools are unavailable unless their interface enforces a read-only
174
+ operation.
175
+
176
+ ## Partial and Failed Runs
177
+
178
+ A structurally valid run can publish an honest `partial` packet. The manifest
179
+ and `packet.md` then identify the requested and achieved profiles, failed or
180
+ omitted passes, material gaps, affected claims, and required assurance
181
+ downgrades. A run may be partial even when it achieved the requested profile if
182
+ a material evidence gap remains.
183
+
184
+ Before assurance or publication, candidate runs are normalized into a deeply
185
+ immutable `ValidatedRun`. To prevent premature or invalid promotion,
186
+ `ValidatedRun` is only constructed and exposed when a candidate generation is
187
+ structurally valid and publishable (`complete` or `partial`). Non-publishable
188
+ runs (`failed`, `running`, `preparing`, `awaiting-approval`) withdraw any
189
+ existing `packet.md` under the unchanged-root guard, leave no `ValidatedRun`,
190
+ and cause the exported renderer to fail closed with `PACKET_NOT_PUBLISHABLE`.
191
+
192
+ If the manifest, ledger, topology, receipts, source identities, or publication
193
+ boundary cannot be validated, the run is `failed`. It may retain safe raw
194
+ diagnostics, but it does not publish a misleading `packet.md`.
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.53",
3
- "docs-config": "0.2.53",
4
- "docs-theme": "0.2.53",
5
- "docs-transforms": "0.2.53"
2
+ "cli": "0.2.54",
3
+ "docs-config": "0.2.54",
4
+ "docs-theme": "0.2.54",
5
+ "docs-transforms": "0.2.54"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-dispatch-subagents
3
- version: 1.2.4
3
+ version: 1.2.5
4
4
  description: Use when an OAT skill or workflow needs provider-neutral selection, launch, recovery, or evidence for bounded subagent work without project lifecycle policy.
5
5
  disable-model-invocation: true
6
6
  user-invocable: false
@@ -129,6 +129,11 @@ decomposition.
129
129
  The optional policy and ceiling are already-resolved inputs. Do not infer where
130
130
  they came from or resolve project state to obtain them.
131
131
 
132
+ The optional `operation` is `prepare`, `execute`, or `dispatch`. `prepare` and
133
+ `execute` form the approval-bound two-step path below. When `operation` is
134
+ omitted, treat it as `operation: dispatch` and preserve the existing one-step
135
+ selection-and-launch path for backwards compatibility.
136
+
132
137
  ## Native Dispatch Lineage
133
138
 
134
139
  For a project-aware dispatch, the calling workflow records native dispatch
@@ -370,9 +375,99 @@ Before explicit selection:
370
375
  Do not launch a diagnostic child solely to obtain a catalog the provider
371
376
  cannot expose before selection. Record the visibility timing instead.
372
377
 
378
+ ## Approval-Bound Preparation and Execution
379
+
380
+ Use this path when a caller must show the exact selection and execution
381
+ envelope for approval before any child starts. The caller still owns the user
382
+ interaction; this skill produces and validates the approval evidence.
383
+
384
+ ### `operation: prepare`
385
+
386
+ Preparation is selection-only. It must observe the live catalog in the exact
387
+ dispatch context and return a complete prepared dispatch record without
388
+ launching, reserving capacity, or obtaining a child handle.
389
+
390
+ Before selecting a target:
391
+
392
+ 1. Classify all planned and conditional waves before selection. Record every
393
+ wave's `task_class` and `model_class_floor`.
394
+ 2. Compute the run-wide maximum model-class floor using the durable task-class
395
+ order. Conditional waves count even when the caller may later skip them.
396
+ 3. Select one exact target at or above that maximum floor and pin it across all
397
+ prepared waves. The pin includes provider, dispatch context, route, role,
398
+ model and selector granularity, effort, reasoning mode, and service tier.
399
+ Do not weaken a wave floor, split the target, or silently substitute a
400
+ cheaper target. If one target cannot satisfy every wave, return a blocked
401
+ preparation.
402
+ 4. Materialize each wave's exact authority, deadline, retry limit,
403
+ concurrency, lane cap, scopes, lane IDs, context controls, fallback, and
404
+ canonical redacted payload digest. Record the catalog observation identity
405
+ and the fingerprint of the relevant selectable facts.
406
+ 5. Construct the canonical approval projection defined in
407
+ `references/record-schema.md`, return `dispatch_state: prepared`, and stop.
408
+
409
+ The calling workflow may combine prepared wave records into a run manifest,
410
+ but it must preserve the run ID, maximum floor, pinned target, per-wave axes,
411
+ canonical approval fingerprint, and prepared timestamp byte-for-byte.
412
+
413
+ ### Approval
414
+
415
+ The caller presents the complete approval projection and records explicit
416
+ approval by changing only `dispatch_state`, `approved_at`, and the approval
417
+ evidence fields allowed by the schema. Approval is valid only for the exact
418
+ canonical fingerprint. Editing any bound axis creates a new preparation; it
419
+ does not update an already approved record in place.
420
+
421
+ ### `operation: execute`
422
+
423
+ Execution accepts one approved prepared record. Before invoking the launcher:
424
+
425
+ 1. Validate the prepared-record version, legal state, approval timestamp, and
426
+ approval fingerprint against the unchanged canonical projection.
427
+ 2. Re-observe the live catalog in the same dispatch context and compare the
428
+ current relevant selectable facts with the prepared observation. A new
429
+ unrelated candidate alone is not relevant drift; removal, renaming,
430
+ semantic change, or loss of selectability for an approved control is.
431
+ 3. Re-resolve the actual launch controls without choosing alternatives and
432
+ compare every approval-bound axis exactly. Provider-native opaque values
433
+ stay byte-for-byte exact.
434
+ 4. Refuse launch and mark the record `stale` when any comparison differs. The
435
+ caller must run `prepare` again and obtain reapproval.
436
+ 5. Launch the approved payload once. Record `accepted` only from positive
437
+ launcher acceptance; otherwise record `not-accepted`.
438
+
439
+ A model change is model drift. An effort change is effort drift. A provider
440
+ change is provider drift. A route change is route drift. A role change is role
441
+ drift. A service tier change is service tier drift. An authority change is
442
+ authority drift. A deadline change is deadline drift. A concurrency change is
443
+ concurrency drift. A lane cap change is lane cap drift. A relevant catalog
444
+ change is catalog drift. The same fail-closed rule covers reasoning mode,
445
+ selector granularity, retry limit, writable roots, context controls, fallback,
446
+ wave topology, scope, lane identity, payload digest, floor, or pinned-target
447
+ drift. Never adjust one of these controls to make execution fit the current
448
+ surface.
449
+
450
+ Launch acceptance remains terminal for replacement eligibility. After a
451
+ prepared launch is accepted, no alternate route, replacement, or target
452
+ substitution is allowed. Only continuation through the already accepted handle
453
+ is permitted. A linked fresh same-target launch is forbidden, regardless of
454
+ the generic caller lifecycle recovery exception. If that accepted handle is
455
+ lost or cannot resume, record the terminal outcome and stop; the approval-bound
456
+ record never authorizes a second child.
457
+
458
+ ### One-Step Backwards Compatibility
459
+
460
+ Existing callers may omit `operation` or provide `operation: dispatch`. This
461
+ retains exactly the current one-step selection-and-launch flow in
462
+ Full-Information Selection: observe, select, record, and launch once in the
463
+ same operation. Do not require those callers to invent a prepared record,
464
+ approval timestamp, or approval fingerprint. New approval-bound callers must
465
+ use `prepare` and `execute`; they may not collapse that path into `dispatch`.
466
+
373
467
  ## Full-Information Selection
374
468
 
375
- For every dispatch:
469
+ For every legacy one-step dispatch and for the selection portion of
470
+ `operation: prepare`:
376
471
 
377
472
  1. Validate the caller request and capability state.
378
473
  2. Resolve provider, context, role class, optional task class and model-class
@@ -387,8 +482,14 @@ For every dispatch:
387
482
  7. Record route, selection source, selection reason, candidates, catalog
388
483
  source, model, effort, reasoning mode, service tier, guidance version,
389
484
  authority, and deadline.
390
- 8. Launch once.
391
- 9. Record launch acceptance separately from child outcome and runtime identity.
485
+ 8. For `operation: prepare`, construct the prepared record and return without
486
+ launch. Do not continue into the legacy launch steps.
487
+ 9. For a legacy one-step dispatch only, launch once.
488
+ 10. Record launch acceptance separately from child outcome and runtime identity.
489
+
490
+ The following diagram is the legacy one-step flow. Approval-bound preparation
491
+ stops after selection and record construction; its later `execute` operation
492
+ performs the separately approved launch.
392
493
 
393
494
  ```mermaid
394
495
  flowchart TD