@open-agent-toolkit/cli 0.2.29 → 0.2.31

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/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/configuration.md +52 -1
  3. package/assets/docs/contributing/code.md +19 -7
  4. package/assets/docs/contributing/explainer-kit-verification.md +9 -1
  5. package/assets/docs/contributing/skills.md +9 -0
  6. package/assets/docs/workflows/projects/artifacts.md +5 -0
  7. package/assets/docs/workflows/projects/index.md +1 -0
  8. package/assets/docs/workflows/projects/lifecycle.md +23 -0
  9. package/assets/docs/workflows/projects/retro.md +261 -0
  10. package/assets/docs/workflows/skills/explainer-kit-providers.md +16 -5
  11. package/assets/docs/workflows/skills/explainer-kit.md +98 -38
  12. package/assets/docs/workflows/skills/index.md +6 -0
  13. package/assets/public-package-versions.json +4 -4
  14. package/assets/skills/explainer-kit/SKILL.md +33 -8
  15. package/assets/skills/explainer-kit/briefs/project-recap.md +25 -7
  16. package/assets/skills/explainer-kit/recipes/project-recap.v2.json +72 -0
  17. package/assets/skills/explainer-kit/references/contracts.md +49 -17
  18. package/assets/skills/explainer-kit/references/destination-contract.md +141 -25
  19. package/assets/skills/explainer-kit/references/extension-contract.md +19 -10
  20. package/assets/skills/explainer-kit/references/visual-authoring.md +24 -0
  21. package/assets/skills/explainer-kit/references/visual-review.md +19 -5
  22. package/assets/skills/explainer-kit/schemas/author-request.v3.schema.json +241 -0
  23. package/assets/skills/explainer-kit/schemas/publish-receipt.v2.schema.json +215 -0
  24. package/assets/skills/explainer-kit/schemas/publish-request.v2.schema.json +34 -0
  25. package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -1
  26. package/assets/skills/explainer-kit/schemas/terminal-evidence.v1.schema.json +81 -0
  27. package/assets/skills/explainer-kit/schemas/visual-review-evidence.v1.schema.json +66 -0
  28. package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +109 -3
  29. package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +550 -17
  30. package/assets/skills/explainer-kit/scripts/lib/durability.mjs +90 -8
  31. package/assets/skills/explainer-kit/scripts/lib/fs-safe.mjs +5 -0
  32. package/assets/skills/explainer-kit/scripts/lib/internal-references.mjs +538 -0
  33. package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +129 -11
  34. package/assets/skills/explainer-kit/scripts/lib/publication-policy.mjs +54 -0
  35. package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +2 -1
  36. package/assets/skills/explainer-kit/scripts/lib/records.mjs +139 -22
  37. package/assets/skills/explainer-kit/scripts/lib/s3-roots.mjs +353 -0
  38. package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +237 -107
  39. package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +1 -0
  40. package/assets/skills/explainer-kit/scripts/lib/terminal-evidence.mjs +157 -0
  41. package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +26 -6
  42. package/assets/skills/explainer-kit/scripts/run.mjs +1006 -144
  43. package/assets/skills/oat-explainer-kit/SKILL.md +16 -3
  44. package/assets/skills/oat-explainer-kit/references/config-contract.md +13 -8
  45. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +50 -6
  46. package/assets/skills/oat-explainer-kit/references/migration.md +2 -1
  47. package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +11 -0
  48. package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +37 -15
  49. package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +83 -0
  50. package/assets/skills/oat-explainer-kit/scripts/derive-destination.mjs +91 -0
  51. package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +66 -10
  52. package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +60 -21
  53. package/assets/skills/oat-explainer-kit/scripts/resolve-paths.mjs +52 -8
  54. package/assets/skills/oat-explainer-kit/scripts/run.mjs +271 -36
  55. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +38 -38
  56. package/assets/skills/oat-project-complete/SKILL.md +60 -8
  57. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +38 -38
  58. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  59. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +28 -6
  60. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +38 -38
  61. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +38 -38
  62. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +38 -38
  63. package/assets/skills/oat-project-retro/SKILL.md +310 -0
  64. package/assets/skills/oat-project-retro/references/apply-procedure.md +212 -0
  65. package/assets/skills/oat-project-retro/references/evidence-and-lanes.md +91 -0
  66. package/assets/skills/oat-project-retro/references/retro-quality-bar.md +100 -0
  67. package/assets/skills/oat-project-retro-file/SKILL.md +387 -0
  68. package/assets/templates/project-retro.md +236 -0
  69. package/dist/commands/config/index.d.ts.map +1 -1
  70. package/dist/commands/config/index.js +99 -0
  71. package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
  72. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  73. package/dist/commands/init/tools/shared/skill-manifest.js +3 -0
  74. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  75. package/dist/commands/project/archive/archive-utils.js +57 -7
  76. package/dist/commands/project/archive/explainer-terminal-evidence.d.ts +29 -0
  77. package/dist/commands/project/archive/explainer-terminal-evidence.d.ts.map +1 -0
  78. package/dist/commands/project/archive/explainer-terminal-evidence.js +37 -0
  79. package/dist/config/oat-config.d.ts +14 -1
  80. package/dist/config/oat-config.d.ts.map +1 -1
  81. package/dist/config/oat-config.js +42 -2
  82. package/dist/config/resolve.d.ts.map +1 -1
  83. package/dist/config/resolve.js +9 -0
  84. package/package.json +2 -2
  85. /package/assets/skills/explainer-kit/recipes/{project-recap.json → project-recap.v1.json} +0 -0
  86. /package/assets/skills/explainer-kit/schemas/{publish-receipt.schema.json → publish-receipt.v1.schema.json} +0 -0
  87. /package/assets/skills/explainer-kit/schemas/{publish-request.schema.json → publish-request.v1.schema.json} +0 -0
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.29"
3
+ "oatVersion": "0.2.31"
4
4
  }
