$npx -y skills add mvanhorn/cli-printing-press --skill printing-press-output-reviewInternal sub-skill: agentic review of a printed CLI's sampled command output for plausibility issues that rule-based checks can't encode (substring-match relevance, format bugs, silent source drops, ranking failures). Invoked via the Skill tool by main printing-press SKILL.md (Ph
| 1 | # printing-press-output-review (internal) |
| 2 | |
| 3 | Review the sampled outputs from a printed CLI for plausibility bugs that dogfood, verify, and the rule-based `scorecard --live-check` rules can't catch. Wave B policy: all findings surface as warnings, never errors. |
| 4 | |
| 5 | This skill is **internal-only** (`user-invocable: false`). It's invoked by parents — main printing-press skill at shipcheck Phase 4.85, polish skill during its diagnostic loop. Running it standalone would produce floating findings text with no ship verdict, no fixes applied, no publish offer; the actionable wrappers are `/printing-press` and `/printing-press-polish`. The skill carries `context: fork` so the reviewer agent's diagnostic chatter stays isolated from the calling skill's context. |
| 6 | |
| 7 | ## Input |
| 8 | |
| 9 | The caller passes `$CLI_DIR` as the argument: an absolute path to the printed CLI's working directory. |
| 10 | |
| 11 | ## What this catches |
| 12 | |
| 13 | Bugs that rule-based checks miss, typically surfaced by 5 minutes of hands-on testing but slipping past dogfood, verify, and `scorecard --live-check` rules: |
| 14 | |
| 15 | - Substring-match results that coincidentally contain the query but don't match semantically (e.g., a query matches a substring of a larger unrelated term) |
| 16 | - Aggregation commands silently dropping sources when only some of the requested N come back |
| 17 | - Ranking or sort commands returning top-N results that aren't plausibly the best for the query (broken weights, extractor fallbacks) |
| 18 | - URLs in output pointing at category index pages, feed endpoints, or random-selector routes rather than canonical content permalinks |
| 19 | - Format bugs the rule-based layer doesn't catch (mojibake, inconsistent pluralization, truncated/wrapped cell content) |
| 20 | |
| 21 | ## Procedure |
| 22 | |
| 23 | ### Step 1: Gather sample data |
| 24 | |
| 25 | ```bash |
| 26 | # Locate research.json. Adjacent to the binary covers the post-promote |
| 27 | # layout (standalone polish, shipcheck against the library copy). The |
| 28 | # grandparent fallback covers mid-pipeline invocations where $CLI_DIR is |
| 29 | # $PRESS_RUNSTATE/runs/<id>/working/<cli> and research.json lives at |
| 30 | # $PRESS_RUNSTATE/runs/<id>/research.json. Without the fallback, scorecard |
| 31 | # reports `unable: true` mid-pipeline and we SKIP the most informative review. |
| 32 | # Use a bash array so the flag survives paths with spaces. |
| 33 | RESEARCH_ARGS=() |
| 34 | if [ ! -f "$CLI_DIR/research.json" ]; then |
| 35 | _grandparent="$(dirname "$(dirname "$CLI_DIR")")" |
| 36 | if [ -f "$_grandparent/research.json" ]; then |
| 37 | RESEARCH_ARGS=(--research-dir "$_grandparent") |
| 38 | fi |
| 39 | fi |
| 40 | |
| 41 | cli-printing-press scorecard --dir "$CLI_DIR" "${RESEARCH_ARGS[@]}" --live-check --json > /tmp/output-review-livecheck.json 2>&1 || true |
| 42 | ``` |
| 43 | |
| 44 | If the scorecard call fails or `/tmp/output-review-livecheck.json` is empty, return the SKIP result (Step 3) without dispatching the reviewer. |
| 45 | |
| 46 | ### Step 2: Dispatch the reviewer agent |
| 47 | |
| 48 | Use the Agent tool (general-purpose) with this prompt contract: |
| 49 | |
| 50 | > Review the sampled outputs from the shipped CLI at `$CLI_DIR`. You have these ground-truth sources: |
| 51 | > |
| 52 | > - Sampled command output: read `/tmp/output-review-livecheck.json` and inspect the `live_check.features[]` array. Each entry has the command, example invocation, redacted stdout evidence (in `output_sample`, bounded to ~4 KiB), the redacted pass/fail reason, and a `warnings` array (populated by rule-based checks like the raw-HTML-entity detector). Treat `<redacted>` markers as privacy scrubbed values, not format bugs. |
| 53 | > - **Review only `status: pass` entries.** Entries with `status: fail` either crashed, timed out, or had placeholder args (`<id>`, `<url>`) that never produced real output — their sample is empty and there's nothing for you to judge. Phase 5 dogfood handles test-coverage and exit-code concerns. |
| 54 | > - `$CLI_DIR/research.json` `novel_features` (planned behavior per feature) and `novel_features_built` (verified built commands). |
| 55 | > - The CLI binary at `$CLI_DIR/<cli-name>-pp-cli` — you may invoke additional commands to gather more output when a finding needs verification. |
| 56 | > |
| 57 | > For each of these checks, report findings under 50 words each. Only report issues a human user would notice in 5 minutes of hands-on testing — not every edge case a thorough QA pass might find: |
| 58 | > |
| 59 | > 1. **Output *semantically* matches query intent.** For sampled novel features with a query argument, judge relevance beyond what the mechanical query-token check in live-check already enforced. A feature that passed live-check's ` |