@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
@@ -0,0 +1,100 @@
1
+ # Project Retro Quality Bar
2
+
3
+ ## Evidence Standard
4
+
5
+ - Ground claims in project paths, log-entry themes, review findings, or session
6
+ events.
7
+ - Distinguish confirmed causes, hypotheses, and inconclusive mechanisms.
8
+ - Prefer classification over blame and avoid generic praise.
9
+ - Keep evidence status to `used | unavailable`. When an evidence family is
10
+ partial, split it into truthful source entries, such as
11
+ `archived-review-markdown: unavailable` and `gate-receipts: used`. Do not add
12
+ a `partial` evidence status. Derivative current-run reconnaissance
13
+ transcripts are not original project-run evidence.
14
+ - Treat committed evidence as authoritative when transcript tool-result bodies
15
+ are missing.
16
+ - Record rejected or superseded alternatives when they shaped the outcome.
17
+ - Make reflections specific to this run: what changed, why the result is
18
+ trustworthy, and what future work should do differently.
19
+ - Make each material incident understandable without opening another artifact.
20
+ Use stable evidence anchors such as project-log event IDs, artifact headings,
21
+ review paths, decision IDs, and commit IDs. Anchors supplement but never
22
+ replace explanation.
23
+
24
+ ## Required Core Sections
25
+
26
+ Every rendered retro includes:
27
+
28
+ 1. Executive Summary
29
+ 2. Evidence and Review Method
30
+ 3. Outcome Snapshot
31
+ 4. Current State
32
+ 5. What Went Well
33
+ 6. Challenges and Struggles
34
+ 7. Where We Changed Course
35
+ 8. Repo Improvements (Promotion Register)
36
+ 9. OAT Upstream Feedback (Upstream Register)
37
+ 10. Reflections
38
+
39
+ The upstream section remains present with `No upstream feedback identified.`
40
+ when evidence warrants no items.
41
+
42
+ `Current State` is the narrowly bounded live-status surface. Derive it only
43
+ from register fields and frontmatter rollups. Apply and filing writeback may
44
+ refresh its contents, but headings, proposal bodies, and all other narrative
45
+ remain immutable after generation. Outside this section, qualify mutable status
46
+ as generation-time evidence; do not make unqualified claims that an item
47
+ "remains" proposed, filed, applied, or otherwise current.
48
+
49
+ ## Conditional Sections
50
+
51
+ Include only when evidence supports meaningful content:
52
+
53
+ - Decision Register and Rejected or Superseded Alternatives
54
+ - New Architecture Patterns and Approaches
55
+ - Domain Learnings
56
+ - Gotchas for Humans
57
+ - Gotchas for Autonomous Agents
58
+ - Remaining Boundaries and Follow-Ups
59
+
60
+ Keep output concise by default. Every section must add distinct information.
61
+ Prefer references to evidence over repeated chronology. For a small project,
62
+ omit unsupported conditional sections and keep core sections brief. Use
63
+ subsections and tables only for evidence-rich projects where they improve
64
+ decisions. Do not add empty headings or `N/A` placeholders.
65
+
66
+ Section ownership prevents repeated chronology:
67
+
68
+ - `Challenges and Struggles` owns the complete incident narrative: what
69
+ happened, impact, response, and result.
70
+ - `Where We Changed Course` records only the trigger, changed direction, and
71
+ outcome.
72
+ - `Domain Learnings` abstracts reusable lessons without replaying chronology.
73
+ - `Gotchas for Humans` and `Gotchas for Autonomous Agents` contain
74
+ future-facing instructions rather than incident summaries.
75
+
76
+ ## Register Quality
77
+
78
+ - IDs are stable and sequential within the artifact (`RP-NN`, `UP-NN`).
79
+ - Every RP item has a valid Type, authoritative Disposition, disposition-valid
80
+ Status, and required target field.
81
+ - Apply-items use `Target` and `Applied-ref`; file-items use `Destination`.
82
+ - `code-follow-up` defaults to `Disposition: file`.
83
+ - UP and publicly destined file-items carry a `Sanitized` field.
84
+ - Item prose is actionable: problem, evidence summary, and concrete direction.
85
+ - `oat_retro_promotions` derives only from RP apply-items.
86
+ - `oat_retro_filing` derives from UP items plus RP file-items.
87
+ - Each item contributes to exactly one rollup.
88
+ - `Current State` agrees with register fields and frontmatter rollups.
89
+
90
+ ## Final Checks
91
+
92
+ - All evidence sources are marked `used` or `unavailable`.
93
+ - No unsupported transcript-only claim appears.
94
+ - Repo and upstream feedback are not conflated.
95
+ - Public-destination drafts contain no private URLs, hostnames, credentials,
96
+ or verbatim sensitive logs.
97
+ - The rendered artifact has `oat_generated: true`, `oat_template: false`, and
98
+ no `oat_template_name`.
99
+ - The artifact contains run-specific operational lessons, not a second project
100
+ summary.
@@ -0,0 +1,387 @@
1
+ ---
2
+ name: oat-project-retro-file
3
+ version: 1.0.1
4
+ description: Use when the user requests or confirms filing proposed feedback from a project retro into repository or upstream GitHub issues and OAT backlog items. Runs destination capability, duplicate, approval, and sanitization checks before filing, then writes destinations and statuses back to the retro artifact.
5
+ disable-model-invocation: false
6
+ user-invocable: true
7
+ allowed-tools: Read, Write, Bash(git:*), Bash(pnpm:*), Bash(gh:*), Bash(oat backlog:*), Bash(oat config:*), Glob, Grep, AskUserQuestion
8
+ ---
9
+
10
+ # File Project Retro Feedback
11
+
12
+ Route tracker-bound project-retro items to host-repository or OAT-upstream
13
+ destinations, with capability preflight, duplicate handling, consent, and
14
+ idempotent status writeback.
15
+
16
+ This skill never applies `Disposition: apply` repo edits and never mutates
17
+ `oat_retro_promotions`.
18
+
19
+ ## Progress Indicators
20
+
21
+ Print one banner and concise step indicators:
22
+
23
+ ```text
24
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
25
+ OAT ▸ FILE RETRO FEEDBACK
26
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
27
+ ```
28
+
29
+ Use steps for artifact resolution, item extraction, capability preflight,
30
+ duplicate/approval review, filing, and writeback.
31
+
32
+ ## Artifact Hygiene
33
+
34
+ Before finishing or committing, format every created or edited file with the
35
+ repository's documented write/fix formatter, preferably file-scoped. Run
36
+ checks relevant to the touched files. Never stage unrelated changes.
37
+
38
+ ## Process
39
+
40
+ ### Step 1: Resolve the Retro Artifact
41
+
42
+ Use an explicit artifact path when provided. Otherwise resolve the active
43
+ project:
44
+
45
+ ```bash
46
+ PROJECT_PATH=$(oat config get activeProject 2>/dev/null || true)
47
+ RETRO_PATH="${PROJECT_PATH}/references/project-retro.md"
48
+ ```
49
+
50
+ If the project or artifact is missing, report the missing path and stop. Do not
51
+ generate a retro implicitly.
52
+
53
+ Read the artifact frontmatter and both registers. Validate that RP items have
54
+ an authoritative disposition and that status/fields match the template
55
+ contract before filing.
56
+
57
+ ### Step 2: Extract Eligible Items
58
+
59
+ Build two lanes:
60
+
61
+ - **Repo lane:** every RP item with `Disposition: file`.
62
+ - **Upstream lane:** every UP item.
63
+
64
+ Before ordinary selection, run a **pre-selection integrity pass** over every
65
+ item already marked `Status: filed`:
66
+
67
+ - Classify its destination as a GitHub issue URL or a canonical local backlog
68
+ path.
69
+ - For GitHub, require a valid destination URL and require
70
+ `Destination-receipt: —` plus `Remote-visibility: —`; GitHub destinations do
71
+ not use local receipt fields.
72
+ - For local backlog destinations, resolve the latest commit for the exact path
73
+ with `git log -1 --format=%H -- "$DESTINATION_PATH"`. Verify the path appears
74
+ in that commit, the current file exists, and its ID, title, mechanism, and
75
+ acceptance scope still represent the retro proposal. Derive remote visibility
76
+ from the configured upstream: no upstream or a commit not reachable from it
77
+ means `unpushed`; only reachability from the upstream means `pushed`.
78
+ - A local item with a missing, stale, or invalid receipt is not skippable. Valid
79
+ exact-path recovery may retain `filed` and write the recovered
80
+ `Destination-receipt` and `Remote-visibility` without external mutation. If
81
+ recovery or current-destination coherence fails, it cannot remain `filed`:
82
+ set it back to `proposed`, clear both receipt fields to `—`, explain the
83
+ invalid state in `Disposition-note`, and include it in ordinary selection.
84
+ - A malformed GitHub filed state likewise returns to `proposed`; do not preserve
85
+ or skip an invalid destination-type state.
86
+
87
+ After the integrity pass, select by the filing status vocabulary:
88
+
89
+ - Process `Status: proposed`.
90
+ - Skip `filed` only when its destination-type state is complete and valid.
91
+ - Skip `rejected`.
92
+ - Retry `no-destination` only when this run's preflight finds a destination
93
+ that is now available.
94
+
95
+ Never select or mutate RP items with `Disposition: apply`.
96
+
97
+ ### Step 3: Resolve Repositories and Capabilities
98
+
99
+ Resolve:
100
+
101
+ ```bash
102
+ UPSTREAM_REPO=$(oat config get workflow.retro.upstreamRepo 2>/dev/null || true)
103
+ UPSTREAM_REPO="${UPSTREAM_REPO:-voxmedia/open-agent-toolkit}"
104
+ ```
105
+
106
+ Derive the host repo slug from `git remote get-url origin`. If it equals
107
+ `UPSTREAM_REPO`, collapse the upstream lane into the repo lane so items are
108
+ reviewed and filed once.
109
+
110
+ Before presenting items, probe every lane × candidate destination and print a
111
+ matrix:
112
+
113
+ | Lane | Destination | Required capability |
114
+ | -------- | ----------- | ----------------------------------------------------- |
115
+ | repo | issues | repository issues enabled and `gh` authenticated |
116
+ | repo | backlog | canonical OAT backlog initialized and writable |
117
+ | upstream | issues | upstream issues enabled and `gh` authorized to create |
118
+ | either | none | intentionally disabled; no external capability |
119
+
120
+ For issue destinations, verify `gh auth status` and repository issue
121
+ availability without creating anything. For backlog, verify the canonical
122
+ `.oat/repo/pjm/backlog/` structure and `oat backlog` command. Report unavailable
123
+ capabilities and their concrete unblock step.
124
+
125
+ Print the complete matrix before item approval. Do not silently omit an
126
+ unavailable lane.
127
+
128
+ ### Step 4: Resolve Destinations and Consent
129
+
130
+ Read:
131
+
132
+ ```text
133
+ workflow.retro.filing.repo # issues | backlog | none
134
+ workflow.retro.filing.upstream # issues | none
135
+ ```
136
+
137
+ These are defaults, not universal fallbacks.
138
+
139
+ **Interactive run:**
140
+
141
+ 1. Show configured defaults, capability results, and item counts.
142
+ 2. Confirm or override the available destination per lane for this run.
143
+ 3. Present every item and suspected duplicate for an explicit disposition.
144
+
145
+ **Non-interactive run:**
146
+
147
+ - Use configured destinations exactly as written.
148
+ - Absent config or `none` files nothing for that lane.
149
+ - Do not choose an alternative destination automatically.
150
+ - Explicit filing config is consent only for that configured destination.
151
+ - Configured destination consent authorizes creating a new item only when no
152
+ duplicate is found and all destination-required metadata is already present.
153
+ It does not authorize modifying an existing destination.
154
+
155
+ Items in a lane with no usable destination become `Status: no-destination`
156
+ only after the lane is reported loudly with the unblock action.
157
+
158
+ ### Step 5: Check Duplicates
159
+
160
+ Run a duplicate check before filing each item.
161
+
162
+ **GitHub issue destination:**
163
+
164
+ ```bash
165
+ gh search issues --repo "<owner/repo>" "<title and distinguishing keywords>" --state all
166
+ ```
167
+
168
+ Inspect likely matches; a search hit is a candidate, not proof.
169
+
170
+ **Backlog destination:**
171
+
172
+ Search titles and distinguishing keywords across:
173
+
174
+ - `.oat/repo/pjm/backlog/items/*.md`
175
+ - `.oat/repo/pjm/backlog/archived/`
176
+ - `.oat/repo/pjm/backlog/completed.md`
177
+
178
+ Include archived/completed work so recently closed items are not refiled.
179
+
180
+ Classify each candidate before choosing a disposition:
181
+
182
+ - **Exact duplicate:** the existing title identifies the same outcome, its
183
+ tracked mechanism matches the proposed mechanism, and its acceptance scope
184
+ already covers the proposal.
185
+ - **Merely related:** the item shares a subsystem, symptom, or keywords, but
186
+ its title, mechanism, or acceptance scope does not cover the proposal.
187
+
188
+ Recommend **Strengthen** only for a genuine scope and mechanism match. If the
189
+ new evidence would broaden the tracked mechanism or acceptance scope, recommend
190
+ **File as new** instead, unless the user explicitly approves an umbrella
191
+ retitle and corresponding scope change to the existing item. Search proximity
192
+ alone never makes an item a duplicate.
193
+
194
+ For a suspected duplicate in an interactive run, select one explicit
195
+ disposition:
196
+
197
+ 1. **Strengthen** — default only for an exact duplicate. Add this run's new
198
+ evidence to the existing issue as a comment, or append a concise
199
+ evidence/insight note to the existing backlog item and run
200
+ `oat backlog regenerate-index`.
201
+ 2. **File as new** — create a separate item despite the candidate.
202
+ 3. **Skip** — leave the retro item `proposed` unless it is explicitly rejected.
203
+ 4. **Link existing** — record the existing URL/path without adding content.
204
+
205
+ Strengthened and linked items receive `Status: filed` and the existing
206
+ `Destination`.
207
+
208
+ **Deterministic non-interactive duplicate handling:** configured filing consent
209
+ does not grant separate consent to mutate an existing destination. Do not
210
+ strengthen, edit, comment on, or refile an external duplicate without separate
211
+ consent recorded for that side effect. When the search result is a validated
212
+ existing destination that unambiguously represents the current item and policy
213
+ permits linking, safely link it without an external write. A GitHub link
214
+ requires a valid URL and uses `—` for both local receipt fields. A local link
215
+ must complete the exact-path receipt recovery and current-destination coherence
216
+ checks from Step 2 before it may set or retain `Status: filed`. Copy the
217
+ validated URL/path to `Destination` and explain the recovery in
218
+ `Disposition-note`. If the candidate or receipt is ambiguous, linking is not
219
+ permitted, or destination coherence fails, perform no external write, leave the
220
+ item unsettled, and report the candidate for a future interactive disposition.
221
+
222
+ ### Step 6: Sanitize Public-Destination Content
223
+
224
+ When the source repository is private and the destination is public, verify
225
+ every issue body and strengthening comment before posting:
226
+
227
+ - no verbatim private log or transcript excerpts;
228
+ - no internal URLs or hostnames;
229
+ - no credential-shaped strings, tokens, cookies, or authorization headers;
230
+ - no private user, customer, project, or infrastructure identifiers; and
231
+ - only the minimum generalized evidence needed to make the item actionable.
232
+
233
+ Show the sanitized draft during interactive approval. Sanitization applies to
234
+ new issues and strengthening comments alike. Set `Sanitized: yes` only after
235
+ this verification. If safe sanitization would remove necessary meaning, do not
236
+ post; report the item as undeliverable.
237
+
238
+ ### Step 7: File Approved Items
239
+
240
+ **GitHub issue:**
241
+
242
+ ```bash
243
+ gh issue create --repo "<owner/repo>" --title "<title>" --body "<sanitized tracker-ready body>"
244
+ ```
245
+
246
+ Capture the returned URL. Stop and report command failures; do not write a
247
+ filed status without a confirmed destination.
248
+
249
+ **OAT backlog item:**
250
+
251
+ Follow `oat-pjm-add-backlog-item` conventions:
252
+
253
+ 1. Confirm title, description, acceptance criteria, labels, priority, and scope
254
+ estimate.
255
+ 2. Run `oat backlog new ...` to create the canonical file-per-item record.
256
+ 3. Enrich only its acceptance criteria/body as allowed by that skill.
257
+ 4. Run `oat backlog regenerate-index` after strengthening an existing item or
258
+ when indexed fields changed.
259
+
260
+ Never hand-author an item ID or edit inside managed index markers. Capture the
261
+ created item ID/path.
262
+
263
+ Use this **destination-first** local transaction for every newly created or
264
+ strengthened local backlog destination:
265
+
266
+ 1. Format and verify the created or strengthened backlog item and regenerated
267
+ index.
268
+ 2. Commit the destination side effect before setting the retro item to
269
+ `Status: filed`. Do not include retro writeback in this destination commit.
270
+ 3. Capture the full destination commit SHA and verify that the commit contains
271
+ the destination path. Inspect the complete name-only commit output and
272
+ enforce that the destination commit must not contain `RETRO_PATH`; a
273
+ command success without the path, or a commit containing retro writeback, is
274
+ not a receipt.
275
+ 4. Determine remote visibility from the branch's configured upstream and
276
+ local remote-tracking state. Record exactly `pushed` when the destination
277
+ commit is reachable from that upstream. No configured upstream, or a commit
278
+ not reachable from it, means `unpushed`.
279
+ 5. Only after the receipt is confirmed, write back the retro in a subsequent
280
+ commit with `Destination`, `Destination-receipt`, and `Remote-visibility`.
281
+ 6. Capture the full writeback commit SHA, require it to differ from the
282
+ destination commit, and run
283
+ `git merge-base --is-ancestor "$DESTINATION_COMMIT" "$WRITEBACK_COMMIT"`.
284
+ This proves the destination commit predates the retro writeback commit.
285
+
286
+ If the destination mutation commit fails, stop that item without retro
287
+ writeback; a failed destination commit yields no receipt and must never yield
288
+ `Status: filed`.
289
+
290
+ Local commit durability does not imply remote visibility. Pushing is a
291
+ separately authorized Git operation: never push implicitly, never treat filing
292
+ consent as push authorization, and report an unpushed receipt as durable but
293
+ local-only.
294
+
295
+ The destination-type transition contract is:
296
+
297
+ | Scenario | Destination side effect | Receipt rule | Filed result |
298
+ | ------------------- | ----------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------- |
299
+ | New local | Create backlog item | Separate mutation commit contains path and excludes retro | Filed only after later retro writeback |
300
+ | Strengthened local | Modify backlog item | Separate mutation commit contains path and excludes retro | Filed only after later retro writeback |
301
+ | Linked local | No destination mutation | Recover latest exact-path commit and verify current destination coherence | Retain or set filed only with valid recovered receipt |
302
+ | Failed local commit | Mutation did not commit | No receipt | Must not be filed |
303
+ | No upstream | None | Valid local receipt | Filed with `Remote-visibility: unpushed` |
304
+ | GitHub | Create or link issue | Destination URL; local receipt fields are `—` | Filed only with valid URL |
305
+ | Rerun | No new mutation | Pre-selection integrity validates destination-type state | Skip only complete valid filed items |
306
+
307
+ For non-interactive backlog filing, all required backlog metadata — title,
308
+ description, acceptance criteria, labels, priority, scope, and scope estimate —
309
+ must already be explicit in the retro item. When any required backlog metadata
310
+ is missing, perform **no external write**: do not prompt or invent values, leave
311
+ the item unsettled at its current eligible status, record the missing field
312
+ names in `Disposition-note`, and report the missing metadata. Configuration
313
+ selects the destination; it does not supply or authorize inferred tracker
314
+ content.
315
+
316
+ ### Step 8: Write Back Statuses and Rollup
317
+
318
+ For each confirmed filing, strengthening, or link:
319
+
320
+ - set `Status: filed`;
321
+ - set `Destination` to the issue URL or backlog ID/path; and
322
+ - for local backlog destinations, set `Destination-receipt` to the confirmed
323
+ full commit SHA and `Remote-visibility` to `pushed | unpushed`;
324
+ - for GitHub destinations, set `Destination-receipt: —` and
325
+ `Remote-visibility: —`; these fields are local-Git metadata and never apply
326
+ to issue URLs;
327
+ - set `Disposition-note` to a concise filing/linking outcome or `—`; and
328
+ - set `Sanitized: yes` when the public-destination check ran.
329
+
330
+ For explicitly rejected items, set `Status: rejected` and preserve the reason
331
+ in `Disposition-note`. For an unavailable configured lane, set
332
+ `Status: no-destination`, keep `Destination: —`, and record the unblock action
333
+ in `Disposition-note`. Execution failures and missing-metadata cases remain
334
+ unsettled at their current eligible status with bounded detail in
335
+ `Disposition-note`.
336
+
337
+ Recompute `oat_retro_filing` from all UP items plus RP file-items:
338
+
339
+ - `none`: no filing items exist;
340
+ - `proposed`: filing items exist and none are settled;
341
+ - `partial`: some, but not all, items are settled;
342
+ - `complete`: every filing item is `filed` or `rejected`.
343
+
344
+ Refresh the contents of the bounded `## Current State` section from register
345
+ fields and frontmatter rollups after recomputing the rollup.
346
+
347
+ Filing mode may mutate only `Status`, `Destination`, `Sanitized`,
348
+ `Destination-receipt`, `Remote-visibility`, `Disposition-note`, and
349
+ `oat_retro_filing` on selected filing items, plus the contents of
350
+ `## Current State`. Do not alter apply-items, `Applied-ref`,
351
+ `oat_retro_promotions`, any RP disposition, proposal bodies, or any other
352
+ narrative. Refresh `Current State` without rewriting proposal bodies. Proposal
353
+ bodies are stable and immutable after generation.
354
+
355
+ Format and commit the retro writeback only after a local destination receipt is
356
+ confirmed. GitHub destinations are represented by their validated URLs and
357
+ explicit `—` local receipt fields. On re-run, skip a `filed` item only after the
358
+ pre-selection integrity pass proves its destination-type state complete and
359
+ valid; retry all eligible unsettled statuses.
360
+
361
+ ## Final Report
362
+
363
+ Report:
364
+
365
+ - lane × destination capability matrix;
366
+ - filed, strengthened, linked, skipped, rejected, and undeliverable counts;
367
+ - every created or existing destination;
368
+ - all unavailable lanes with concrete unblock actions;
369
+ - final `oat_retro_filing` rollup; and
370
+ - destination and writeback commit hashes when local files changed; and
371
+ - `pushed` or `unpushed` remote visibility for every local destination receipt.
372
+
373
+ ## Success Criteria
374
+
375
+ - Only UP items and RP `Disposition: file` items are processed.
376
+ - Capability results appear before item approval.
377
+ - Interactive filing has explicit item disposition; non-interactive filing
378
+ follows config exactly.
379
+ - Duplicate candidates are strengthened, filed as new, skipped, or linked
380
+ explicitly.
381
+ - Public posts from private sources pass sanitization, including comments.
382
+ - Every `filed` status has a confirmed destination.
383
+ - Every locally filed backlog item has a confirmed destination commit receipt
384
+ and explicit pushed/unpushed visibility; no push occurs implicitly.
385
+ - Re-runs are idempotent and retry newly deliverable `no-destination` items.
386
+ - Filing writeback updates only allowed fields, `oat_retro_filing`, and the
387
+ derived `Current State` contents.