@@ -138,6 +138,7 @@ plumbing uses `explainers.*`; project lifecycle preferences use
138
138
  | `explainers.publish.publicBaseUrl` | HTTPS URL | shared | unset |
139
139
  | `explainers.publish.awsRegion` | non-empty string | shared | unset |
140
140
  | `explainers.publish.awsProfile` | non-empty string | local, user | unset |
141
+ | `explainers.publish.publicAccess` | `public\|protected` | shared | `public` |
141
142
  | `workflow.explainers.projectExplainer` | `always\|ask\|never` | local, shared, user | `ask` |
142
143
  | `workflow.explainers.projectRecap` | `always\|ask\|never` | local, shared, user | `ask` |
143
144
 
@@ -172,6 +173,46 @@ chain applies. Config never starts publishing by itself: lifecycle callers must
172
173
  still select publish durability explicitly, and publishing remains
173
174
  human-gated. Raw AWS credentials are not config keys.
174
175
 
176
+ `publicAccess` declares whether published objects are expected to be reachable
177
+ anonymously; it does not authorize publication and it does not change any
178
+ bucket policy. It selects how publication is verified. The default `public`
179
+ fetches every uploaded object over HTTPS and compares the returned bytes
180
+ against the manifest hash. `protected` skips those anonymous fetches, verifies
181
+ each object through authenticated S3 hashing instead, and records
182
+ `skipped-protected` in the publish receipt. Because no anonymous fetch happens
183
+ under `protected`, a mistyped `publicBaseUrl` is not detected at publish time:
184
+ the advertised URLs are still written into the initiative catalog and receipt,
185
+ and the catalog records `publicVerification: "skipped-by-policy"` so consumers
186
+ can see the URLs were never exercised.
187
+
188
+ ### Explainer publication environment variables
189
+
190
+ Two escape hatches are read from the process environment rather than from
191
+ config, because both are machine-local operational overrides rather than
192
+ project settings. Neither has a config key.
193
+
194
+ | Variable | Effect | Default |
195
+ | ------------------------------------------------ | --------------------------------------------------------------------------- | ------- |
196
+ | `EXPLAINER_KIT_ALLOW_PRIVATE_PUBLIC_ROOT` | Permits a loopback, link-local, unique-local or RFC 1918 `publicBaseUrl` | off |
197
+ | `EXPLAINER_KIT_SUPPRESS_ROOT_DIVERGENCE_WARNING` | Silences the advisory warning when the S3 key prefix and public path differ | off |
198
+
199
+ Both accept `1`, `true` or `on`.
200
+
201
+ `EXPLAINER_KIT_ALLOW_PRIVATE_PUBLIC_ROOT` disables an anti-SSRF control. Public
202
+ verification issues an outbound GET against whatever `publicBaseUrl` names, so
203
+ by default the connector refuses internal addresses — including the
204
+ `169.254.169.254` instance-metadata endpoint. Enable it only for a genuinely
205
+ internal mirror. When it is set and the root is in fact non-public, the run
206
+ records `publicRootPolicy: "private-allowed"` in the publish receipt, so a
207
+ publication made with the control disabled is distinguishable in durable
208
+ evidence from one made without it. The policy is address-literal only: a
209
+ hostname that resolves inward is not detected either way.
210
+
211
+ `EXPLAINER_KIT_SUPPRESS_ROOT_DIVERGENCE_WARNING` only affects an advisory
212
+ message. Divergent roots are never a publication failure — a CloudFront Origin
213
+ Path deployment legitimately maps a bucket prefix to the distribution root — so
214
+ this changes no validation outcome.
215
+
175
216
  See [Explainer Kit](../workflows/skills/explainer-kit.md) for recipes, artifact
