printing-press-amend
Amend a published CLI from one of two input sources: (1) dogfood mode mines the active Claude Code session transcript for friction (missing flags, hand- rolled API payloads, silent-null returns); (2) direct-input mode accepts user-supplied asks (rename a command, add commands or feeds, fix a named bug, optionally sniff the source site for new endpoints). Confirms scope with the user, plans + executes the fix autonomously, scrubs PII, and opens a PR against mvanhorn/printing-press-library. Two user-in-loop checkpoints: scope after capture, PR draft before open. Trigger phrases: "amend the CLI", "submit a patch", "fix what I just dogfooded", "open a PR for this CLI", "patch this CLI", "add features to my CLI", "rename this command", "add these feeds to <cli>", "sniff for new APIs in <cli>", "amend with these ideas", "use printing-press-amend", "run printing-press-amend".
NPX Install
npx skill4agent add mvanhorn/cli-printing-press printing-press-amendTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →/printing-press-amend
/printing-press-amend # auto-detect target CLI from session
/printing-press-amend superhuman # explicit short name
/printing-press-amend superhuman-pp-cli
/printing-press-amend ~/printing-press/library/superhuman/printing-press-publish/printing-press-polish/printing-press-retro// PATCH(...).printing-press-patches.jsonamendprinting-press patchSetup
# min-binary-version: 4.0.0
# Derive scope first — needed for local build detection
_scope_dir="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")"
_scope_dir="$(cd "$_scope_dir" && pwd -P)"
# Prefer local build when running from inside the printing-press repo.
_press_repo=false
if [ -x "$_scope_dir/printing-press" ] && [ -d "$_scope_dir/cmd/printing-press" ]; then
_press_repo=true
export PATH="$_scope_dir:$PATH"
echo "Using local build: $_scope_dir/printing-press"
elif ! command -v printing-press >/dev/null 2>&1; then
if [ -x "$HOME/go/bin/printing-press" ]; then
echo "printing-press found at ~/go/bin/printing-press but not on PATH."
echo "Add GOPATH/bin to your PATH: export PATH=\"\$HOME/go/bin:\$PATH\""
else
echo "printing-press binary not found."
echo "Install with: go install github.com/mvanhorn/cli-printing-press/v4/cmd/printing-press@latest"
fi
return 1 2>/dev/null || exit 1
fi
# Resolve and emit the absolute path the agent must use for every later
# `printing-press` invocation. `export PATH` above only affects this one
# Bash tool call; subsequent calls open a fresh shell and resolve bare
# `printing-press` against the user's default PATH, where a stale global
# can silently shadow the local build. The agent captures this marker and
# substitutes the absolute path into every later invocation.
if [ "$_press_repo" = "true" ]; then
PRINTING_PRESS_BIN="$_scope_dir/printing-press"
else
PRINTING_PRESS_BIN="$(command -v printing-press 2>/dev/null || true)"
fi
echo "PRINTING_PRESS_BIN=$PRINTING_PRESS_BIN"
PRESS_BASE="$(basename "$_scope_dir" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9_-]/-/g; s/^-+//; s/-+$//')"
if [ -z "$PRESS_BASE" ]; then
PRESS_BASE="workspace"
fi
PRESS_SCOPE="$PRESS_BASE-$(printf '%s' "$_scope_dir" | shasum -a 256 | cut -c1-8)"
PRESS_HOME="$HOME/printing-press"
PRESS_RUNSTATE="$PRESS_HOME/.runstate/$PRESS_SCOPE"
PRESS_LIBRARY="$PRESS_HOME/library"
PRESS_MANUSCRIPTS="$PRESS_HOME/manuscripts"
PRESS_CURRENT="$PRESS_RUNSTATE/current"
mkdir -p "$PRESS_RUNSTATE" "$PRESS_LIBRARY" "$PRESS_MANUSCRIPTS" "$PRESS_CURRENT"PRINTING_PRESS_BIN=<abs-path>printing-press ...$PRINTING_PRESS_BINexport PATHprinting-pressPATHmin-binary-version<PRINTING_PRESS_BIN> version --jsonmin-binary-versiongo install github.com/mvanhorn/cli-printing-press/v4/cmd/printing-press@latestPhase 0 — Input Mode Detection
Detection rubric
-
— the prompt contains a concrete CLI name AND at least one direct-input signal:
MODE=direct- Action verbs targeting the CLI: ,
rename,add,remove,fix,sniffdiscover - Explicit URLs the user wants added (e.g., )
https://example.com/feed/x - An enumerated list of feeds, commands, endpoints, or features
- Phrasing like "these ideas", "these features", "with the following"
- Action verbs targeting the CLI:
-
— the prompt is empty, OR names a CLI without any asks ("amend the superhuman CLI"), OR explicitly references the session ("what I just dogfooded", "this session's friction", "from my session today")
MODE=dogfood -
— the prompt clearly references both: a session AND specific asks ("I dogfooded this session and also want to add feature X", "in addition to the friction I hit, please add command Y")
MODE=both -
Ambiguous — only one signal is present (CLI named with no verbs, or verbs with no target CLI, or asks worded so they could be friction reports OR new asks). Ask the user via:
AskUserQuestion"Two ways to source findings for this amend. Which fits?- Mine the current session transcript (dogfood mode)
- Use the asks I just typed (direct-input mode)
- Both — combine transcript friction with my asks"
MODE=dogfood/printing-press-amendPersist the mode
$PRESS_RUNSTATE/current/mode.txtecho "$MODE" > "$PRESS_RUNSTATE/current/mode.txt"Output
mode: <dogfood|direct|both>### 1a### 1bPhase 1 — Capture
idkindcategoryclassificationevidencetarget_clirationaleprovenancetranscriptuser-asksniffMODE=dogfood### 1aMODE=direct### 1bMODE=both### 1a### 1b1a. Dogfood mode (MODE=dogfood)
references/transcript-parsing.md-
Resolve the active session transcript file — derivefrom the current working directory, list
<project-dir-slug>by mtime, pick the most-recently-modified. ALWAYS confirm the resolved path with the user via~/.claude/projects/<slug>/*.jsonlbefore reading — wrong-file selection ingests friction from the wrong session.AskUserQuestion -
Walk the transcript and extract friction signals — non-zero exit codes, error messages, hand-rolled API payloads (e.g. directPOSTs that should be a CLI command), retry-after-failure patterns, agent commentary like "X doesn't exist" / "X returns 400", missing-flag references, silent-null returns, auth confusion. Each signal carries timestamp + category + verbatim evidence + the
curlit references.<slug>-pp-cli -
Classify each signal as bug or feature with a one-line rationale. Bug = CLI behavior is wrong; feature = CLI behavior is missing. The classification is the agent's best read; the user confirms or overrides at the U4 scope checkpoint.
-
Auto-detect target CLI — count occurrences of eachin the signals, propose the most-touched CLI as the default. Confirm with
<slug>-pp-cli(single CLI: simple yes/no; multiple close: pick from list). When the user passed an explicitAskUserQuestionargument, skip auto-detect.<cli-name-or-path> -
Resolve target paths — accept short name, full name, or absolute path (per R4). Look up the public-library category by walkingfor a matching directory. The category is needed by U7's PR open phase and is captured here so it doesn't have to be re-derived.
~/printing-press-library/library/*/
provenance: transcriptreferences/transcript-parsing.md1b. Direct-input mode (MODE=direct)
references/direct-input-parsing.md-
Read the slash-command prompt body plus the immediate agent-message turn that fired the skill — these carry the user's verbatim asks (e.g., "rename Digg 1000 to Digg, add these four feeds: ..., sniff for new endpoints"). There is no transcript to confirm; skip the U1 transcript-path modal that 1a runs.
-
Resolve the target CLI — same name-resolution rules as 1a step 4-5 (per R4), but the CLI is normally already named in the prompt itself. Extract via regex (or "the <slug> CLI"); if absent, ask the user.
<slug>-pp-cli -
Parse the asks into structured findings using the rubric in. Each ask maps to one finding with a typed
references/direct-input-parsing.mdfield:kind- — "rename X to Y" / "call it X instead of Y" →
renameclassification: feature - — "add command X" / "add subcommand X" →
add-commandclassification: feature - — "add feed <url>" / enumerated URLs the user wants added (one finding per URL) →
add-feedclassification: feature - — "add endpoint <url>" / explicit API path →
add-endpointclassification: feature - — "fix X" / "X is broken" / "X returns null" →
fix-bugclassification: bug - — "sniff for new APIs" / "find new endpoints" / "discover more" → routes to the sniff subroutine in
sniff### 1b.i
-
Each finding records the user's verbatim phrasing inso the U4 scope confirmation modal shows the user what they actually wrote.
evidence -
Edge cases — multi-CLI asks split into two separate runs (out of scope for v0.2; ask the user to pick one). Ambiguous verbs (without specifics) trigger an
update Xclarification rather than a guess.AskUserQuestion
provenance: user-askprovenance: sniff1b.i. Sniff-finding subroutine
kind: sniff~/printing-press-library/library/<category>/<slug>/.printing-press.jsonsource_urlspec_url"Sniff needs a target URL — paste the source site you want sniffed, or skip the sniff finding for this run?"
<PRINTING_PRESS_BIN><PRINTING_PRESS_BIN> crowd-sniff --site "$SOURCE_URL" --json > /tmp/amend-sniff-crowd.json
crowd_exit=$?crowd-sniff<PRINTING_PRESS_BIN> browser-sniff --har "$HAR_PATH" --json > /tmp/amend-sniff-browser.json
browser_exit=$?- (next available number after the parsed asks)
id: F<n> kind: add-endpointclassification: feature- (or
evidence: "discovered via crowd-sniff: <endpoint-path>"when applicable)browser-sniff target_cli: <slug>-pp-clirationale: <one-line summary from sniff output if available, otherwise "sniff candidate, user to confirm">provenance: sniff
| Condition | Behavior |
|---|---|
| Drop sniff finding; continue with other 1b findings; log "sniff skipped — no source URL". |
| Log the error; skip sniff findings; continue with other 1b findings. Do NOT abort the amend run. |
| Emit one entry to the deferred-findings list ("sniff ran, no new endpoints discovered") rather than adding nothing — gives the user a record. |
| Browser-sniff requested but no HAR available | Log; fall back to crowd-sniff results only. |
(sniff)Tier 3 — Polish / architecture (5)
F8 add-endpoint /v1/feeds/stars (sniff)
F9 add-endpoint /v1/feeds/new (sniff)
F10 add-endpoint /v1/feeds/activity (sniff)
...Phase 2 — Pre-Checkpoint Guards
2a. PR cross-reference (suppress duplicate proposals)
mvanhorn/printing-press-library# Replace <PRINTING_PRESS_BIN> use with the absolute path captured at setup.
# This phase uses gh, not the press binary.
# Open PRs touching this CLI
gh pr list --repo mvanhorn/printing-press-library \
--search "in:title,body <slug>" --state open --limit 20 \
--json number,title,state,headRefName,files
# Recently merged PRs (last 90 days) touching this CLI.
# Compute "90 days ago" portably — `date -v-90d` is BSD/macOS only, `date -d`
# is GNU/Linux only. Try GNU first, fall back to BSD, then to python3. If
# every form fails, abort with an explicit error rather than letting the
# dedup guard silently drop out with an empty `merged:>` qualifier.
ninety_days_ago=$(date -u -d '90 days ago' +%Y-%m-%d 2>/dev/null \
|| date -u -v-90d +%Y-%m-%d 2>/dev/null \
|| python3 -c 'import datetime; print((datetime.datetime.now(datetime.UTC).date() - datetime.timedelta(days=90)).isoformat())' 2>/dev/null)
if [ -z "$ninety_days_ago" ]; then
echo "ERROR: cannot compute 90-days-ago date — no GNU date, BSD date, or python3 available."
exit 1
fi
gh pr list --repo mvanhorn/printing-press-library \
--search "in:title,body <slug> merged:>$ninety_days_ago" \
--state merged --limit 20 \
--json number,title,state,mergedAt,headRefName,files"Finding(F<n>) may already be addressed by PR #<num> —<category>(<state>, <date>). Skip this finding?"<title>
gh pr view <num> --repo mvanhorn/printing-press-library --web2b. Stale-binary check (abort if the dogfooded binary lags published)
.printing-press.json# Read published version (managed clone if available, else gh api)
if [ -f "$HOME/printing-press-library/library/<category>/<slug>/.printing-press.json" ]; then
published=$(jq -r '.version // empty' "$HOME/printing-press-library/library/<category>/<slug>/.printing-press.json")
else
published=$(gh api repos/mvanhorn/printing-press-library/contents/library/<category>/<slug>/.printing-press.json \
--jq '.content' | base64 -d | jq -r '.version // empty')
fi
# Read local binary version (if installed; the user dogfooded with this binary)
local_ver=$(<slug>-pp-cli version --json 2>/dev/null | jq -r '.version // empty' || echo "")local_verpublished"Thebinary you dogfooded is v<slug>-pp-cli, but the published library version is v<local_ver>. The friction you hit may already be fixed in the published version. Run:<published>go install github.com/mvanhorn/<slug>-pp-cli@latest...then re-runafter re-dogfooding. Aborting this run."/printing-press-amend
.printing-press.jsonversionOutput
findings_kept:
- <finding from Phase 1>
findings_suppressed:
- id: F3
reason: "Duplicate of PR #571 (merged 2026-05-13)"
target_binary_check: { local: "1.0.0", published: "1.0.0", status: "current" }Phase 3 — Scope Confirmation Checkpoint (User-in-Loop #1)
Tier the surviving findings
- Tier 1 — Bugs — every finding with . CLI behavior is wrong; fixes restore correctness.
classification: bug - Tier 2 — Missing features that solve immediate session pain — findings tied to a hand-rolled workaround the user actually built during the session (i.e. the user clearly needed it now, not theoretically).
classification: feature - Tier 3 — Polish / architecture — remaining findings that are nice-to-have or architectural improvements without an immediate workaround in the session.
classification: feature
Friction found for <slug>-pp-cli (12 signals, 2 suppressed as duplicates):
Tier 1 — Bugs (4)
F1 drafts list returns 400 silently
F4 messages query returns data: null
F7 refresh-token expiry not surfaced in errors
F11 ai --query returns code 500
Tier 2 — Missing features that solve session pain (4)
F2 no `drafts new` command (user hand-rolled writeMessage payload)
F5 no `--type sent` for threads list (user worked around with messages query)
F8 no `--remind-in <duration>` flag for send (user manually re-flagged drafts)
F10 no `bootstrap` to local SQLite (user did 50+ thread API calls)
Tier 3 — Polish / architecture (2)
F12 `auth status` doesn't link to `auth login` when refresh expired
F13 doctor doesn't surface stale-binary warning vs. published versionPick scope via AskUserQuestion
Which scope should this patch cover?
1. Bugs only (Tier 1) — 4 findings
2. Bugs + immediate features (Tier 1 + Tier 2) — 8 findings
3. All tiers (Tier 1 + Tier 2 + Tier 3) — 10 findings
4. Custom selection — pick individual findingsAskUserQuestionPersist the excluded findings
$PRESS_MANUSCRIPTS/<api-slug>/<run-id>/proofs/<timestamp>-amend-<cli-name>-deferred.md<run-id>amend-2026-05-15T1432/printing-press-amend---
date: 2026-05-15
target_cli: superhuman-pp-cli
amend_run_id: amend-2026-05-15T1432
deferred_count: 2
---still_relevant: unknown/printing-press-amend$PRESS_MANUSCRIPTS/<api-slug>/*-deferred.mdEdge case: nothing to do
"All findings from this session were addressed by existing PRs. No novel patches found."
Output
scope_tier: bugs+features # or bugs|all|custom
findings_active: [...] # the user-confirmed subset
findings_deferred_path: <path> # where the deferred file landedPhase 4 — Plan + Execute + Validate (Autonomous)
Step 1 — Set up the managed clone
mvanhorn/printing-press-library$PRESS_LIBRARY/<slug>/$PRESS_HOME/.publish-repo-$PRESS_SCOPE/printing-press-publishPUBLISH_REPO_DIR="$PRESS_HOME/.publish-repo-$PRESS_SCOPE"
PUBLISH_CONFIG="$PRESS_HOME/.publish-config-$PRESS_SCOPE.json"
if [ ! -d "$PUBLISH_REPO_DIR/.git" ]; then
# First-time setup: see references/library-pr-plumbing.md for the full
# detection (push-vs-fork access via gh api .../permissions.push,
# SSH-vs-HTTPS protocol detection, scoped-clone cleanup loop).
echo "Managed clone not present — bootstrapping..."
# ... (see library-pr-plumbing.md)
else
# Refresh from upstream. -f on checkout discards any local edits left behind
# by a prior run that aborted between Phase 4's edits and Phase 7's commit —
# without -f, those uncommitted changes block the checkout and the subsequent
# reset --hard never runs.
cd "$PUBLISH_REPO_DIR"
git fetch upstream main
git checkout -f main
git reset --hard upstream/main
fi$PUBLISH_REPO_DIR/library/<category>/<slug>/find "$PUBLISH_REPO_DIR/library" -maxdepth 2 -name "<slug>" -type dCLI_DIR="$PUBLISH_REPO_DIR/library/<category>/<slug>"$CLI_DIR$PRESS_LIBRARY/<slug>/Step 2 — Write the per-run plan doc
$PRESS_MANUSCRIPTS/<slug>/<run-id>/proofs/<timestamp>-amend-<cli-name>.md/tmp/printing-press/amend/- Frontmatter: ,
date,target_cli,amend_run_id,scope_tierfindings_count - One section per active finding: id, category, classification, rationale, target files (paths), expected behavior change, test scenarios for this finding
$CLI_DIR/... - Risks and dependencies between findings (if any)
Step 3 — Execute the plan (with the patch contract)
-
Edit the target files under. Honor AGENTS.md anti-reimplementation rules (no hand-rolled response builders; novel commands must call the real endpoint or read from the local store via
$CLI_DIR//// pp:client-callopt-outs only when truly justified).// pp:novel-static-reference -
Add asource comment at every changed site. Format examples:
// PATCH(<short reason>)go// PATCH(amend-2026-05-15: surface refresh-token expiry to user) — was silently retrying func (c *Client) Refresh(ctx context.Context) error { ... } -
Update. Append an entry under
$CLI_DIR/.printing-press-patches.json:patches[]json{ "date": "2026-05-15", "amend_run_id": "amend-2026-05-15T1432", "summary": "fix(superhuman): surface refresh-token expiry; add drafts new + --type sent", "files": [ "internal/auth/refresh.go", "internal/cli/drafts.go", "internal/cli/threads.go" ], "findings_addressed": ["F1", "F2", "F5", "F7"], "patch_count": <total // PATCH comments added in this run> }Both halves of the contract —source comments AND// PATCH(...)entries — are MANDATORY. The library's.printing-press-patches.jsonworkflow rejects PRs where one is present without the other. Seeverify-library-conventions"How to record a hand-edit" for the authoritative spec.~/printing-press-library/AGENTS.md -
Machine-vs-printed-CLI judgment (per AGENTS.md): when a finding's fix would generalize to every printed CLI (e.g. "the generator should emitfor any threads list command"), surface as a borderline case:
--type sent"Finding F5 (missing) looks like a machine-level fix — the generator template--type sentshould emit it for every CLI with this endpoint shape, not justinternal/generator/templates/threads.go.tmpl. Defer to a<slug>-pp-clifollow-up, or proceed CLI-specific?"/printing-press-retroWhen deferred, drop into the deferred-list with classification. When kept, add a comment in the patch noting the generalize-eventually intent.machine-level
Step 4 — Validate
<PRINTING_PRESS_BIN><PRINTING_PRESS_BIN> publish validate --dir "$CLI_DIR" --json > /tmp/amend-validate.json
exit_code=$?publish validatego vetgo build--help--versionStep 5 — Retry on failure (up to 3 iterations)
publish validate# Save the in-progress plan + diff to a holding location
HELD_PATH="$PRESS_MANUSCRIPTS/<slug>/<run-id>/proofs/<timestamp>-amend-<cli-name>-INCOMPLETE.md"
git -C "$PUBLISH_REPO_DIR" diff > "${HELD_PATH%.md}.diff"
cp "$PLAN_PATH" "$HELD_PATH"Step 6 — Caveat: validate doesn't enforce the patch contract
publish validate.printing-press-patches.json// PATCH(...)verify-library-conventions# Count only NEW // PATCH(...) markers added in this run by diffing against
# upstream. A naive `grep -rc` over $CLI_DIR also counts markers added by
# prior amend runs, which lets a zero-new-markers run pass when prior history
# makes the cumulative count meet or exceed the per-run declared count.
#
# This check runs in Phase 4 Step 6 — BEFORE the Phase 7 commit. The edits
# are still in the working tree, not in any commit, so `git diff` against
# upstream/main (working-tree diff) is the right tool. `format-patch
# upstream/main..HEAD` would scan committed history only, find no commits,
# and emit nothing — silently returning 0 markers for every valid run.
#
# --no-pager + --no-color + --no-ext-diff defeats colorized output and any
# configured `diff.external` tool that would reformat the diff away from
# unified-diff shape and break the grep parse.
new_patch_markers=$(git -C "$PUBLISH_REPO_DIR" --no-pager diff --no-color --no-ext-diff upstream/main -- "$CLI_DIR" \
| grep -cE '^\+.*// PATCH\(')
patches_entry=$(jq '.patches[-1].patch_count // 0' "$CLI_DIR/.printing-press-patches.json")
if [ "$new_patch_markers" -lt "$patches_entry" ]; then
echo "ERROR: .printing-press-patches.json claims $patches_entry patch markers added this run, found $new_patch_markers new // PATCH(...) comments in the diff."
exit 1
fiprinting-press publish validateOutput
plan_doc_path: <path>
managed_clone_dir: <path>
cli_dir_in_clone: <path>
findings_addressed: [...]
build_status: PASS|FAIL
test_status: PASS|FAIL
dogfood_status: PASS|FAIL|N/A # PASS|FAIL when MODE=dogfood (or "both"); always N/A when MODE=direct
validate_iterations: <n>
patch_marker_count: <n>dogfood_statusMODE=dogfoodMODE=directdogfood_status=N/AMODE=bothPhase 5 — PII Scrub
references/pii-scrubbing.md- Credentials — reuse the regex patterns from (Stripe, GitHub PATs, bearer tokens, AWS keys, etc.) plus amend-specific additions for
skills/printing-press-retro/references/secret-scrubbing.md/Authorization/Cookieheaders in hand-rolled API payloads quoted from the session transcript.X-API-Key - Entities — companies, people, emails matched against the user-maintained stop-list at . Replace with shape-preserving tokens (
~/.printing-press/amend-config.yaml,<company-1>,<person-1>) that maintain identity across the artifact set so reviewers can still parse intent.<email-1> - First-mention defense — walk each artifact for capitalized phrases that look like proper nouns and were NOT in the stop-list. Surface to the user inline before the Phase 6 PR-draft display: "Found (3x in plan doc, 1x in PR body) — add to stop-list and scrub, or accept?"
Esper Labs
$CLI_DIR<path>.pre-pii-scrub*.go$CLI_DIR~/.printing-press/amend-config.yaml$PRESS_MANUSCRIPTS/<slug>/<run-id>/scrub-report.jsonPhase 6 — PR Draft Review Checkpoint (User-in-Loop #2)
ghAssemble the draft
- when the scope is bugs-only
fix(<api-slug>): <one-line summary> - when the scope includes features
feat(<api-slug>): <one-line summary> - when mixed (feature wins because it's the bigger contract change)
feat(<api-slug>): <one-line summary>
<one-line summary>surface refresh-token expiry; add drafts new + --type sent- Summary — 1-3 sentences naming the user pain and the shape of the fix
- Findings — table with ID, category, type (bug/feature), rationale
- Changes — output of
git diff --stat upstream/main..HEAD - Verification — build/test/dogfood/validate status from Phase 4
- Evidence — full GitHub URLs to the per-run plan doc and at the PR's HEAD SHA (captured AFTER push so links don't 404)
.printing-press-patches.json - Closes #N footer when an issue match was found in Step 6 of
library-pr-plumbing.md
comp:<api-slug>priority:P1priority:P2priority:P3Display before gh fires
git diff --stat"Reminder: PR body references(you accepted as legitimate during Phase 5). Confirm before opening."<phrase>
AskUserQuestion: open / edit / hold / abort
PR draft ready. What now?
1. Open PR as drafted (recommended)
2. Edit then open — drop into an interactive review of title/body
3. Hold — save plan + diff for later resume; nothing pushed
4. Abort — discard everything, no record kept$PRESS_MANUSCRIPTS/<slug>/<run-id>/proofs/<timestamp>-amend-<cli-name>-HELD.md${path%.md}.diffstatus: held/printing-press-amendstatus: abortedPhase 7 — PR Open (Autonomous)
references/library-pr-plumbing.md- Step 5 — + commit with conventional message + the findings list
git add "$CLI_DIR" - Step 6 — search for an existing issue matching the findings; link or open new; self-assign best-effort
- Step 7 — push the branch (push-vs-fork access mode determined in Step 1), with
gh pr create, capture HEAD_SHA, apply labels--body-file
references/library-pr-plumbing.md"PR open: <url>Greptile will review within ~2 minutes. Check inline comments:gh api repos/mvanhorn/printing-press-library/pulls/<N>/commentsP0/P1 findings are worth addressing before requesting human review."
Phase 8 — Output
---PATCH-RESULT------PATCH-RESULT---
pr_url: <url>
pr_number: <n>
branch_name: <name>
api_slug: <slug>
scope_tier: <bugs|bugs+features|all|custom>
files_changed:
- <file>
build_status: <PASS|FAIL>
test_status: <PASS|FAIL>
dogfood_status: <PASS|FAIL|N/A>
pii_scrub_summary: <N tokens replaced across M artifacts>
findings_addressed:
- <one-line-summary>
findings_deferred:
- <one-line-summary>
deferred_list_path: <path>
plan_doc_path: <path>
---END-PATCH-RESULT---Verification of this skill itself
<PRINTING_PRESS_BIN> verify-internal-skill --dir skills/printing-press-amendinternal/cli/verify_internal_skill.gointernal/pipeline/contracts_test.goTestSkillSetupBlocksMatchWorkspaceContract