@open-agent-toolkit/cli 0.2.59 → 0.2.63
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 +27 -4
- package/assets/agents/oat-reviewer.md +25 -14
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/config-and-local-state.md +1 -0
- package/assets/docs/cli-utilities/configuration.md +10 -8
- package/assets/docs/cli-utilities/project-log.md +16 -0
- package/assets/docs/cli-utilities/workflow-gates.md +127 -19
- package/assets/docs/provider-sync/commands.md +3 -0
- package/assets/docs/provider-sync/instruction-sync.md +107 -0
- package/assets/docs/reference/cli-reference.md +26 -9
- package/assets/docs/reference/oat-directory-structure.md +33 -31
- package/assets/docs/workflows/ideas/index.md +1 -1
- package/assets/docs/workflows/index.md +1 -0
- package/assets/docs/workflows/projects/artifacts.md +24 -3
- package/assets/docs/workflows/projects/hill-checkpoints.md +21 -0
- package/assets/docs/workflows/projects/implementation-execution.md +5 -0
- package/assets/docs/workflows/projects/lifecycle.md +169 -7
- package/assets/docs/workflows/projects/picking-up-projects.md +14 -0
- package/assets/docs/workflows/projects/pr-flow.md +2 -0
- package/assets/docs/workflows/projects/reviews.md +1 -1
- package/assets/docs/workflows/projects/state-machine.md +20 -0
- package/assets/docs/workflows/skills/explainer-kit.md +10 -4
- package/assets/docs/workflows/skills/index.md +2 -1
- package/assets/docs/workflows/skills/repo-improve.md +15 -1
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-brainstorm/SKILL.md +61 -12
- package/assets/skills/oat-docs/SKILL.md +13 -8
- package/assets/skills/oat-doctor/SKILL.md +3 -3
- package/assets/skills/oat-explainer-kit/SKILL.md +14 -1
- package/assets/skills/oat-explainer-kit/references/config-contract.md +12 -0
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +57 -10
- package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +28 -5
- package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +371 -0
- package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +123 -1
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
- package/assets/skills/oat-project-autonomous/SKILL.md +23 -9
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +164 -150
- package/assets/skills/oat-project-capture/SKILL.md +2 -2
- package/assets/skills/oat-project-complete/SKILL.md +134 -4
- package/assets/skills/oat-project-discover/SKILL.md +6 -5
- package/assets/skills/oat-project-document/SKILL.md +11 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +164 -150
- package/assets/skills/oat-project-implement/SKILL.md +3 -3
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +144 -21
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +164 -150
- package/assets/skills/oat-project-implement/references/phase-execution.md +16 -1
- package/assets/skills/oat-project-implement/references/plan-and-resume.md +19 -1
- package/assets/skills/oat-project-import-plan/SKILL.md +47 -3
- package/assets/skills/oat-project-lite/SKILL.md +467 -0
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +331 -0
- package/assets/skills/oat-project-next/SKILL.md +75 -16
- package/assets/skills/oat-project-plan/SKILL.md +44 -6
- package/assets/skills/oat-project-plan-writing/SKILL.md +6 -3
- package/assets/skills/oat-project-pr-final/SKILL.md +33 -7
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +164 -150
- package/assets/skills/oat-project-pr-progress/SKILL.md +3 -3
- package/assets/skills/oat-project-progress/SKILL.md +27 -5
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +3 -1
- package/assets/skills/oat-project-quick-start/SKILL.md +264 -4
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +164 -150
- package/assets/skills/oat-project-review-provide/SKILL.md +25 -6
- package/assets/skills/oat-project-summary/SKILL.md +61 -26
- package/assets/skills/oat-repo-improve/SKILL.md +40 -5
- package/assets/skills/oat-repo-improve/references/plan-template.md +84 -7
- package/assets/templates/plan-lite.md +165 -0
- package/assets/templates/plan.md +1 -1
- package/assets/templates/state.md +1 -1
- package/dist/commands/config/index.d.ts +1 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +401 -18
- package/dist/commands/gate/index.d.ts +3 -1
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +699 -211
- package/dist/commands/init/tools/shared/skill-script-references.d.ts +126 -0
- package/dist/commands/init/tools/shared/skill-script-references.d.ts.map +1 -0
- package/dist/commands/init/tools/shared/skill-script-references.js +311 -0
- package/dist/commands/instructions/instructions.types.d.ts +63 -0
- package/dist/commands/instructions/instructions.types.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.d.ts +51 -2
- package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.js +201 -4
- package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
- package/dist/commands/instructions/sync/sync.js +12 -1
- package/dist/commands/instructions/validate/validate.d.ts.map +1 -1
- package/dist/commands/instructions/validate/validate.js +12 -1
- package/dist/commands/project/index.d.ts.map +1 -1
- package/dist/commands/project/index.js +2 -0
- package/dist/commands/project/log/append.d.ts +195 -0
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +1034 -11
- package/dist/commands/project/new/index.d.ts +3 -2
- package/dist/commands/project/new/index.d.ts.map +1 -1
- package/dist/commands/project/new/index.js +2 -1
- package/dist/commands/project/new/scaffold.d.ts +5 -3
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +38 -10
- package/dist/commands/project/promote/index.d.ts +2 -0
- package/dist/commands/project/promote/index.d.ts.map +1 -0
- package/dist/commands/project/promote/index.js +1 -0
- package/dist/commands/project/promote/promote.d.ts +47 -0
- package/dist/commands/project/promote/promote.d.ts.map +1 -0
- package/dist/commands/project/promote/promote.js +322 -0
- package/dist/commands/project/split/run.d.ts.map +1 -1
- package/dist/commands/project/split/run.js +8 -1
- package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/index.js +25 -1
- package/dist/commands/project/validate-plan/validate-plan.d.ts +8 -0
- package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/validate-plan.js +49 -0
- package/dist/commands/shared/frontmatter.d.ts +1 -1
- package/dist/commands/shared/frontmatter.d.ts.map +1 -1
- package/dist/commands/shared/frontmatter.js +1 -0
- package/dist/commands/state/generate.d.ts.map +1 -1
- package/dist/commands/state/generate.js +23 -0
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +2 -0
- package/dist/config/oat-config.d.ts +41 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +111 -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.5
|
|
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
|
|
@@ -29,7 +29,7 @@ The root supplies:
|
|
|
29
29
|
- `mode`: `implement`, `fix`, or `recover`;
|
|
30
30
|
- `artifact_paths`: available plan, design, spec, discovery, implementation,
|
|
31
31
|
and imported-plan paths;
|
|
32
|
-
- `workflow_mode`: `spec-driven`, `quick`, or `
|
|
32
|
+
- `workflow_mode`: `spec-driven`, `quick`, `import`, or `lite`;
|
|
33
33
|
- `commit_convention`: exact task/fix commit convention;
|
|
34
34
|
- `phase_base_head`: root-recorded HEAD before phase dispatch;
|
|
35
35
|
- `worktree`: assigned phase worktree or orchestration checkout;
|
|
@@ -120,6 +120,11 @@ Read each required artifact once at phase start:
|
|
|
120
120
|
- `quick`: phase section from plan and discovery; design/spec when present;
|
|
121
121
|
- `import`: phase section from plan and imported plan; design/spec when
|
|
122
122
|
present.
|
|
123
|
+
- `lite`: read the whole plan.md requirements contract: the assigned phase
|
|
124
|
+
section plus Summary, Decisions, Assumptions, Out of Scope, and Validation
|
|
125
|
+
Criteria, and the Product Behavior and/or Technical Design selected by its
|
|
126
|
+
recorded `minimal`, `product`, `technical`, or `both` content shape.
|
|
127
|
+
Discovery, spec, and design are absent by design.
|
|
123
128
|
|
|
124
129
|
Extract all phase tasks, dependency order, file boundaries, verification
|
|
125
130
|
commands, commit messages, and phase-wide verification before editing.
|
|
@@ -402,7 +407,20 @@ For every task:
|
|
|
402
407
|
|
|
403
408
|
1. Record `PRE_TASK_HEAD`.
|
|
404
409
|
2. Read the task steps and declared file boundary.
|
|
405
|
-
3.
|
|
410
|
+
3. Execute the task's declared implementation and proof strategy without
|
|
411
|
+
silently substituting TDD. Follow RED/GREEN/refactor ordering only when the
|
|
412
|
+
selected strategy specifies it.
|
|
413
|
+
For required manual or visual proof, inspect the effective runtime tool
|
|
414
|
+
catalog for an available computer-use capability; never infer availability
|
|
415
|
+
from planning prose, configuration, or another agent's tools. Use available
|
|
416
|
+
computer-use for required visual proof and record the performed proof. When
|
|
417
|
+
no available executor can perform the criterion, stop before committing the
|
|
418
|
+
task or marking the task or phase complete. Under `OAT_AUTONOMOUS=1`, return
|
|
419
|
+
`BLOCKED` with an explicit `IMPLEMENT-20 unverified proof boundary` and name
|
|
420
|
+
the criterion and missing capability. In an interactive run, return
|
|
421
|
+
`NEEDS_CONTEXT` and wait for the operator to execute the criterion or direct
|
|
422
|
+
the next action. Neither path may mark unavailable proof
|
|
423
|
+
deferred-but-verified.
|
|
406
424
|
4. Implement only that task. Optional nested help does not transfer task
|
|
407
425
|
ownership or commit authority.
|
|
408
426
|
5. Apply the Prevention and Post-Commit Recovery ordering: format, run every
|
|
@@ -440,7 +458,12 @@ After all task commits:
|
|
|
440
458
|
- apply the same post-commit recovery contract to an eligible phase-level
|
|
441
459
|
composition failure;
|
|
442
460
|
- verify task outputs compose correctly;
|
|
443
|
-
- compare the phase result with
|
|
461
|
+
- compare the phase result with the requirements source selected by workflow
|
|
462
|
+
mode:
|
|
463
|
+
- `lite`: the complete `plan.md` requirements contract loaded at phase start;
|
|
464
|
+
- `spec-driven`: `plan.md`, `design.md`, and `spec.md`;
|
|
465
|
+
- `quick`: `plan.md` and `discovery.md`, plus design/spec when present; and
|
|
466
|
+
- `import`: `plan.md` and the imported plan, plus design/spec when present;
|
|
444
467
|
- confirm no task boundary or dependency was missed; and
|
|
445
468
|
- report Medium/Minor concerns without launching a reviewer.
|
|
446
469
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-reviewer
|
|
3
|
-
version: 1.2.
|
|
3
|
+
version: 1.2.3
|
|
4
4
|
description: Unified reviewer for OAT projects - mode-aware verification of requirements/design alignment and code quality. Writes a review artifact to disk by default, or returns structured findings in-memory when dispatched in structured-output mode.
|
|
5
5
|
tools: Read, Bash, Grep, Glob, Write, Task
|
|
6
6
|
color: yellow
|
|
@@ -50,7 +50,7 @@ You will be given a "Review Scope" block including:
|
|
|
50
50
|
- **commits/range**: Git commits or SHA range for changed files. For code review, this is the authoritative review surface.
|
|
51
51
|
- **files_changed**: Optional orientation hint listing files believed to be modified in scope. If this disagrees with the commit range, trust the commit range.
|
|
52
52
|
- **analysis_artifact**: For `type: analysis`, path to the severity-rated analysis artifact to fact-check.
|
|
53
|
-
- **workflow_mode**: `spec-driven` | `quick` | `import` (default to `spec-driven` if absent)
|
|
53
|
+
- **workflow_mode**: `spec-driven` | `quick` | `import` | `lite` (default to `spec-driven` if absent)
|
|
54
54
|
- **artifact_paths**: Paths to available artifacts (spec/design/plan/implementation/discovery/import reference)
|
|
55
55
|
- **tasks_in_scope**: Task IDs being reviewed (if task/phase scope)
|
|
56
56
|
- **oat_output_mode**: Optional output-sink selector. Absent (or any value other than `structured`) means **artifact mode** — write the review artifact to disk per Step 8. `structured` means **structured-output mode** — return a `StructuredFindings` object in-memory and write NO artifact file (see **Structured-Output Mode**). This key parallels the existing `oat_review_invocation` dispatch-payload naming.
|
|
@@ -122,6 +122,7 @@ Use workflow mode to determine required evidence:
|
|
|
122
122
|
- **spec-driven**: `spec.md`, `design.md`, `plan.md` are expected.
|
|
123
123
|
- **quick**: `discovery.md` + `plan.md` are expected (`spec.md`/`design.md` optional if present).
|
|
124
124
|
- **import**: `plan.md` is expected (`references/imported-plan.md` preferred; `spec.md`/`design.md` optional).
|
|
125
|
+
- **lite**: `plan.md` and `implementation.md` are expected; discovery, spec, and design are absent by design.
|
|
125
126
|
|
|
126
127
|
Do not mark missing optional artifacts as findings.
|
|
127
128
|
If required artifacts for the mode are unexpectedly missing, record a workflow contract gap.
|
|
@@ -144,6 +145,7 @@ Read available artifacts to understand what SHOULD have been built:
|
|
|
144
145
|
- `spec-driven`: read `spec.md` and `design.md`.
|
|
145
146
|
- `quick`: read `discovery.md` and `plan.md`; read `spec.md`/`design.md` only if they exist.
|
|
146
147
|
- `import`: read `plan.md` and `references/imported-plan.md` (if present); read `spec.md`/`design.md` only if they exist.
|
|
148
|
+
- `lite`: read `plan.md` and `implementation.md`; do not require discovery, spec, design, or an import reference.
|
|
147
149
|
3. For `type: analysis`, read `analysis_artifact` and then inspect only the cited evidence sources needed to verify its findings:
|
|
148
150
|
- `scope: docs`: consult the docs contract, docs navigation/index files, and cited docs source files relevant to the analysis.
|
|
149
151
|
- `scope: agent-instructions`: consult the repo/root instruction files, provider instruction files, and cited skill/agent instruction files relevant to the analysis.
|
|
@@ -168,6 +170,7 @@ For each requirement in scope, use the best available requirement source by mode
|
|
|
168
170
|
- `spec-driven`: `spec.md` (primary), `design.md` mapping (secondary)
|
|
169
171
|
- `quick`: `discovery.md` + `plan.md`
|
|
170
172
|
- `import`: normalized `plan.md` + `references/imported-plan.md` (if present)
|
|
173
|
+
- `lite`: the requirements contract in `plan.md`: Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria. Also use Product Behavior and/or Technical Design when selected by the recorded `minimal`, `product`, `technical`, or `both` content shape.
|
|
171
174
|
|
|
172
175
|
Then verify:
|
|
173
176
|
|
|
@@ -176,10 +179,17 @@ Then verify:
|
|
|
176
179
|
- Check acceptance criteria are met
|
|
177
180
|
- If missing: add to Critical findings
|
|
178
181
|
|
|
179
|
-
2. **Is the
|
|
180
|
-
-
|
|
181
|
-
|
|
182
|
-
|
|
182
|
+
2. **Is the applicable verification intent satisfied?**
|
|
183
|
+
- First identify the verification intent declared by the applicable workflow
|
|
184
|
+
artifacts. When that contract declares an `Implementation and Proof
|
|
185
|
+
Strategy`, check whether the evidence matches the declared strategy, covers
|
|
186
|
+
its observable risk, and is capable of failing when the claim is false.
|
|
187
|
+
- A missing or unjustified proof strategy is a finding only when the
|
|
188
|
+
applicable workflow artifact declares that strategy. When it does not,
|
|
189
|
+
review the plan's existing verification commands and produced evidence
|
|
190
|
+
without inventing a missing strategy field.
|
|
191
|
+
- If `design.md` exists, cross-reference Requirement-to-Test Mapping.
|
|
192
|
+
- The absence of an automated test alone is not a finding.
|
|
183
193
|
|
|
184
194
|
3. **Is there extra work?**
|
|
185
195
|
- Code that doesn't map to any requirement
|
|
@@ -207,6 +217,7 @@ Treat the artifact as a product deliverable. Verify it is:
|
|
|
207
217
|
- `spec-driven`: spec + design
|
|
208
218
|
- `quick`: discovery (+ spec/design if present)
|
|
209
219
|
- `import`: imported-plan reference (+ discovery/spec/design if present)
|
|
220
|
+
- `lite`: plan.md Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria. Also review the Product Behavior and/or Technical Design required by its recorded content shape; challenge `minimal` when an observable shape trigger applies.
|
|
210
221
|
- For import-mode `plan` reviews, bias findings toward canonical-format conformance and completeness. Do not rewrite the imported author's intent merely to match OAT house style.
|
|
211
222
|
|
|
212
223
|
4. **Actionable**
|
|
@@ -220,7 +231,7 @@ Treat the artifact as a product deliverable. Verify it is:
|
|
|
220
231
|
- Stable task IDs: task headings use `pNN-tNN`, IDs are monotonic within each phase, and review-generated tasks do not reuse prior IDs.
|
|
221
232
|
- Required sections: the plan includes Reviews, Implementation Complete, and References sections without placeholder-only critical content.
|
|
222
233
|
- Review-table preservation: existing review rows are preserved; never require deleting rows to "clean up" the table.
|
|
223
|
-
- Task atomicity and verifiability: each task is independently committable, has bounded file scope, and
|
|
234
|
+
- Task atomicity and verifiability: each task is independently committable, has bounded file scope, and has executable verification intent. Require a proportionate implementation and proof strategy only when the applicable workflow plan contract declares it; otherwise review the task's existing verification commands and evidence.
|
|
224
235
|
- Coverage of design/discovery: every in-scope design component or discovery decision is mapped to at least one task or explicitly deferred/out of scope.
|
|
225
236
|
- Parallelism-claim sanity: any parallel phase group or parallelism statement is consistent with declared file boundaries and dependency order.
|
|
226
237
|
|
|
@@ -228,7 +239,7 @@ Treat the artifact as a product deliverable. Verify it is:
|
|
|
228
239
|
|
|
229
240
|
This step applies to **code reviews** only.
|
|
230
241
|
|
|
231
|
-
If `design.md` is absent in quick/import mode, mark design alignment as "not applicable (design artifact not present for mode)" and continue.
|
|
242
|
+
If `design.md` is absent in quick/import/lite mode, mark design alignment as "not applicable (design artifact not present for mode)" and continue.
|
|
232
243
|
|
|
233
244
|
For each design decision relevant to scope:
|
|
234
245
|
|
|
@@ -283,10 +294,10 @@ Pragmatic code quality review (not exhaustive):
|
|
|
283
294
|
- Off-by-one errors, null handling
|
|
284
295
|
- Missing error handling for likely failures
|
|
285
296
|
|
|
286
|
-
2. **
|
|
287
|
-
- Critical paths have
|
|
288
|
-
- Edge cases covered
|
|
289
|
-
-
|
|
297
|
+
2. **Evidence coverage**
|
|
298
|
+
- Critical paths have evidence matching the declared proof strategy
|
|
299
|
+
- Edge cases are covered where relevant
|
|
300
|
+
- Behavioral claims have a control that fails without the change
|
|
290
301
|
|
|
291
302
|
3. **Security**
|
|
292
303
|
- Input validation at boundaries
|
|
@@ -307,14 +318,14 @@ Group findings by severity:
|
|
|
307
318
|
- Missing P0 requirements
|
|
308
319
|
- Security vulnerabilities
|
|
309
320
|
- Broken functionality
|
|
310
|
-
- Missing
|
|
321
|
+
- Missing capable evidence for critical paths
|
|
311
322
|
|
|
312
323
|
**Important** (should fix before merge)
|
|
313
324
|
|
|
314
325
|
- Missing P1 requirements
|
|
315
326
|
- Missing error handling
|
|
316
327
|
- Significant maintainability issues
|
|
317
|
-
- Missing
|
|
328
|
+
- Missing capable evidence for important paths
|
|
318
329
|
- Stale spec/design/plan artifact that conflicts with a defensible implementation and should be aligned before closeout
|
|
319
330
|
|
|
320
331
|
**Medium** (default fix before pass)
|
|
@@ -120,6 +120,7 @@ Use `oat config` for repo runtime config inspection and supported key mutation.
|
|
|
120
120
|
|
|
121
121
|
- `oat config get <key>` - read one resolved config value
|
|
122
122
|
- `oat config set <key> <value>` - update a supported shared or repo-local key
|
|
123
|
+
- `oat config unset <key>` - remove a supported key from one surface, with the same `--shared`/`--local`/`--user` flags and per-key restrictions as `set`. Pruning removes any parent object the removal empties, and the resolved value falls back to the next surface or the built-in default. A key the surface does not hold reports an already-unset outcome and exits 0; `--json` adds a `removed` boolean that distinguishes that no-op from a real removal. Five classes are refused with exit 1: unknown keys (including the uncatalogued `documentation.index`), lifecycle state (`activeProject`, `lastPausedProject`, cleared with `oat config set <key> ''`), pack intent (`tools.*`, removed with `oat tools remove --pack <pack> --scope project`), the aggregate read views `workflow.dispatchCeiling` and `workflow.dispatchCeiling.providers`, and environment-shadowed keys with nothing stored on the target surface. See [CLI Reference](../reference/cli-reference.md#oat-config-surface-flags) for the full contract
|
|
123
124
|
- `oat config list` - show the resolved command-surface values with source information
|
|
124
125
|
- `oat config dump --json` - emit the full merged config payload with per-key source attribution, suitable for automation and debugging
|
|
125
126
|
- `oat config describe` - list supported config surfaces and keys across shared repo, repo-local, user, and sync/provider config
|
|
@@ -18,13 +18,13 @@ For the deep file-by-file reference, see:
|
|
|
18
18
|
|
|
19
19
|
## The five config surfaces
|
|
20
20
|
|
|
21
|
-
| Surface | File | Typical contents | Primary CLI surface
|
|
22
|
-
| ------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
23
|
-
| Shared repo config | `.oat/config.json` | Repo-wide non-sync settings such as `projects.root`, `git.defaultBranch`, `documentation.*`, `archive.*`, `tools.*`, and shared `workflow.*` defaults | `oat config get/set/list/describe`, `oat gate` |
|
|
24
|
-
| Repo-local config | `.oat/config.local.json` | Per-developer state for this checkout, such as `activeProject`, `lastPausedProject`, repo-local `activeIdea`, and local `workflow.*` overrides | `oat config get/set/list/describe`, `oat gate` |
|
|
25
|
-
| User config | `~/.oat/config.json` | User-level state such as global `activeIdea` fallback and personal `workflow.*` defaults | `oat config describe`, `oat gate`
|
|
26
|
-
| Project sync config | `.oat/sync/config.json` | Provider enablement, sync strategy, and repo-level known stray settings | `oat providers set`, `oat config describe`
|
|
27
|
-
| User provider sync config | `~/.oat/sync/config.json` | User sync strategy and personal known provider strays | Provider-sync commands, `oat config describe`
|
|
21
|
+
| Surface | File | Typical contents | Primary CLI surface |
|
|
22
|
+
| ------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
|
|
23
|
+
| Shared repo config | `.oat/config.json` | Repo-wide non-sync settings such as `projects.root`, `git.defaultBranch`, `documentation.*`, `archive.*`, `tools.*`, and shared `workflow.*` defaults | `oat config get/set/unset/list/describe`, `oat gate` |
|
|
24
|
+
| Repo-local config | `.oat/config.local.json` | Per-developer state for this checkout, such as `activeProject`, `lastPausedProject`, repo-local `activeIdea`, and local `workflow.*` overrides | `oat config get/set/unset/list/describe`, `oat gate` |
|
|
25
|
+
| User config | `~/.oat/config.json` | User-level state such as global `activeIdea` fallback and personal `workflow.*` defaults | `oat config get/set/unset/describe`, `oat gate` |
|
|
26
|
+
| Project sync config | `.oat/sync/config.json` | Provider enablement, sync strategy, and repo-level known stray settings | `oat providers set`, `oat config describe` |
|
|
27
|
+
| User provider sync config | `~/.oat/sync/config.json` | User sync strategy and personal known provider strays | Provider-sync commands, `oat config describe` |
|
|
28
28
|
|
|
29
29
|
The main split is:
|
|
30
30
|
|
|
@@ -51,6 +51,7 @@ What each command is for:
|
|
|
51
51
|
- `oat config list` shows the currently resolved command-surface values for shared and repo-local keys.
|
|
52
52
|
- `oat config get <key>` reads one supported key value.
|
|
53
53
|
- `oat config set <key> <value>` updates supported shared or repo-local keys.
|
|
54
|
+
- `oat config unset <key>` removes a supported key from one surface, using the same `--shared`/`--local`/`--user` flags and per-key restrictions as `set`. The resolved value then falls back to the next surface down, or to the built-in default. A key the surface does not hold exits 0 as already-unset (`--json` adds a `removed` boolean to tell the two apart). Unknown keys, lifecycle state, `tools.*` pack intent, the `workflow.dispatchCeiling` aggregate read views, and environment-shadowed keys with nothing stored are refused with exit 1 — see [CLI Reference](../reference/cli-reference.md#oat-config-surface-flags).
|
|
54
55
|
- `oat config describe` shows the supported config catalog across shared repo, repo-local, user, and sync/provider surfaces.
|
|
55
56
|
- `oat config describe <key>` shows file, scope, default, mutability, owning command, and description for one key.
|
|
56
57
|
|
|
@@ -91,6 +92,7 @@ Common keys in `.oat/config.json`:
|
|
|
91
92
|
- `git.defaultBranch` — base branch fallback for PR workflows
|
|
92
93
|
- `documentation.root`, `documentation.tooling`, `documentation.config` — docs-surface ownership
|
|
93
94
|
- `documentation.excludes` — a JSON array of globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. `oat config set` takes the list as one comma-separated value (`"a/**,b.md"`) and stores it as an array; repeated `--exclude` flags extend it, and an empty value clears the key
|
|
95
|
+
- `documentation.instructionPointerExcludes` — a JSON array of repository-relative directories that `oat instructions sync` and `oat instructions validate` must not treat as pointer sites, additive to the documentation content root they already skip by default (see [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees)). `oat config set` takes the list as one comma-separated value (`"vendor/generated,apps/oat-docs/docs"`) and stores it as an array of repository-relative POSIX paths, trimmed and de-duplicated; an empty value clears the key, and `oat config unset documentation.instructionPointerExcludes` removes it. An entry that could never exclude anything — an absolute path, or one escaping the repository with `..` — is rejected with exit code `1` rather than stored. A structurally malformed value already on disk (a non-array, or an empty or non-string entry) is rejected with exit code `2` and a repair message, and `oat config set` can still replace it. Entries that are well formed but cannot exclude anything — among them absolute paths, paths escaping the repository, paths that match no directory (matching is case-sensitive), and the unexcludable `.oat/repo` carve-in root — never abort the command; they are reported as warnings and are not counted as protection. Warnings go to stderr in human mode and to the `exclusionWarnings` field under `--json`
|
|
94
96
|
- `documentation.requireForProjectCompletion` — whether docs sync is a completion gate
|
|
95
97
|
- `archive.s3Uri` — base S3 archive prefix
|
|
96
98
|
- `archive.s3SyncOnComplete` — upload archived projects to S3 during completion
|
|
@@ -768,7 +770,7 @@ Workflow preferences resolve through three config surfaces, with `local > shared
|
|
|
768
770
|
|
|
769
771
|
### Setting preferences
|
|
770
772
|
|
|
771
|
-
`oat config set`
|
|
773
|
+
`oat config set` and `oat config unset` support the same mutually exclusive surface flags for workflow keys:
|
|
772
774
|
|
|
773
775
|
```bash
|
|
774
776
|
# User-level: applies to all repos on this machine
|
|
@@ -71,6 +71,22 @@ oat project log append \
|
|
|
71
71
|
Structural entries require `--structural`, `--producer`, `--ref`, and `--body`.
|
|
72
72
|
Do not combine structural flags with judgment flags.
|
|
73
73
|
|
|
74
|
+
### Idempotent append and commit
|
|
75
|
+
|
|
76
|
+
Two optional flags let an interrupted append be replayed safely:
|
|
77
|
+
|
|
78
|
+
- `--idempotency-key <key>` — skip the append when an existing entry body
|
|
79
|
+
already carries `key`, reporting `already-appended` instead of writing a
|
|
80
|
+
duplicate. The key must appear in `--body`, since that is how a replay
|
|
81
|
+
recognizes the entry it already wrote.
|
|
82
|
+
- `--commit` — stage and commit the log after appending, retrying a bounded
|
|
83
|
+
three attempts when the failure is a transient `.git/index.lock`.
|
|
84
|
+
|
|
85
|
+
Together they are the recovery entry point for a gate whose project-log
|
|
86
|
+
finalization could not commit. See
|
|
87
|
+
[Workflow Gates](./workflow-gates.md#project-log-finalization) for the receipt
|
|
88
|
+
and the exact recovery command.
|
|
89
|
+
|
|
74
90
|
The helper produces these heading grammars in UTC:
|
|
75
91
|
|
|
76
92
|
```text
|
|
@@ -62,8 +62,8 @@ A valid command is stored byte-for-byte. `oat gate resolve` returns that exact
|
|
|
62
62
|
string, and the lifecycle executes it unchanged; OAT does not inject, reorder,
|
|
63
63
|
or rewrite its shell arguments.
|
|
64
64
|
|
|
65
|
-
`oat-project-plan`, `oat-project-implement`, `oat-project-quick-start`,
|
|
66
|
-
`oat-project-import-plan` are currently gate-aware. Gate awareness is declared
|
|
65
|
+
`oat-project-plan`, `oat-project-implement`, `oat-project-quick-start`,
|
|
66
|
+
`oat-project-lite`, and `oat-project-import-plan` are currently gate-aware. Gate awareness is declared
|
|
67
67
|
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.
|
|
@@ -375,14 +375,14 @@ once an artifact exists, its `generatedAt` (the artifact's seconds-precision
|
|
|
375
375
|
`oat_generated_at`), so a caller can correlate the result to the exact artifact
|
|
376
376
|
and disambiguate re-gate rounds:
|
|
377
377
|
|
|
378
|
-
| `status` | Exit | Meaning
|
|
379
|
-
| ------------------------------ | ---- |
|
|
380
|
-
| `ok` | 0 | Review completed; gate passed at the threshold.
|
|
381
|
-
| `blocked` | 1 | Review completed; findings at/above the threshold.
|
|
382
|
-
| `review_failed` | ≠0 |
|
|
383
|
-
| `artifact_missing` | 1 | The child exited cleanly without producing an artifact.
|
|
384
|
-
| `artifact_validation_failed` | 1 | Artifact format or configured invocation fields are invalid.
|
|
385
|
-
| `targeting_correlation_failed` | 1 | Identity did not correlate; do not run review-receive.
|
|
378
|
+
| `status` | Exit | Meaning |
|
|
379
|
+
| ------------------------------ | ---- | --------------------------------------------------------------- |
|
|
380
|
+
| `ok` | 0 | Review completed; gate passed at the threshold. |
|
|
381
|
+
| `blocked` | 1 | Review completed; findings at/above the threshold. |
|
|
382
|
+
| `review_failed` | ≠0 | No validated verdict: the target or post-selection work failed. |
|
|
383
|
+
| `artifact_missing` | 1 | The child exited cleanly without producing an artifact. |
|
|
384
|
+
| `artifact_validation_failed` | 1 | Artifact format or configured invocation fields are invalid. |
|
|
385
|
+
| `targeting_correlation_failed` | 1 | Identity did not correlate; do not run review-receive. |
|
|
386
386
|
|
|
387
387
|
Only `ok` and `blocked` are positive, receive-eligible review outcomes: both
|
|
388
388
|
follow successful identity corroboration and carry a non-null `handoff`.
|
|
@@ -400,6 +400,37 @@ bookkeeping finish inline or through a synchronously awaited child, then start
|
|
|
400
400
|
a new gate run. Do not use review-fix retries or review-receive for the failed
|
|
401
401
|
run.
|
|
402
402
|
|
|
403
|
+
Post-selection recovery covers work that fails _after_ the reviewer already
|
|
404
|
+
committed a run-correlated artifact: corroboration, the threshold, handoff
|
|
405
|
+
construction, or result writing. Recovery means re-validation, never re-review.
|
|
406
|
+
The gate re-runs the same eligibility pipeline the normal path uses (project
|
|
407
|
+
containment, `oat_generated_at` validity, verdict parsing, gate-invocation
|
|
408
|
+
corroboration, the `oat_review_invocation: gate` marker, and the threshold)
|
|
409
|
+
against the immutable content/signature snapshot selected at correlation time.
|
|
410
|
+
It re-validates that snapshot rather than re-parsing whatever the path now
|
|
411
|
+
holds, and it never dispatches a second reviewer. The artifact must still be
|
|
412
|
+
present and unchanged for re-validation to succeed: a deleted or rewritten
|
|
413
|
+
artifact fails re-validation and the run stays failed.
|
|
414
|
+
When that re-validation succeeds the gate returns the ordinary `ok` or
|
|
415
|
+
`blocked` envelope with an additive `postSelectionRecovery: true`. Like
|
|
416
|
+
`lateCompletion`, that is recovery telemetry rather than a new status: route
|
|
417
|
+
review-receive from `status`, `receiveEligible`, and `handoff` as usual.
|
|
418
|
+
|
|
419
|
+
When no artifact was selected, or the selected snapshot does not re-validate,
|
|
420
|
+
the run stays `review_failed` with `outcome:
|
|
421
|
+
unexpected_post_selection_failure`. That envelope names the failing sub-step in
|
|
422
|
+
`postSelection.step` (`target-dispatch`, `artifact-scan`,
|
|
423
|
+
`artifact-correlation`, `artifact-validation`, `verdict-parse`,
|
|
424
|
+
`invocation-corroboration`, or `verdict-disposition`) and a routable
|
|
425
|
+
`postSelection.code`: the thrown error's own `code` or constructor name, the
|
|
426
|
+
eligibility cause when a committed artifact failed re-validation, or
|
|
427
|
+
`recovery_revalidation_failed` when the re-validation attempt itself threw. That
|
|
428
|
+
last case also emits a `gate-recovery-failed` diagnostic, so a persistent
|
|
429
|
+
non-recovery stays distinguishable from the transient failure that triggered it.
|
|
430
|
+
Replacement bytes at the artifact path, a missing artifact, a non-gate
|
|
431
|
+
invocation marker, and an artifact targeting another project never recover. Route deterministically on those
|
|
432
|
+
fields instead of re-dispatching the reviewer.
|
|
433
|
+
|
|
403
434
|
`ok` and `blocked` also include `receiveEligible: true`, `outcome`,
|
|
404
435
|
`artifactPath`, `counts`, `scope`, `handoff`, `gateInvocation`, and
|
|
405
436
|
`corroboration`. Invoke review-receive only when all three conditions hold:
|
|
@@ -445,6 +476,81 @@ oat --json gate review \
|
|
|
445
476
|
Read the resulting envelope and exit code; that is the whole completion
|
|
446
477
|
contract.
|
|
447
478
|
|
|
479
|
+
### Project log finalization
|
|
480
|
+
|
|
481
|
+
After the envelope is written, the gate appends one structural entry to the
|
|
482
|
+
project's `project-log.md` and commits it, so the run does not leave a dirty
|
|
483
|
+
worktree for whatever executes next. The entry body ends with
|
|
484
|
+
`run=<runId>` — the same run id the envelope carries. That token is the entry's
|
|
485
|
+
stable identity: a retry or a later recovery recognizes the entry it already
|
|
486
|
+
wrote instead of appending a second one.
|
|
487
|
+
|
|
488
|
+
Staging and committing the log retries **three attempts** separated by two
|
|
489
|
+
waits (250 ms, then 500 ms) when, and only when, git itself reports index-lock
|
|
490
|
+
contention: `Unable to create '…/index.lock': File exists`, or git's `Another
|
|
491
|
+
git process seems to be running in this repository` advice in output that also
|
|
492
|
+
names an index lock. Every other failure — a hook,
|
|
493
|
+
signing, identity, or pathspec error — is reported immediately rather than
|
|
494
|
+
retried, including one whose output merely mentions `index.lock`. The gate never
|
|
495
|
+
deletes, moves, or forces a lock it did not take. A lock whose mtime is
|
|
496
|
+
unchanged across the whole retry window is reported as `persistent-index-lock`;
|
|
497
|
+
one that moves is `transient-index-lock`. If a competing writer commits the same
|
|
498
|
+
entry while the gate retries, the gate reports the work as already committed
|
|
499
|
+
instead of a failure — but only when the committed log still carries this run's
|
|
500
|
+
entry.
|
|
501
|
+
|
|
502
|
+
When the retries are exhausted the append has landed but the commit has not, so
|
|
503
|
+
the gate writes a durable receipt to
|
|
504
|
+
`<project>/gate-receipts/<runId>.json` and emits a
|
|
505
|
+
`gate-project-log-partial-finalization` diagnostic naming the receipt and
|
|
506
|
+
printing its recovery command verbatim. The gate result is unchanged: a passing
|
|
507
|
+
review still exits `ok`.
|
|
508
|
+
|
|
509
|
+
The receipt must not dirty the worktree, so this repository ignores
|
|
510
|
+
`**/gate-receipts/` repository-wide rather than under `.oat/projects` alone:
|
|
511
|
+
`projects.root` is settable, and the receipt follows the resolved project. A
|
|
512
|
+
repository whose ignore rules do not cover the receipt still gets the receipt —
|
|
513
|
+
losing the finalization would be worse than a tracked file — plus a
|
|
514
|
+
`gate-project-log-receipt-warning` diagnostic naming the path, so the gap
|
|
515
|
+
surfaces before the next repository-wide `git add`.
|
|
516
|
+
|
|
517
|
+
The receipt completes the finalization from a later process, with no reviewer
|
|
518
|
+
and no second gate run:
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
oat project log append --project <projectPath> --structural \
|
|
522
|
+
--producer 'oat gate review' --ref <ref> --body <body> \
|
|
523
|
+
--idempotency-key <runId> --commit
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
Before appending anything, that command validates the receipt against the live
|
|
527
|
+
tree: the project path must resolve to the same project, `worktreeRoot` must
|
|
528
|
+
match `git rev-parse --show-toplevel`, and the review artifact must still exist
|
|
529
|
+
with its recorded sha256 signature. A receipt that names no artifact — the gate
|
|
530
|
+
correlated none, so `artifactPath` and `artifactSignature` are both `null` — is
|
|
531
|
+
bound by run id, project, worktree, and the entry fields alone; a receipt that
|
|
532
|
+
names an artifact _without_ a signature is malformed and refused. The replayed
|
|
533
|
+
entry must also be the entry
|
|
534
|
+
the receipt describes — `--producer`, `--ref`, and `--body` are compared against
|
|
535
|
+
the receipt, and the receipt's own run id must be the `--idempotency-key` that
|
|
536
|
+
names its file — so a receipt can never be consumed while some other entry is
|
|
537
|
+
written. Any mismatch exits non-zero with a
|
|
538
|
+
`gate-project-log-receipt-mismatch` diagnostic and touches nothing. On a match
|
|
539
|
+
it appends (or reports `already-appended` when the entry is already there),
|
|
540
|
+
commits with the same bounded retry, and deletes the receipt. Running it twice
|
|
541
|
+
is safe: the second run appends nothing and creates no commit.
|
|
542
|
+
|
|
543
|
+
At the start of a run, a receipt still sitting under the project produces a
|
|
544
|
+
`gate-project-log-receipt-pending` diagnostic naming the receipt and its
|
|
545
|
+
recovery command. Its `state` is `stale` only when the _committed_ log
|
|
546
|
+
(`HEAD:project-log.md`) already carries that run id and entry — the append
|
|
547
|
+
landed and was committed, so recovery will observe `already-appended` and clear
|
|
548
|
+
the receipt. Everything else is `pending`, including the ordinary case where
|
|
549
|
+
the entry is in the working tree but no commit succeeded: that is precisely
|
|
550
|
+
what the receipt exists to finish, so it is never reported as leftovers. A
|
|
551
|
+
receipt naming another tree's log, or a committed log that cannot be read back,
|
|
552
|
+
also stays `pending`. The warning is discovery only; the gate still runs.
|
|
553
|
+
|
|
448
554
|
## Exec targets
|
|
449
555
|
|
|
450
556
|
`oat gate cross-provider-exec` chooses from `workflow.gates.execTargets`.
|
|
@@ -610,7 +716,7 @@ oat gate set oat-project-implement \
|
|
|
610
716
|
```
|
|
611
717
|
|
|
612
718
|
Apply the same command shape to `oat-project-plan`,
|
|
613
|
-
`oat-project-quick-start`, and `oat-project-import-plan` when those lifecycle
|
|
719
|
+
`oat-project-quick-start`, `oat-project-lite`, and `oat-project-import-plan` when those lifecycle
|
|
614
720
|
skills have configured review gates. Do not add `--target`; explicit targets
|
|
615
721
|
remain manual/debug or deliberate local/user-specific overrides.
|
|
616
722
|
|
|
@@ -884,14 +990,16 @@ those artifacts; correct the project/run correlation and start a new gate run.
|
|
|
884
990
|
|
|
885
991
|
### Incident-to-regression mapping
|
|
886
992
|
|
|
887
|
-
| Observed failure
|
|
888
|
-
|
|
|
889
|
-
| Headless reviewer could not complete an async delegation
|
|
890
|
-
| Large final review exceeded the old 15-minute budget
|
|
891
|
-
| Silent child looked idle while transcripts grew
|
|
892
|
-
| Timeout or child failure produced no artifact
|
|
893
|
-
| Artifact carried the wrong gate run ID
|
|
894
|
-
| Passing artifact lost receive routing
|
|
993
|
+
| Observed failure | Regression coverage |
|
|
994
|
+
| --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
995
|
+
| Headless reviewer could not complete an async delegation | route unit matrix plus canonical checkout-local command, strict receipt, headless inline, and structured-refusal cases |
|
|
996
|
+
| Large final review exceeded the old 15-minute budget | scope-aware resolver tests plus scaled final-scope fake-runtime case |
|
|
997
|
+
| Silent child looked idle while transcripts grew | metadata-probe tests plus timeout-with-advancing-transcript fixture |
|
|
998
|
+
| Timeout or child failure produced no artifact | fail-closed `noOutputProduced` fixture |
|
|
999
|
+
| Artifact carried the wrong gate run ID | provenance-mismatch fixture |
|
|
1000
|
+
| Passing artifact lost receive routing | handoff and `receiveEligible` fixture |
|
|
1001
|
+
| Passing review reported as a failed gate after a post-selection error | post-selection recovery cases plus snapshot-replacement, non-gate-marker, and foreign-target controls |
|
|
1002
|
+
| Transient index lock turned a completed review into a failed gate | index-lock retry cases plus persistent/transient classification, receipt fixture, and fresh-process recovery control |
|
|
895
1003
|
|
|
896
1004
|
## Current limits
|
|
897
1005
|
|
|
@@ -210,6 +210,7 @@ Key behavior:
|
|
|
210
210
|
- Supports `--strategy pointer|symlink|copy` to validate the expected file shape
|
|
211
211
|
- Reports `ok`, `missing`, `content_mismatch`, and `stray` states
|
|
212
212
|
- Detects Claude-only adoptable directories and unreadable/broken instruction paths as drift
|
|
213
|
+
- Skips the derived documentation content root and any `documentation.instructionPointerExcludes` paths, using the same exclusions as `oat instructions sync`
|
|
213
214
|
- Exit code `0` when all entries are valid, `1` when drift is detected
|
|
214
215
|
- Detailed behavior: [`Instruction Sync`](instruction-sync.md)
|
|
215
216
|
|
|
@@ -227,5 +228,7 @@ Key behavior:
|
|
|
227
228
|
- Adopts Claude-only stray files by writing canonical `AGENTS.md` content first, then regenerating `CLAUDE.md`
|
|
228
229
|
- Skips mismatched files unless `--force` is provided
|
|
229
230
|
- Skips unreadable canonical or Claude-only sources and reports manual-repair guidance instead of forcing recovery
|
|
231
|
+
- Skips the documentation content tree (`<documentation.root>/docs` when that is a directory, otherwise `documentation.root`) plus any `documentation.instructionPointerExcludes` paths, so authored pages never receive pointers; app-level instruction files such as `apps/oat-docs/AGENTS.md` are still synced
|
|
232
|
+
- Never deletes an existing `CLAUDE.md` inside an excluded tree
|
|
230
233
|
- Uses pointer content `@AGENTS.md\n`, file symlinks, or hard copies depending on the selected strategy
|
|
231
234
|
- Detailed behavior and examples: [`Instruction Sync`](instruction-sync.md)
|
|
@@ -23,8 +23,115 @@ Instruction sync is currently project-only.
|
|
|
23
23
|
- It supports nested directories all the way down the tree.
|
|
24
24
|
- It skips provider-irrelevant or local-only roots such as `.git`, `.oat`, `.worktrees`, and `node_modules`.
|
|
25
25
|
- Exception: `.oat/repo/**` is scanned even though the rest of `.oat/` is skipped, so the curated `AGENTS.md` files there (repo root guidance, `pjm/`, `reference/`) get their sibling `CLAUDE.md` shims managed and validated like any other directory. The rest of `.oat/` (`templates/`, `projects/`, `sync/`) stays excluded.
|
|
26
|
+
- It skips the documentation content tree by default, and any path you add to `documentation.instructionPointerExcludes`. See [Documentation trees](#documentation-trees) below.
|
|
26
27
|
- It does not scan user-level provider roots such as `~/.claude` in this release.
|
|
27
28
|
|
|
29
|
+
## Documentation Trees
|
|
30
|
+
|
|
31
|
+
A documentation tree holds authored pages, not instructions for agents. A
|
|
32
|
+
`CLAUDE.md` written into one becomes a published page, and a page legitimately
|
|
33
|
+
named `CLAUDE.md` is content that must not be treated as a pointer. Both
|
|
34
|
+
`oat instructions validate` and `oat instructions sync` therefore skip the
|
|
35
|
+
documentation content root, so validate never reports drift that sync refuses
|
|
36
|
+
to fix.
|
|
37
|
+
|
|
38
|
+
The content root is derived from `documentation.root` in `.oat/config.json`:
|
|
39
|
+
|
|
40
|
+
- `<documentation.root>/docs` when that path is a directory;
|
|
41
|
+
- otherwise `documentation.root` itself.
|
|
42
|
+
|
|
43
|
+
This is the same derivation `oat docs generate-index` uses to pick its default
|
|
44
|
+
docs directory, so the excluded tree and the indexed tree agree by
|
|
45
|
+
construction. (`oat docs generate-index --docs-dir` overrides the index side
|
|
46
|
+
only; it does not change what instruction sync excludes.)
|
|
47
|
+
|
|
48
|
+
**App-level instruction files are still synced.** `documentation.root`
|
|
49
|
+
canonically names the docs _app_ root, and a file like
|
|
50
|
+
`apps/oat-docs/AGENTS.md` is instructions for working on the docs app rather
|
|
51
|
+
than a documentation page. When the app root has a `docs` child, only that
|
|
52
|
+
child is skipped, and the app root keeps receiving its `CLAUDE.md` pointer. Opt
|
|
53
|
+
the app root out explicitly if you do not want it synced.
|
|
54
|
+
|
|
55
|
+
Add further paths with `documentation.instructionPointerExcludes`, a list of
|
|
56
|
+
repository-relative directories. Set it with
|
|
57
|
+
`oat config set documentation.instructionPointerExcludes "vendor,third_party/docs"`
|
|
58
|
+
(an empty value clears it, and `oat config unset` removes it), or write it
|
|
59
|
+
directly:
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"documentation": {
|
|
64
|
+
"root": "apps/oat-docs",
|
|
65
|
+
"instructionPointerExcludes": ["vendor", "third_party/docs"]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Each entry excludes that directory and everything beneath it, matching the
|
|
71
|
+
directory path exactly rather than by prefix — excluding `apps/docs` leaves a
|
|
72
|
+
sibling `apps/docs-legacy` scanned. Entries are repository-relative and
|
|
73
|
+
normalized, so `apps/./docs`, `apps//docs`, and `apps/docs/` all name the same
|
|
74
|
+
tree; absolute paths and paths escaping the repository are dropped with a
|
|
75
|
+
warning when they are already stored — and refused outright by
|
|
76
|
+
`oat config set` — and the repository root itself cannot be excluded. A structurally malformed value
|
|
77
|
+
(anything other than an array of non-empty strings) is rejected with exit code
|
|
78
|
+
`2` rather than silently ignored.
|
|
79
|
+
|
|
80
|
+
The list is additive to the derived content root, and it is applied after the
|
|
81
|
+
`.oat/repo` carve-in, so excluding _another_ tree can never collaterally leave
|
|
82
|
+
`.oat/repo/**` unscanned. `.oat/repo` itself is never excludable — listing it
|
|
83
|
+
is reported as having no effect rather than silently honoured, and its
|
|
84
|
+
`AGENTS.md` keeps its pointer. A deliberate opt-out naming a path _beneath_
|
|
85
|
+
it, such as `.oat/repo/pjm`, is honoured: descendants are reached by ordinary
|
|
86
|
+
traversal, so only the carve-in root is protected from exclusion.
|
|
87
|
+
|
|
88
|
+
### When an exclusion does nothing
|
|
89
|
+
|
|
90
|
+
An entry that is well formed but cannot protect anything — it names a
|
|
91
|
+
directory that does not exist, differs in case from the real path on a
|
|
92
|
+
case-insensitive filesystem such as APFS, is absolute, escapes the repository,
|
|
93
|
+
or is the unexcludable `.oat/repo` — does not fail the command. It is reported
|
|
94
|
+
as a warning naming the entry, and it is never counted as protection.
|
|
95
|
+
|
|
96
|
+
The warning channel depends on the mode: in human mode warnings are written to
|
|
97
|
+
stderr, and under `--json` they are carried in the `exclusionWarnings` payload
|
|
98
|
+
field instead, because `--json` suppresses stderr warnings entirely.
|
|
99
|
+
|
|
100
|
+
That distinction matters most on a case-insensitive filesystem: a
|
|
101
|
+
`documentation.root` of `Apps/Docsapp` resolves happily while the scan compares
|
|
102
|
+
the real `apps/docsapp`, so the tree would be scanned after all. Trust
|
|
103
|
+
`effectiveExcludedPaths`, not `excludedPaths`, when deciding whether a tree is
|
|
104
|
+
protected — and read `exclusionWarnings` for the reason, since the stderr
|
|
105
|
+
warnings are silent under `--json`.
|
|
106
|
+
|
|
107
|
+
Because both commands read `.oat/config.json` to resolve exclusions, they
|
|
108
|
+
inherit its validation. Any value that fails a _fail-closed_ field check —
|
|
109
|
+
including keys these commands do not otherwise use, such as
|
|
110
|
+
`documentation.excludes` — makes `oat instructions sync` and
|
|
111
|
+
`oat instructions validate` exit `2` until it is repaired. Not every key is
|
|
112
|
+
fail-closed: a wrong-typed scalar such as `documentation.root` is dropped
|
|
113
|
+
rather than rejected, so it never aborts the command (a dropped `root` simply
|
|
114
|
+
leaves the content root underived, and no default exclusion applies).
|
|
115
|
+
|
|
116
|
+
Exclusion only stops a directory from being scanned. Nothing is deleted: a
|
|
117
|
+
`CLAUDE.md` that already exists inside an excluded tree is left exactly as it
|
|
118
|
+
is. When any exclusion is configured, `--json` output carries three additional
|
|
119
|
+
fields.
|
|
120
|
+
|
|
121
|
+
- `excludedPaths` lists the configured exclusions — a statement of intent, not
|
|
122
|
+
a per-directory skip log, so `.oat` appearing there does not contradict
|
|
123
|
+
`.oat/repo` still being scanned.
|
|
124
|
+
- `effectiveExcludedPaths` lists the subset that names a real, case-exact
|
|
125
|
+
directory the scan actually pruned. It is present whenever `excludedPaths`
|
|
126
|
+
is, including as an empty array when every configured entry turned out to be
|
|
127
|
+
inert.
|
|
128
|
+
- `exclusionWarnings` lists one message per configured exclusion that will not
|
|
129
|
+
protect anything — the `--json` counterpart of the stderr warnings above.
|
|
130
|
+
|
|
131
|
+
Each field is omitted when it would be empty. `exclusionWarnings` is
|
|
132
|
+
independent of the other two: an absolute or repository-escaping entry is
|
|
133
|
+
dropped before `excludedPaths` is built, so it appears only here.
|
|
134
|
+
|
|
28
135
|
## Canonical Model
|
|
29
136
|
|
|
30
137
|
- `AGENTS.md` is canonical.
|