176
217
  locations, lifecycle behavior, and durability.
177
218
 
@@ -568,7 +609,11 @@ Workflow preference keys live under the `workflow.*` namespace:
568
609
  - `workflow.hillCheckpointDefault` — `every` or `final`. Default HiLL checkpoint behavior in `oat-project-implement`: pause after every phase or only after the last phase. When unset, the skill prompts.
569
610
  - `workflow.archiveOnComplete` — boolean. Skip the "Archive after completion?" prompt in `oat-project-complete`. When unset, the skill prompts.
570
611
  - `workflow.createPrOnComplete` — boolean. Skip the "Open a PR?" prompt in `oat-project-complete`; when true, completion auto-triggers PR creation. When unset, the skill prompts.
571
- - `workflow.postImplementSequence` — legacy `wait`, `summary`, `pr`, or `docs-pr`, or `{ "preApproval": [...], "postApproval": [...] }`. Legacy values remain strings; structured arrays contain ordered, globally unique `summary`, `document`, and `pr` steps. Pre-approval steps run after final review and before final HiLL approval; post-approval steps run only after that approval. Plain retrieval keeps legacy strings and prints structured values as compact JSON; `--json` returns the raw value.
612
+ - `workflow.postImplementSequence` — legacy `wait`, `summary`, `pr`, or `docs-pr`, or `{ "preApproval": [...], "postApproval": [...] }`. Legacy values remain strings and keep their existing mappings. Structured arrays contain ordered, globally unique `summary`, `document`, `pr`, and `retro` steps. `retro` is post-approval only: a structured value containing it in `preApproval` is rejected. Pre-approval steps run after final review and before final HiLL approval; post-approval steps run only after that approval. Plain retrieval keeps legacy strings and prints structured values as compact JSON; `--json` returns the raw value.
613
+ - `workflow.retro.filing.repo` — `issues`, `backlog`, or `none`; unset by default. Selects the repo-lane filing destination.
614
+ - `workflow.retro.filing.upstream` — `issues` or `none`; unset by default. Selects the upstream-lane filing destination.
615
+ - `workflow.retro.apply` — `auto` or `ask`; defaults to `ask` behavior when unset. `auto` authorizes bounded promotion application in non-interactive runs; `ask` is propose-only when no interaction is possible.
616
+ - `workflow.retro.upstreamRepo` — `owner/repo`; unset in CLI configuration. Retro guidance defaults it to `voxmedia/open-agent-toolkit`.
572
617
  - `workflow.reviewExecutionModel` — `subagent`, `inline`, or `fresh-session`. Default final-review execution model in `oat-project-implement`. `subagent` and `inline` run automatically. `fresh-session` is a soft preference: the skill prints guidance to run the review in another session but still offers escape hatches to `subagent` or `inline` if you change your mind. When unset, the skill prompts.
573
618
  - `workflow.autoReviewAtHillCheckpoints` — boolean. Automatically run the extra lifecycle review when a HiLL checkpoint is reached. This does not control Tier 1 per-phase `oat-reviewer` gates, which run after each phase in Tier 1 regardless of this setting. When unset, the skill prompts.
574
619
  - `workflow.autoNarrowReReviewScope` — boolean, default `true`. Re-reviews automatically use the guarded range after the prior matching review's recorded head. Unset and `true` enable narrowing without a prompt; set `false` to opt out and use the nominal full scope.
@@ -585,6 +630,12 @@ Workflow preference keys live under the `workflow.*` namespace:
585
630
  - `workflow.gates.skills` / `workflow.gates.execTargets` — structured per-skill final gate commands and exec-target registry. Use `oat gate set`, `oat gate target set`, `oat gate review`, and `oat gate cross-provider-exec`; do not use `oat config set` for these objects.
586
631
  - `workflow.gateTimeouts.code` / `workflow.gateTimeouts.artifact` — validated default gate-review budgets in milliseconds. Both resolve through `local > shared > user`.
587
632
 
633
+ Explicit `workflow.retro.apply: auto` or `workflow.retro.filing.*`
634
+ configuration counts as consent for the corresponding non-interactive action.
635
+ Without those settings, non-interactive retro generation records proposals but
636
+ does not apply or file them. Interactive runs still present the applicable
637
+ promotion and filing choices before side effects.
638
+
588
639
  The two project-log keys use the standard workflow precedence:
589
640
  `local > shared > user > default`.
590
641
 
@@ -41,18 +41,30 @@ OAT is organized as a pnpm workspace with Turborepo orchestration.
41
41
 
42
42
  ## Quality Gates
43
43
 
44
- Run the workspace checks that match your change surface:
44
+ Every change runs the ordered Definition of Done from the root `AGENTS.md`,
45
+ which mirrors CI's gate steps exactly so a locally green run implies CI green:
45
46
 
