@open-agent-toolkit/cli 0.2.57 → 0.2.59
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/assets/agents/oat-phase-implementer.md +44 -2
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/configuration.md +16 -0
- package/assets/docs/cli-utilities/workflow-gates.md +88 -3
- package/assets/docs/contributing/skills.md +27 -5
- package/assets/docs/contributing/smoke-testing.md +44 -0
- package/assets/docs/provider-sync/commands.md +23 -0
- package/assets/docs/workflows/projects/autonomy.md +5 -2
- package/assets/docs/workflows/projects/dispatch-ceiling.md +43 -7
- package/assets/docs/workflows/projects/implementation-execution.md +6 -3
- package/assets/docs/workflows/projects/lifecycle.md +4 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-project-autonomous/SKILL.md +1 -1
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +45 -38
- package/assets/skills/oat-project-design/SKILL.md +24 -5
- package/assets/skills/oat-project-discover/SKILL.md +10 -5
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +45 -38
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +43 -9
- package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +14 -8
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +45 -38
- package/assets/skills/oat-project-implement/references/phase-execution.md +7 -3
- package/assets/skills/oat-project-import-plan/SKILL.md +29 -4
- package/assets/skills/oat-project-next/SKILL.md +29 -2
- package/assets/skills/oat-project-plan/SKILL.md +29 -4
- package/assets/skills/oat-project-plan-writing/SKILL.md +95 -1
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +45 -38
- package/assets/skills/oat-project-progress/SKILL.md +12 -1
- package/assets/skills/oat-project-quick-start/SKILL.md +29 -4
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +45 -38
- package/assets/skills/oat-project-review-provide/SKILL.md +13 -6
- package/assets/skills/oat-project-review-provide-remote/SKILL.md +12 -5
- package/assets/templates/state.md +4 -1
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +102 -8
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +16 -1
- package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
- package/dist/commands/project/dispatch-ceiling/index.js +10 -1
- package/dist/commands/remove/skill/remove-skill.d.ts.map +1 -1
- package/dist/commands/remove/skill/remove-skill.js +10 -1
- package/dist/commands/shared/frontmatter.d.ts +32 -1
- package/dist/commands/shared/frontmatter.d.ts.map +1 -1
- package/dist/commands/shared/frontmatter.js +92 -0
- package/dist/commands/status/index.d.ts.map +1 -1
- package/dist/commands/status/index.js +8 -1
- package/dist/commands/sync/apply.d.ts.map +1 -1
- package/dist/commands/sync/apply.js +40 -6
- package/dist/commands/sync/index.d.ts.map +1 -1
- package/dist/commands/sync/index.js +11 -17
- package/dist/commands/sync/sync.types.d.ts +6 -6
- package/dist/commands/sync/sync.types.d.ts.map +1 -1
- package/dist/config/resolve.d.ts +16 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +16 -8
- package/dist/engine/execute-plan.d.ts.map +1 -1
- package/dist/engine/execute-plan.js +6 -0
- package/dist/manifest/index.d.ts +2 -1
- package/dist/manifest/index.d.ts.map +1 -1
- package/dist/manifest/index.js +1 -1
- package/dist/manifest/manager.d.ts +40 -0
- package/dist/manifest/manager.d.ts.map +1 -1
- package/dist/manifest/manager.js +35 -0
- package/package.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-phase-implementer
|
|
3
|
-
version: 1.1.
|
|
3
|
+
version: 1.1.3
|
|
4
4
|
description: Implements one plan phase end-to-end, commits each task separately, self-checks between tasks, and handles bounded review fixes when resumed by oat-project-implement.
|
|
5
5
|
tools: Read, Write, Edit, Bash, Grep, Glob, Task
|
|
6
6
|
color: cyan
|
|
@@ -358,6 +358,46 @@ Do not launch a child, continue sequentially, review, or repair the invalid run.
|
|
|
358
358
|
|
|
359
359
|
### 2. Execute Tasks in Plan Order
|
|
360
360
|
|
|
361
|
+
#### Cross-Cutting Option Sweep
|
|
362
|
+
|
|
363
|
+
Before the first edit of a task that adds, renames, retypes, or changes the
|
|
364
|
+
default or meaning of an option, argument, flag, configuration field, schema
|
|
365
|
+
property, or policy value consumed outside the module that defines it,
|
|
366
|
+
inventory that symbol repository-wide. A value that is defined, read, and
|
|
367
|
+
written only inside its own module does not trigger this rule.
|
|
368
|
+
|
|
369
|
+
The inventory is repository-wide. It is never limited to the declared file
|
|
370
|
+
boundary and never limited to production source: sweep declarations and type
|
|
371
|
+
definitions, constructors and factories, adapters and wrappers, serializers and
|
|
372
|
+
deserializers, persisted schemas and templates, fixtures, mocks, snapshots, and
|
|
373
|
+
tests, and every call site that constructs, forwards, or defaults the value.
|
|
374
|
+
Use `rg` or an equivalent repository-wide search together with whatever
|
|
375
|
+
language-aware check this repository already provides; no single tool is proof
|
|
376
|
+
of completeness, so search the property name, its serialized spelling, and its
|
|
377
|
+
accessors.
|
|
378
|
+
|
|
379
|
+
A declared file list is review scope, not a correctness boundary. When the
|
|
380
|
+
sweep finds files outside that list:
|
|
381
|
+
|
|
382
|
+
- **Widen mechanically and proceed** when every discovered file is already
|
|
383
|
+
required by the declared task outcome, the edit to it is mechanical
|
|
384
|
+
propagation of the same value, and no sibling or active parallel task owns
|
|
385
|
+
it. The effective task boundary is the declared list plus those mechanically
|
|
386
|
+
discovered files. Record every addition in the Task Outcomes `Files` cell and
|
|
387
|
+
in Self-Review Observations, and never edit `plan.md` to match.
|
|
388
|
+
- **Stop and report** the exact discovered file set and the ownership conflict
|
|
389
|
+
when the expansion would change the declared task outcome, cross sibling or
|
|
390
|
+
parallel-lane ownership, invalidate a plan-declared parallel group, or
|
|
391
|
+
require a new design, architecture, or public-behavior decision.
|
|
392
|
+
|
|
393
|
+
Threading an already-agreed option through four call sites that would otherwise
|
|
394
|
+
keep the stale default is mechanical propagation. Adding new behavior at a
|
|
395
|
+
discovered call site, changing an unrelated default, or deciding how two lanes
|
|
396
|
+
divide a shared file is not, and stops for direction. This pre-edit rule
|
|
397
|
+
matches the mechanically derived, in-phase widening already allowed during
|
|
398
|
+
post-commit recovery, and it never relaxes the standing rule against scope
|
|
399
|
+
expansion beyond the phase.
|
|
400
|
+
|
|
361
401
|
For every task:
|
|
362
402
|
|
|
363
403
|
1. Record `PRE_TASK_HEAD`.
|
|
@@ -380,7 +420,9 @@ For every task:
|
|
|
380
420
|
mutate Git config or use `--no-verify`.
|
|
381
421
|
9. Verify:
|
|
382
422
|
- HEAD is exactly one commit after `PRE_TASK_HEAD`;
|
|
383
|
-
- the commit changes only
|
|
423
|
+
- the commit changes only files in the effective task boundary, which is
|
|
424
|
+
the declared task files plus any mechanical additions permitted by, and
|
|
425
|
+
reported under, the cross-cutting option sweep;
|
|
384
426
|
- every task verification passed; and
|
|
385
427
|
- the worktree is clean.
|
|
386
428
|
10. Perform a brief between-task transition check before starting the next
|
|
@@ -367,6 +367,22 @@ Repo-local and user config can also hold workflow defaults, including
|
|
|
367
367
|
example, one user may prefer `claude -p` as a gate target while another prefers
|
|
368
368
|
`codex exec`.
|
|
369
369
|
|
|
370
|
+
### Per-project gate posture
|
|
371
|
+
|
|
372
|
+
Project state is a separate surface from the five config layers. One project can
|
|
373
|
+
disable a configured lifecycle gate for itself through
|
|
374
|
+
`oat_skill_gate_overrides` in that project's `state.md`, keyed by gate-aware
|
|
375
|
+
skill name with the single permitted value `disabled`.
|
|
376
|
+
|
|
377
|
+
Config layers decide whether a gate exists; the project override then decides
|
|
378
|
+
whether an existing gate runs for that project. An override never creates
|
|
379
|
+
configuration, never mutates any config layer, and is never written by a
|
|
380
|
+
non-interactive run. Resolve it with
|
|
381
|
+
`oat gate resolve <skill> --project <path-or-name> --json`; without `--project`
|
|
382
|
+
the command keeps its original raw output. See
|
|
383
|
+
[Workflow gates](./workflow-gates.md) for the full resolution envelope and the
|
|
384
|
+
phase-review and autonomous exclusions.
|
|
385
|
+
|
|
370
386
|
In practice, you usually inspect these via:
|
|
371
387
|
|
|
372
388
|
```bash
|
|
@@ -68,6 +68,83 @@ in skill frontmatter with `oat_gateable: true`, and
|
|
|
68
68
|
`oat internal validate-oat-skills` warns when config targets a missing or
|
|
69
69
|
non-gateable skill.
|
|
70
70
|
|
|
71
|
+
### Per-project gate overrides
|
|
72
|
+
|
|
73
|
+
Gate configuration is shared, but one project can opt out of a configured
|
|
74
|
+
lifecycle gate without changing any config layer. The override lives only in
|
|
75
|
+
that project's `state.md`:
|
|
76
|
+
|
|
77
|
+
```yaml
|
|
78
|
+
oat_skill_gate_overrides:
|
|
79
|
+
oat-project-implement: disabled
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The map is strict. Keys are gate-aware skill names and the only permitted value
|
|
83
|
+
is the literal `disabled`. Arrays, booleans, `enabled`, unknown values,
|
|
84
|
+
duplicate keys, and malformed maps are rejected with the offending project state
|
|
85
|
+
path. An absent map means follow configuration; keeping every gate leaves the
|
|
86
|
+
map absent.
|
|
87
|
+
|
|
88
|
+
Override keys are accepted only for skills that declare `oat_gateable: true`.
|
|
89
|
+
A configured gate may still be resolved and executed for a lifecycle skill that
|
|
90
|
+
is not gate-aware — `oat-project-discover` and `oat-project-design` are the
|
|
91
|
+
current examples — but because no override key for such a skill is accepted,
|
|
92
|
+
their configured gates apply to every project and cannot be disabled per
|
|
93
|
+
project.
|
|
94
|
+
|
|
95
|
+
Precedence is layered, not merged: config layers decide whether a gate exists
|
|
96
|
+
at all, and the project override then decides whether an existing gate runs for
|
|
97
|
+
that project. An override never creates configuration, so a project may record
|
|
98
|
+
an override for a skill that has no configured gate; the gate stays absent.
|
|
99
|
+
Overrides never mutate shared, local, or user config, and config changes never
|
|
100
|
+
rewrite a project's override.
|
|
101
|
+
|
|
102
|
+
Interactive project setup offers a keep-or-disable choice per configured gate,
|
|
103
|
+
one skill at a time; there is no single switch that disables every gate.
|
|
104
|
+
Non-interactive runs never prompt and never write a new map, and an explicit
|
|
105
|
+
existing map is preserved unchanged on resume and import.
|
|
106
|
+
|
|
107
|
+
Resolution is opt-in. Without `--project`, `oat gate resolve` keeps returning
|
|
108
|
+
the raw `GateConfig | null` that existing consumers parse:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
oat gate resolve oat-project-implement --json
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
With project context it returns a discriminated envelope instead:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
oat gate resolve oat-project-implement --project "$PROJECT_PATH" --json
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The envelope's `resolution` is one of three values:
|
|
121
|
+
|
|
122
|
+
| `resolution` | Meaning | `configuredGate` | `effectiveGate` |
|
|
123
|
+
| -------------------------------- | ----------------------------------------- | ---------------- | --------------- |
|
|
124
|
+
| `configured` | A configured gate runs for this project. | the gate | the gate |
|
|
125
|
+
| `configured_disabled_by_project` | Configured, but this project disabled it. | the gate | `null` |
|
|
126
|
+
| `not_configured` | No gate is configured for this skill. | `null` | `null` |
|
|
127
|
+
|
|
128
|
+
`configured_disabled_by_project` retains `configuredGate` so evidence of a
|
|
129
|
+
deliberate opt-out can never be mistaken for absent configuration. It also
|
|
130
|
+
carries `configSource` and a `projectOverride` record naming the
|
|
131
|
+
`state.md:oat_skill_gate_overrides` source.
|
|
132
|
+
|
|
133
|
+
`configSource` reports the layer that owned the decision. For
|
|
134
|
+
`not_configured` it is the layer that explicitly declared the skill `null`, and
|
|
135
|
+
`null` only when no layer mentions the skill at all, so a deliberate
|
|
136
|
+
layer-level disable stays distinguishable from an absent declaration.
|
|
137
|
+
`configuredGate` is `null` in both cases, so neither reads as configured.
|
|
138
|
+
|
|
139
|
+
Disabled is a posture, not an outcome. A project-disabled gate launches no
|
|
140
|
+
process and never enters the passed, missing, or failed branches. Project
|
|
141
|
+
progress reports every active override by skill key so the deliberate posture
|
|
142
|
+
stays visible to reviewers.
|
|
143
|
+
|
|
144
|
+
This mechanism covers configured lifecycle skill gates only. It does not affect
|
|
145
|
+
the optional `oat_phase_review_gate`, HiLL policy, or autonomous design-gate
|
|
146
|
+
behavior, and it cannot disable every gate with one project-wide boolean.
|
|
147
|
+
|
|
71
148
|
### Implementation exit-gate closeout
|
|
72
149
|
|
|
73
150
|
For `oat-project-implement`, the configured skill gate is a final, resumable
|
|
@@ -82,14 +159,22 @@ configured command. The state records:
|
|
|
82
159
|
|
|
83
160
|
- `pending`, `allowed`, `blocked`, or `stale` status;
|
|
84
161
|
- a `configured` or `no_gate` resolution;
|
|
85
|
-
- `passed`, `warned`, `prompt_approved`, or `no_gate`
|
|
162
|
+
- `passed`, `warned`, `prompt_approved`, `project_disabled`, or `no_gate`
|
|
163
|
+
allowed dispositions;
|
|
86
164
|
- the resolved configuration fingerprint, reviewed HEAD, implementation
|
|
87
165
|
fingerprint, gate run, envelope, and receive provenance; and
|
|
88
166
|
- launch and receive reconciliation data needed to resume without duplicating
|
|
89
167
|
an accepted run or completed receive.
|
|
90
168
|
|
|
91
|
-
|
|
92
|
-
`allowed/no_gate` with `disposition: no_gate`.
|
|
169
|
+
Only a `not_configured` resolution is explicit success for that closeout
|
|
170
|
+
generation: `allowed/no_gate` with `disposition: no_gate`. A null, missing,
|
|
171
|
+
malformed, or unrecognized resolver result fails closed as unresolved and is
|
|
172
|
+
never treated as no gate. A gate this project disabled
|
|
173
|
+
persists `allowed/configured` with `disposition: project_disabled`, the
|
|
174
|
+
configured command retained as never-executed evidence, null launch and receive
|
|
175
|
+
provenance, and a `project_override` record. `config_fingerprint` covers the
|
|
176
|
+
resolved override state, so re-enabling the gate changes the fingerprint and a
|
|
177
|
+
stored `project_disabled` result is routed as stale instead of reused. Configured success becomes
|
|
93
178
|
`allowed/passed`; `warn` and an explicit `prompt` continuation persist their
|
|
94
179
|
own allowed dispositions only for a validated, receive-eligible `blocked`
|
|
95
180
|
envelope after eligible receive completes durably. Unresolved, malformed,
|
|
@@ -277,15 +277,37 @@ Use `create-agnostic-skill` or `create-oat-skill` as the starting point; both in
|
|
|
277
277
|
|
|
278
278
|
## Gate-aware skills
|
|
279
279
|
|
|
280
|
-
A skill that supports configured final gates
|
|
280
|
+
A skill that supports configured final gates should declare `oat_gateable: true`
|
|
281
281
|
in frontmatter and include a final Gate Execution step in its process contract.
|
|
282
|
-
Without both pieces, a configured `workflow.gates.skills.<skill>` entry
|
|
283
|
-
|
|
282
|
+
Without both pieces, a configured `workflow.gates.skills.<skill>` entry raises a
|
|
283
|
+
`Configured gate targets skill without oat_gateable: true` validation warning.
|
|
284
|
+
|
|
285
|
+
The warning does not make the gate inert. `oat_gateable` governs per-project
|
|
286
|
+
override eligibility, not executability: `oat gate resolve` runs the same
|
|
287
|
+
lookup for every skill name, so a configured gate on a non-gate-aware skill
|
|
288
|
+
still resolves as `configured` and still executes if that skill carries a Gate
|
|
289
|
+
Execution step. `oat-project-discover` and `oat-project-design` are the current
|
|
290
|
+
examples. Because no `oat_skill_gate_overrides` key is accepted for a skill
|
|
291
|
+
outside `oat_gateable`, their configured gates apply to every project and can
|
|
292
|
+
never resolve `configured_disabled_by_project`. Prefer declaring
|
|
293
|
+
`oat_gateable: true` for any skill whose gate should be disableable per project.
|
|
284
294
|
|
|
285
295
|
The Gate Execution step should:
|
|
286
296
|
|
|
287
|
-
1. Run `oat gate resolve <this-skill> --json
|
|
288
|
-
|
|
297
|
+
1. Run `oat gate resolve <this-skill> --project "$PROJECT_PATH" --json`
|
|
298
|
+
(`$PROJECT_PATH` is the resolved project path exported in step 3).
|
|
299
|
+
Project context is required. Without `--project` the command returns the
|
|
300
|
+
legacy raw gate and can never report a project override, so the skill would
|
|
301
|
+
silently run a gate the project deliberately disabled.
|
|
302
|
+
2. Handle all three `resolution` values explicitly:
|
|
303
|
+
- `configured` - run `effectiveGate` exactly as configured.
|
|
304
|
+
- `configured_disabled_by_project` - the project disabled this configured gate. Do not launch any process; emit `configured but disabled by project override`, including the project path and the `projectOverride` source, and finish the skill. The returned `configuredGate` is evidence only and is never executed.
|
|
305
|
+
- `not_configured` - no gate is configured; finish the skill.
|
|
306
|
+
|
|
307
|
+
A null, missing, malformed, or unrecognized result is an operational failure
|
|
308
|
+
that fails closed as unresolved. Never treat it as "no gate configured." See
|
|
309
|
+
[Per-project gate overrides](../cli-utilities/workflow-gates.md#per-project-gate-overrides).
|
|
310
|
+
|
|
289
311
|
3. Export the resolved path with `export PROJECT_PATH` before launching the
|
|
290
312
|
command shell.
|
|
291
313
|
4. For `oat gate review`, require the configured command to use
|
|
@@ -249,6 +249,50 @@ journaled worktree that is already gone from disk is still recoverable; a
|
|
|
249
249
|
contradictory or unjournaled resource fails closed with a refusal rather than
|
|
250
250
|
guessing.
|
|
251
251
|
|
|
252
|
+
### Reserved versus registered ownership
|
|
253
|
+
|
|
254
|
+
The deterministic provider's nested phase worktrees are journaled as a
|
|
255
|
+
transaction, so an interruption can no longer leave an _unjournaled_ child.
|
|
256
|
+
It can still leave state cleanup refuses by design — an interruption inside
|
|
257
|
+
`git worktree add` may leave a path with no Git registration, and that is
|
|
258
|
+
refused rather than deleted.
|
|
259
|
+
|
|
260
|
+
Other nested creators still register directly after creation. Their entries are
|
|
261
|
+
read as ownership the same way, but they are validated more loosely: a
|
|
262
|
+
directly-registered entry carries no reservation origin, so it is not subject
|
|
263
|
+
to the run-directory containment and run-baseline checks a finalized
|
|
264
|
+
reservation gets. Their creation transaction has not been migrated yet.
|
|
265
|
+
|
|
266
|
+
The two reservation states are:
|
|
267
|
+
|
|
268
|
+
- **`reserved`** — the exact branch, worktree path, marker path, expected
|
|
269
|
+
baseline, shared Git directory, and run identity are written to the manifest
|
|
270
|
+
_before_ `git worktree add` runs. The entry is durable intent, not ownership.
|
|
271
|
+
- **`registered`** — the child's marker, Git worktree registration, branch,
|
|
272
|
+
HEAD ancestry, and shared Git directory have all been corroborated.
|
|
273
|
+
Finalization only flips a matching reservation; it never rewrites what was
|
|
274
|
+
reserved, and a child contradicting its reservation is refused.
|
|
275
|
+
|
|
276
|
+
Cleanup reconciles a reservation only against exactly matching state. If
|
|
277
|
+
neither the branch nor the worktree was ever created, nothing is deleted and
|
|
278
|
+
the reservation goes away with the manifest. If both exist exactly as reserved,
|
|
279
|
+
they are removed after baseline, shared Git directory, and run-marker
|
|
280
|
+
corroboration. If only the branch survives, its tip must equal the reserved
|
|
281
|
+
baseline exactly. Anything else — an occupied path Git never registered, a
|
|
282
|
+
different branch at the reserved path, a missing marker — fails closed.
|
|
283
|
+
|
|
284
|
+
Manifests written before this transaction existed use ownership journal schema
|
|
285
|
+
version 1. They stay readable and all of their entries read as already
|
|
286
|
+
`registered`. Such a manifest is never rewritten to a newer schema version and
|
|
287
|
+
never gains a reservation, and a v1 entry claiming reserved state is refused
|
|
288
|
+
rather than treated as owned. Direct registration may still append a
|
|
289
|
+
`registered` entry to one, which leaves its schema version untouched.
|
|
290
|
+
|
|
291
|
+
Nothing is ever pruned by `smoke-*` name, path prefix, run age, or ancestry
|
|
292
|
+
alone. Without an ownership lease the runner cannot tell a stale run from an
|
|
293
|
+
active one, so it refuses instead of guessing and leaves the state for you to
|
|
294
|
+
resolve.
|
|
295
|
+
|
|
252
296
|
To finish a stalled run, re-run the matching `--stage collect` (collection-only
|
|
253
297
|
triggers cleanup) or start a fresh run; the runner reconciles journaled
|
|
254
298
|
resources on the next errored or collection-bearing invocation. If cleanup fails
|
|
@@ -88,6 +88,29 @@ Key behavior:
|
|
|
88
88
|
`versionSkew` array (`{ scope, producingVersion, invokingVersion }`) in both
|
|
89
89
|
`--dry-run` and apply envelopes; a scope without skew is omitted from the
|
|
90
90
|
array.
|
|
91
|
+
- When a run's only effect is that restamp — no planned operations and no
|
|
92
|
+
failures, but skew present — apply reports
|
|
93
|
+
`Manifest version refreshed; no content changes required.` instead of
|
|
94
|
+
`No changes required.`, so a manifest write is never described as a no-op.
|
|
95
|
+
|
|
96
|
+
`oat sync` is not the only command that replaces a manifest's producer version.
|
|
97
|
+
`oat init`, `oat remove skill`, and `oat status` each capture the manifest's
|
|
98
|
+
pre-mutation `oatVersion` while loading and planning, compare it with the
|
|
99
|
+
invoking CLI version, and log the same advisory immediately before a qualifying
|
|
100
|
+
save when the two differ:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
Manifest version restamp [init user]: manifest produced by oat "0.2.58" will be restamped to oat "0.2.59".
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The advisory sits immediately before the save, so a run that aborts earlier
|
|
107
|
+
never announces a restamp it did not perform; a save that fails after the
|
|
108
|
+
advisory still leaves the manifest unrestamped. An equal or absent version stays
|
|
109
|
+
quiet. JSON mode suppresses the human warning; `oat init` and `oat remove skill`
|
|
110
|
+
report the applied restamps under a top-level `manifestVersionRestamps` array of
|
|
111
|
+
`{ scope, producingVersion, invokingVersion }` entries. The `oat remove skill`
|
|
112
|
+
dry-run payload omits the field rather than naming a restamp no save will
|
|
113
|
+
perform.
|
|
91
114
|
|
|
92
115
|
Preview project and user cleanup before applying it:
|
|
93
116
|
|
|
@@ -136,8 +136,11 @@ At final closeout, autonomy follows the same authoritative order as an
|
|
|
136
136
|
interactive run: final verification, mandatory final lifecycle review,
|
|
137
137
|
configured implementation exit gate, pre-approval sequence, final HiLL
|
|
138
138
|
approval, post-approval sequence, then implementation completion and success
|
|
139
|
-
output. A
|
|
140
|
-
the sequence starts
|
|
139
|
+
output. A `not_configured` resolution persists an explicit no-gate allowance
|
|
140
|
+
before the sequence starts; a null, missing, or unrecognized resolver result
|
|
141
|
+
fails closed as unresolved. A gate this project disabled persists an
|
|
142
|
+
`allowed/configured` result with `disposition: project_disabled` and never
|
|
143
|
+
launches the configured command.
|
|
141
144
|
|
|
142
145
|
Autonomy does not turn an ordinary independent review into configured-gate
|
|
143
146
|
provenance. A configured review must produce a gate-originated artifact with
|
|
@@ -438,7 +438,8 @@ write authority. See
|
|
|
438
438
|
## Dispatch Report V1 and Producer Provenance
|
|
439
439
|
|
|
440
440
|
Resolver calls that pass `--report-scope` and `--report-action` include a
|
|
441
|
-
`dispatchReport` object in JSON output
|
|
441
|
+
`dispatchReport` object in JSON output, plus the additive `dispatchStamp`
|
|
442
|
+
string described below. Consumers must require
|
|
442
443
|
`dispatchReport.schemaVersion: 1` before dispatch. The report keeps these
|
|
443
444
|
concerns separate:
|
|
444
445
|
|
|
@@ -485,18 +486,53 @@ also retain a parseable compatibility stamp for later review gates:
|
|
|
485
486
|
Dispatch: scope=p06-t03 action=implementation role=implementer producer=gpt-5.6-sol provenance=declared model_axis=selected:gpt-5.6-sol effort_axis=selected:high dispatch_policy=high dispatch_ceiling=high target=oat-phase-implementer-gpt-5-6-sol-high
|
|
486
487
|
```
|
|
487
488
|
|
|
488
|
-
|
|
489
|
-
`
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
`declared`, `observed`, `inferred`, or `unknown`. Selected model and effort axes
|
|
493
|
-
can remain exact even when runtime producer identity is not reported.
|
|
489
|
+
`producer` is the runtime model slug when OAT can establish it; otherwise it is
|
|
490
|
+
`unknown`. `provenance` is `declared`, `observed`, `inferred`, or `unknown`.
|
|
491
|
+
Selected model and effort axes can remain exact even when runtime producer
|
|
492
|
+
identity is not reported.
|
|
494
493
|
|
|
495
494
|
Before launching an implementation, fix, or reviewer, surface the structured
|
|
496
495
|
notices in `dispatchReport.notices` and render the report. Structured notices
|
|
497
496
|
and runtime disclosure use the effective target returned by that resolver call,
|
|
498
497
|
never a target inferred from the bundled recommendation version.
|
|
499
498
|
|
|
499
|
+
### The additive `dispatchStamp` field
|
|
500
|
+
|
|
501
|
+
JSON responses that carry `dispatchReport` also carry `dispatchStamp`, a single
|
|
502
|
+
canonical string produced by the same formatter that owns the grammar above:
|
|
503
|
+
|
|
504
|
+
```json
|
|
505
|
+
{
|
|
506
|
+
"status": "resolved",
|
|
507
|
+
"dispatchReport": { "schemaVersion": 1 },
|
|
508
|
+
"dispatchStamp": "Dispatch: scope=p06-t03 action=implementation role=implementer ..."
|
|
509
|
+
}
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
Field eligibility matches report eligibility exactly. The field is present when
|
|
513
|
+
and only when `dispatchReport` is present, so non-report resolver calls and
|
|
514
|
+
error envelopes never carry it. `DispatchReportV1`, its schema version, and the
|
|
515
|
+
stamp grammar are unchanged; the field is purely additive.
|
|
516
|
+
|
|
517
|
+
Eligibility tracks report presence, not dispatch authorization or exit code. A
|
|
518
|
+
`status: blocked` response that was asked for report context therefore carries
|
|
519
|
+
both `dispatchReport` and `dispatchStamp` while still exiting `1`: the stamp
|
|
520
|
+
records what OAT resolved, and a blocked resolution is a resolved fact about an
|
|
521
|
+
unusable route rather than a missing report. Only a call without report context,
|
|
522
|
+
or an error envelope that never built a report, omits the field.
|
|
523
|
+
|
|
524
|
+
Consumers read `dispatchStamp` directly, validate that it is a non-empty string
|
|
525
|
+
beginning with the canonical `Dispatch:` prefix, and copy it byte-for-byte into
|
|
526
|
+
dispatch and audit metadata. Reformatting the report through
|
|
527
|
+
`toDispatchStampRecord(dispatchReport)` and `formatDispatchStamp` is an optional
|
|
528
|
+
corroboration where that library is already loaded; it is never the normal path,
|
|
529
|
+
and no out-of-tree shim is required. Callers must not reconstruct the stamp from
|
|
530
|
+
policy labels, role names, candidate strings, or target names.
|
|
531
|
+
|
|
532
|
+
A stamp carrying `producer=unknown provenance=unknown` is truthful, not
|
|
533
|
+
degraded: the resolver reports configured invocation, and those fields stay
|
|
534
|
+
`unknown` until an independent runtime observation exists.
|
|
535
|
+
|
|
500
536
|
## Legacy Compatibility
|
|
501
537
|
|
|
502
538
|
The following remain readable during migration:
|
|
@@ -88,7 +88,7 @@ The phase implementer receives one `Phase Scope`, reads the relevant artifacts
|
|
|
88
88
|
once, and directly executes each task in plan order. For every task it:
|
|
89
89
|
|
|
90
90
|
1. records the pre-task HEAD;
|
|
91
|
-
2. implements
|
|
91
|
+
2. implements the declared task files plus any mechanical additions permitted by, and reported under, the cross-cutting option sweep (a repository-wide sweep for every consumer of a changed option; cross-owner expansions stop and report instead);
|
|
92
92
|
3. runs task verification;
|
|
93
93
|
4. self-checks requirements and scope before commit;
|
|
94
94
|
5. creates exactly one task commit; and
|
|
@@ -250,8 +250,11 @@ for another.
|
|
|
250
250
|
|
|
251
251
|
Resolution and policy outcomes are explicit:
|
|
252
252
|
|
|
253
|
-
- A
|
|
254
|
-
basis
|
|
253
|
+
- A `not_configured` resolution persists `allowed/no_gate` for the current
|
|
254
|
+
implementation basis; a null, missing, or unrecognized resolver result fails
|
|
255
|
+
closed as unresolved instead.
|
|
256
|
+
- A gate the project disabled persists `allowed/configured` with
|
|
257
|
+
`disposition: project_disabled` and never launches.
|
|
255
258
|
- A configured passing review persists `allowed/passed` after any eligible
|
|
256
259
|
review receive is durably completed.
|
|
257
260
|
- `warn` persists `allowed/warned`; `prompt` proceeds only after explicit
|
|
@@ -56,9 +56,10 @@ Implementation closeout has one authoritative order:
|
|
|
56
56
|
|
|
57
57
|
The configured exit gate is independent from the mandatory lifecycle review,
|
|
58
58
|
root-owned phase reviews, and optional `oat_phase_review_gate`. It must reach an
|
|
59
|
-
allowed and fresh disposition before pre-approval work starts. A
|
|
60
|
-
|
|
61
|
-
from missing state
|
|
59
|
+
allowed and fresh disposition before pre-approval work starts. A
|
|
60
|
+
`not_configured` resolution is recorded explicitly as `allowed/no_gate`; it is
|
|
61
|
+
not inferred from missing state, and a null, missing, or unrecognized resolver
|
|
62
|
+
result fails closed as unresolved instead.
|
|
62
63
|
|
|
63
64
|
After implementation closeout finishes:
|
|
64
65
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-autonomous
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.11
|
|
4
4
|
description: Use when a user explicitly asks to run an OAT project autonomously end-to-end. Activates session-only autonomy, resumes the correct lifecycle phase, and drives the existing OAT skills through final PR or a reported boundary.
|
|
5
5
|
argument-hint: '<goal | project-slug | ticket-ref>'
|
|
6
6
|
disable-model-invocation: true
|