@open-agent-toolkit/cli 0.2.29 → 0.2.30
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/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/configuration.md +11 -1
- package/assets/docs/workflows/projects/artifacts.md +5 -0
- package/assets/docs/workflows/projects/index.md +1 -0
- package/assets/docs/workflows/projects/lifecycle.md +23 -0
- package/assets/docs/workflows/projects/retro.md +261 -0
- package/assets/docs/workflows/skills/index.md +6 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +38 -38
- package/assets/skills/oat-project-complete/SKILL.md +42 -6
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +38 -38
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +20 -6
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +38 -38
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +38 -38
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +38 -38
- package/assets/skills/oat-project-retro/SKILL.md +310 -0
- package/assets/skills/oat-project-retro/references/apply-procedure.md +212 -0
- package/assets/skills/oat-project-retro/references/evidence-and-lanes.md +91 -0
- package/assets/skills/oat-project-retro/references/retro-quality-bar.md +100 -0
- package/assets/skills/oat-project-retro-file/SKILL.md +387 -0
- package/assets/templates/project-retro.md +236 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +81 -0
- package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
- package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.js +3 -0
- package/dist/config/oat-config.d.ts +12 -1
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +38 -2
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +8 -0
- package/package.json +2 -2
|
@@ -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.
|