46
47
  ```bash
47
- pnpm test
48
- pnpm lint
49
- pnpm format
48
+ pnpm check
50
49
  pnpm type-check
51
- pnpm build # excludes docs for speed
52
- pnpm build:docs # builds docs site and its dependencies
50
+ pnpm test
51
+ pnpm build # excludes docs for speed
52
+ pnpm run check:skill-bumps # changed .agents/skills/*/SKILL.md must bump version
53
+ pnpm release:check-versions # lockstep public package version bumps
54
+ pnpm release:validate
55
+ pnpm build:docs # builds docs site and its dependencies
53
56
  ```
54
57
 
55
- For narrower changes, use package-specific checks when possible, but do not merge without passing the relevant workspace gates.
58
+ `pnpm test` is composite: it runs the workspace vitest suites, then
59
+ `test:smoke` (`tools/smoke`), `test:skills` (`.agents/skills/*/tests`), and
60
+ the named-file `test:release` set. Steps 5 and 6 are the version-lockstep
61
+ gates; they are in the local list because they previously ran only in CI and
62
+ version-bump drift twice reached review with no local gate to surface it.
63
+
64
+ CI runs neither `pnpm lint` nor `pnpm format` — run both whenever a change
65
+ touches `tools/smoke` or `.agents/skills`, since nothing else covers them.
66
+ For narrower changes, use package-specific checks when possible, but do not
67
+ merge without passing the relevant workspace gates.
56
68
 
57
69
  ### TypeScript and type-aware linting
58
70
 
@@ -62,6 +62,11 @@ The suite recomputes semantic-input hashes, grounds every claim in retained
62
62
  source evidence, and evaluates the shared rubric against live runtime output.
63
63
  A prose claim or status label without runtime proof does not pass.
64
64
 
65
+ The existing three-case, 27-capture golden suite is intentionally unchanged by
66
+ the prose-led visual-review work. Simplifying it is a separate follow-up: first
67
+ audit each case's unique coverage, runtime cost, and flakiness, then remove or
68
+ replace fixtures only with evidence that the same behavior remains protected.
69
+
65
70
  ## Inspect generated evidence
66
71
 
67
72
  The suite materializes each case's runtime package under its temporary working
@@ -114,9 +119,12 @@ pnpm check
114
119
  pnpm type-check
115
120
  pnpm test
116
121
  pnpm build
122
+ pnpm run check:skill-bumps
123
+ pnpm release:check-versions
124
+ pnpm release:validate
125
+ pnpm build:docs
117
126
  pnpm lint
118
127
  pnpm format
119
- pnpm build:docs
120
128
  git diff --check
121
129
  ```
122
130
 
@@ -43,6 +43,15 @@ Skill behavior is defined by frontmatter plus the process contract in each `SKIL
43
43
  - `allowed-tools`
44
44
  - `oat_gateable`
45
45
 
46
+ ### The `version` field is gated
47
+
48
+ Changing any canonical skill's `SKILL.md` requires bumping its frontmatter
49
+ `version` in the same PR — one bump per changed skill in the final PR diff,
50
+ even if the skill was edited multiple times on the branch. The rule is
51
+ enforced by `pnpm run check:skill-bumps`, which runs locally (root `AGENTS.md`
52
+ Definition of Done) and in CI; a changed skill whose version matches
53
+ `origin/main` fails the gate.
54
+
46
55
  ## Practical Authoring Flow
47
56
 
48
57
  1. Decide whether you are adding a general reusable skill or an OAT-specific lifecycle skill.
@@ -30,6 +30,11 @@ Mode-sensitive notes:
30
30
  - `pr/*.md`: generated PR descriptions
31
31
  - `references/imported-plan.md`: preserved source plan for import mode
32
32
  - `references/split-plan.json`: persisted split plan for a coordination parent, used as the durable resume source when `oat-project-split` is interrupted
33
+ - `references/project-retro.md`: optional post-approval retrospective with
34
+ machine-scannable repo-improvement (`RP-NN`) and upstream-feedback (`UP-NN`)
35
+ registers. Promotion and filing rollups let the retro skills resume approved
36
+ applications and tracker filing without repeating settled work. See
37
+ [Project Retrospectives](retro.md).
33
38
 
34
39
  ### Explainer artifacts
35
40
 
@@ -12,6 +12,7 @@ Projects are where the workflow layer becomes concrete: lifecycle phases, `state
12
12
  ## Contents
13
13
 
14
14
  - [Lifecycle](lifecycle.md) - End-to-end flow from discovery through completion.
15
+ - [Project Retrospectives](retro.md) - Generate evidence-grounded retros, apply repo improvements, and file tracker feedback.
15
16
  - [Autonomous Project Execution](autonomy.md) - Session-scoped autonomy signals, gate boundaries, review requirements, and execution learnings.
16
17
  - [OAT in Cursor Cloud](cursor-cloud.md) - Project-home, provisioning, asset-precedence, and execution-surface guidance for cloud agents.
17
18
  - [Design Modes](design-modes.md) - How full design balances collaborative, selective collaborative, and draft-and-review interaction.
@@ -110,12 +110,35 @@ approval, and only then runs post-approval steps. The snapshot is restart-safe:
110
110
  an incomplete sequence routes back to implementation and resumes from its first
111
111
  incomplete step.
112
112
 
113
+ Structured sequences accept `summary`, `document`, `pr`, and `retro`.
114
+ `retro` is post-approval only: placing it in `preApproval` invalidates the
115
+ structured value. This placement lets the retrospective include the final
116
+ approval and feedback tail while still running before project completion
117
+ freezes lifecycle artifacts. The legacy string mappings are unchanged and do
118
+ not add a retro step.
119
+
120
+ When a pending post-approval `retro` step runs, OAT dispatches
121
+ `oat-project-retro` in generate mode. Applying repo improvements and filing
122
+ tracker items remain separately consented through interactive confirmation or
123
+ `workflow.retro.*` configuration.
124
+
113
125
  `oat-project-next` checks `oat_implement_exit_gate` before every normal
114
126
  post-implementation route. Missing, pending, blocked, malformed, or stale state
115
127
  routes back to `oat-project-implement` even when `oat_phase_status` is
116
128
  `complete` or `pr_open`. Only an allowed, fresh disposition can continue to
117
129
  summary, documentation, PR, or project completion.
118
130
 
131
+ ### Retrospective completion safety net
132
+
133
+ Before an interactive completion archives the project,
134
+ `oat-project-complete` checks for
135
+ `{PROJECT_PATH}/references/project-retro.md`. If the artifact is missing, it
136
+ offers to generate one before completion. If the artifact exists, completion
137
+ does not offer another retro; it may note unsettled promotion or filing
138
+ registers. Non-interactive completion skips this offer, so autonomous
139
+ generation occurs only through an explicitly configured post-approval `retro`
140
+ step.
141
+
119
142
  When `workflow.autoReviewAtHillCheckpoints` is enabled or `plan.md` frontmatter sets `oat_auto_review_at_hill_checkpoints`, completing a HiLL checkpoint automatically runs the extra lifecycle review scoped to every implementation phase not already covered by a passed whole-phase code review, through the just-completed checkpoint. Mid-implementation multi-phase reviews use inclusive phase-range scopes such as `p02-p03`; the final implementation checkpoint uses `code final`. The review uses auto-disposition mode (minors auto-converted to fix tasks, no user prompts). Disabled by default. Legacy `autoReviewAtCheckpoints` and `oat_auto_review_at_checkpoints` are still read as fallbacks. This does not control Tier 1 per-phase `oat-reviewer` gates.
120
143
 
121
144
  ### Phase-review setup during planning
@@ -0,0 +1,261 @@
1
+ ---
2
+ title: Project Retrospectives
3
+ description: Generate evidence-grounded project retrospectives, apply repo improvements, and file tracker feedback.
4
+ ---
5
+
6
+ # Project Retrospectives
7
+
8
+ OAT project retrospectives capture how an implementation run went and route
9
+ what should change next. The workflow uses two skills:
10
+
11
+ - `oat-project-retro` generates
12
+ `{PROJECT_PATH}/references/project-retro.md` and applies approved repo
13
+ improvements.
14
+ - `oat-project-retro-file` files tracker-bound feedback into repository or
15
+ upstream GitHub issues and OAT backlog items.
16
+
17
+ A configured `retro` post-approval sequence step can generate the artifact
18
+ after final feedback exists and before project completion freezes lifecycle
19
+ artifacts. Interactive completion also offers generation when the artifact is
20
+ missing. Neither path applies or files findings without separate consent.
21
+
22
+ ## Generate a retrospective
23
+
24
+ Ask to run the project retro, or configure `retro` in
25
+ `workflow.postImplementSequence.postApproval`. Generate mode resolves the active
26
+ project, inventories evidence, renders the retro artifact, and records the run
27
+ in the project log when that log exists.
28
+
29
+ Evidence is read in this order:
30
+
31
+ 1. `project-log.md`
32
+ 2. `oat-execution-learnings.md`, when present
33
+ 3. Lifecycle artifacts such as `implementation.md`, `state.md`, `plan.md`,
34
+ design and discovery artifacts, reviews, and evidence ledgers
35
+ 4. The current session or run transcript when the environment makes it
36
+ available
37
+
38
+ The artifact identifies every used or unavailable source. Missing transcript
39
+ access is recorded rather than hidden, and runtime claims fall back to durable
40
+ ledgers when transcript output is incomplete. Findings distinguish confirmed
41
+ causes, hypotheses, and inconclusive mechanisms.
42
+
43
+ Evidence status remains `used | unavailable`. When an evidence family is
44
+ partial, split it into truthful source entries, such as
45
+ `archived-review-markdown: unavailable` and `gate-receipts: used`, rather than
46
+ recording `review-artifacts: unavailable`. Do not add a `partial` evidence
47
+ status. Derivative current-run reconnaissance transcripts are not original
48
+ project-run evidence.
49
+
50
+ ### Scale depth to the evidence
51
+
52
+ Keep output concise by default. Every section must add distinct information.
53
+ Prefer references to evidence over repeated chronology. For a small project,
54
+ keep core sections brief. Use subsections and tables only for evidence-rich
55
+ projects where they improve decisions. The required core and register
56
+ contracts stay intact; evidence volume controls depth, not a new configuration
57
+ or consent setting.
58
+
59
+ Each material incident remains understandable without opening another
60
+ artifact. Use stable evidence anchors such as project-log event IDs, artifact
61
+ headings, review paths, decision IDs, and commit IDs. Anchors supplement but
62
+ never replace explanation.
63
+
64
+ Narrative sections have distinct ownership:
65
+
66
+ - `Challenges and Struggles` owns the complete incident narrative: what
67
+ happened, impact, response, and result.
68
+ - `Where We Changed Course` records only the trigger, changed direction, and
69
+ outcome.
70
+ - `Domain Learnings` abstracts reusable lessons without replaying chronology.
71
+ - `Gotchas for Humans` and `Gotchas for Autonomous Agents` contain
72
+ future-facing instructions rather than incident summaries.
73
+
74
+ Every retro contains two machine-scannable registers:
75
+
76
+ - **Repo Improvements (`RP-NN`)** route each item through
77
+ `Disposition: apply` for a bounded repo edit or `Disposition: file` for a
78
+ tracker follow-up.
79
+ - **OAT Upstream Feedback (`UP-NN`)** contains sanitized, tracker-ready
80
+ suggestions for toolkit improvements. The section remains present with an
81
+ explicit empty state when no upstream item is warranted.
82
+
83
+ Per-item statuses and frontmatter rollups make interrupted and repeated runs
84
+ resumable. The promotions rollup covers RP apply-items; the filing rollup covers
85
+ UP items plus RP file-items.
86
+
87
+ ### Project-log receipt
88
+
89
+ When a project log exists, generate mode appends this one-line structural
90
+ receipt:
91
+
92
+ ```text
93
+ retro artifact=<path> evidence_used=<csv> evidence_unavailable=<csv> promotions=<number> upstream=<number> apply=<performed|declined|skipped|deferred> filing=<performed|declined|skipped|deferred>
94
+ ```
95
+
96
+ Source identifiers are validated, deduplicated, sorted bytewise ascending, and
97
+ joined with commas and no spaces; an empty source list is `none`. Counts
98
+ describe the generated registers.
99
+
100
+ Before any apply decision or filing dispatch, capture one immutable eligibility
101
+ snapshot for that action. Apply snapshots contain unsettled RP apply-items;
102
+ filing snapshots contain the lane-tagged union of unsettled UP items and RP
103
+ file-items. Do not recompute initial eligibility after an action changes the
104
+ registers.
105
+
106
+ Derive each outcome from that snapshot with this precedence:
107
+
108
+ 1. An initially empty snapshot is `skipped`.
109
+ 2. An action-level interactive rejection before entry is `declined`.
110
+ 3. Non-entry, failure, or any snapshot member still unsettled is `deferred`.
111
+ 4. An entered action that completes normally with no snapshot member remaining
112
+ is `performed`.
113
+
114
+ This makes an all-settled successful action `performed`, even though its
115
+ post-action eligible set is empty. For mixed filing lanes, any initially
116
+ eligible lane left unsettled by absent or `none` routing makes the single filing
117
+ outcome `deferred`; normal completion that settles every initial lane is
118
+ `performed`.
119
+
120
+ The append uses stable structural identity and the exact rendered body:
121
+
122
+ ```bash
123
+ oat project log append --project "$PROJECT_PATH" --structural \
124
+ --producer oat-project-retro \
125
+ --ref project-retro \
126
+ --body "$RECEIPT_BODY"
127
+ ```
128
+
129
+ ## Apply repo improvements
130
+
131
+ Invoke apply mode directly with wording such as "apply the retro findings."
132
+ Apply mode requires an existing retro and never regenerates it. It processes
133
+ only RP items whose authoritative disposition is `apply` and whose status is
134
+ `proposed` or `approved`.
135
+
136
+ Interactive runs present each item, target, rationale, and concrete edit before
137
+ approval. Non-interactive runs apply items only when
138
+ `workflow.retro.apply: auto`; an absent value or `ask` leaves proposals
139
+ untouched when no interaction is possible.
140
+
141
+ Application follows the item type:
142
+
143
+ - documentation updates the canonical existing page;
144
+ - agent instructions update the narrowest existing instruction surface;
145
+ - rules update the canonical scoped rule;
146
+ - decisions use `oat decision new` after an exact duplicate check; and
147
+ - code follow-ups default to `Disposition: file` and remain outside apply mode.
148
+
149
+ After a successful application, the skill records `Status: applied` and an
150
+ `Applied-ref`. Re-runs skip settled items and recover an exact prior side effect
151
+ instead of applying it twice.
152
+
153
+ For a docs item whose safely normalized target canonical path has the exact,
154
+ case-sensitive final component `project-log.md`, apply mode uses
155
+ `oat project log append` and never directly edits the log. Absolute paths,
156
+ traversal, and ambiguous normalization fail closed; suffixes and prefixed
157
+ lookalikes remain ordinary docs targets.
158
+
159
+ The proposal must identify the prior heading or event being corrected and
160
+ preserve the original entry. The appended judgment uses `--type feedback`,
161
+ `--scope project`, `--area "retro correction $RP_ID"`, and a body whose stable
162
+ identity includes both the RP ID and original-entry anchor. Before appending,
163
+ perform semantic post-side-effect recovery. The skill recovers an exact
164
+ uncommitted or committed correction and stops on partial, divergent, or
165
+ multiple matches before it appends.
166
+
167
+ The correction is committed first without retro writeback. A later retro-only
168
+ writeback records `Status: applied` and an `Applied-ref` naming the full
169
+ correction commit plus exact generated heading. `Applied-ref` is considered
170
+ recorded only after the correction and retro writeback are durably committed.
171
+ Append failure creates neither commit; correction-commit failure leaves the RP
172
+ unsettled for exact recovery; writeback failure preserves the correction commit
173
+ and retries only the writeback. This remains a bounded docs special case; it
174
+ adds no RP type and does not weaken the normal docs apply contract.
175
+
176
+ ## File tracker feedback
177
+
178
+ Run `oat-project-retro-file` against the active project's retro or an explicit
179
+ artifact path. It extracts every UP item and each RP item with
180
+ `Disposition: file`; it never mutates apply-items.
181
+
182
+ Before item approval, the skill reports a lane-by-destination capability
183
+ matrix:
184
+
185
+ | Lane | Destination | Preflight |
186
+ | -------- | ----------- | ----------------------------------------------------- |
187
+ | Repo | Issues | GitHub issues enabled and `gh` authenticated |
188
+ | Repo | Backlog | Canonical OAT backlog initialized and writable |
189
+ | Upstream | Issues | Upstream issues enabled and creation authorized |
190
+ | Either | None | Intentionally disabled; no external capability needed |
191
+
192
+ Interactive runs confirm or override configured lane defaults and choose a
193
+ disposition for each suspected duplicate:
194
+
195
+ 1. **Strengthen** the existing issue or backlog item with new evidence.
196
+ 2. **File as new** despite the candidate.
197
+ 3. **Skip** without filing.
198
+ 4. **Link existing** without adding content.
199
+
200
+ Strengthening is the default when applicable, but it is still an external
201
+ write. Non-interactive configuration does not authorize modifying an existing
202
+ destination; an unambiguous duplicate may be linked without an external write,
203
+ while ambiguous candidates remain unsettled for interactive review.
204
+
205
+ ### Local receipts and reruns
206
+
207
+ Before skipping an already-filed item, the filing skill runs a pre-selection
208
+ integrity pass. A local backlog destination is complete only when its path
209
+ exists, its current contents still represent the retro proposal, its full
210
+ `Destination-receipt` names the latest exact-path commit containing that path,
211
+ and `Remote-visibility` is `pushed` or `unpushed`. A valid exact recovery may
212
+ retain `filed` without mutating the destination. A missing or invalid local
213
+ receipt that cannot be recovered cannot remain `filed`.
214
+
215
+ New and strengthened local destinations use destination-first ordering: commit
216
+ the destination mutation alone, verify that commit contains the backlog path
217
+ and excludes retro writeback, then record its receipt in a later retro
218
+ writeback commit. A failed destination commit never produces `filed`. A local
219
+ link performs no destination mutation, but must recover and validate the latest
220
+ exact-path commit before it can be filed.
221
+
222
+ Remote visibility is independent of local durability. No configured upstream
223
+ means `unpushed`; the skill never pushes without separate authorization.
224
+ GitHub destinations use a validated issue URL and explicitly leave
225
+ `Destination-receipt` and `Remote-visibility` as `—`.
226
+
227
+ Public destinations receive a sanitization check when the source repository is
228
+ private. Filing records the confirmed URL or backlog path in `Destination` and
229
+ updates the filing rollup. Unavailable lanes and missing backlog metadata are
230
+ reported rather than silently rerouted or invented.
231
+
232
+ ## Configure non-interactive consent
233
+
234
+ The `workflow.retro` namespace controls non-interactive actions:
235
+
236
+ | Key | Values | Unset behavior |
237
+ | -------------------------------- | --------------------------- | ------------------------------------------- |
238
+ | `workflow.retro.apply` | `auto`, `ask` | Propose only |
239
+ | `workflow.retro.filing.repo` | `issues`, `backlog`, `none` | No repo-lane filing |
240
+ | `workflow.retro.filing.upstream` | `issues`, `none` | No upstream-lane filing |
241
+ | `workflow.retro.upstreamRepo` | `owner/repo` | Guidance uses `voxmedia/open-agent-toolkit` |
242
+
243
+ Explicit `auto` or filing destinations count as consent only for their bounded
244
+ action. Architecture, security, product-scope, credential, destructive, and
245
+ duplicate-mutation boundaries still require direction. See
246
+ [Configuration](../../cli-utilities/configuration.md#workflow-preferences-workflow)
247
+ for the full key reference.
248
+
249
+ ## Summary versus retrospective
250
+
251
+ | | Summary | Retrospective |
252
+ | --------------------- | ----------------------------- | ------------------------------------------------ |
253
+ | Primary question | What did we build and decide? | How did the run go, and what should change next? |
254
+ | Session transcript | Optional | Required when available |
255
+ | OAT upstream feedback | Rare | Required section or explicit empty lane |
256
+ | Tone | Institutional memory | Reflective and operational |
257
+ | Default path | `summary.md` | `references/project-retro.md` |
258
+
259
+ Use the summary to preserve the delivered system and its decisions. Use the
260
+ retro to preserve execution lessons, course changes, repo improvements, and
261
+ upstream toolkit feedback.
@@ -38,9 +38,11 @@ The provider-neutral `planSet` callback runs once after fact reconciliation and
38
38
  before any author callback. It returns the complete portfolio and one shared
39
39
  claim ledger.
40
40
 
41
- For a project recap, the portfolio must contain the required hub, architecture
42
- view, and deck. Optional entries must use a recipe-licensed profile, remain
43
- inside recipe and per-profile limits, and carry source-backed justification.
41
+ For a new project recap, the portfolio must contain the required navigational
42
+ hub. A diagram, deck, or deep dive is optional and must use a recipe-licensed
43
+ profile, remain inside recipe and per-profile limits, and answer a distinct
44
+ reader question with source evidence and a medium rationale. Version 1 recap
45
+ plans remain readable for replay with their historical three-artifact floor.
44
46
  Duplicate identities, undeclared sources, conflicting shared terms, and
45
47
  unjustified optionals fail validation.
46
48
 
@@ -50,14 +52,16 @@ artifact. Authors cannot add, remove, replace, or rename portfolio entries.
50
52
  ## Artifact author
51
53
 
52
54
  The core invokes `author` once per planned artifact with
53
- `explainer-kit.author-request/v2`. The request contains:
55
+ `explainer-kit.author-request/v3`. Version 2 requests remain readable for
56
+ replay. The current request contains:
54
57
 
55
58
  - artifact identity, type, and authoring path;
56
59
  - the versioned brief and bundled medium-specific guidance;
57
60
  - reconciled facts and the shared set context;
58
61
  - the matching planned artifact;
59
62
  - the resolved theme; and
60
- - the bundled shell for artistic HTML.
63
+ - the bundled shell for artistic HTML; and
64
+ - canonical artifact links ending in explicit `index.html` paths.
61
65
 
62
66
  Return `explainer-kit.author-result/v2` with exactly one of
63
67
  `content.markdown` or `content.html` and non-secret provenance. The core
@@ -128,6 +132,13 @@ all reviewed artifact IDs, structured findings, and one disposition:
128
132
  - `correct` requests one bounded correction and one final review; or
129
133
  - `fail` terminates the gate.
130
134
 
135
+ Judge typography, hierarchy, composition, density, medium leverage, template
136
+ repetition, diagram semantics, and cross-artifact cohesion from the bound
137
+ browser evidence. `pass` means no required correction remains. `correct`
138
+ findings name concrete artifact-scoped actions that can be completed in the
139
+ single bounded correction round. Keep this judgment in prose; do not invent
140
+ numeric scores or geometry thresholds.
141
+
131
142
  The critic must not mutate rendered files or evidence. The core revalidates all
132
143
  bound bytes after each callback.
133
144