paulnsorensen/easy-cheeseMIT8 files

Affinage

>

Specification
Skill ID
paulnsorensen/easy-cheese/affinage
Publisher
paulnsorensen
Repository
easy-cheese
Installs
0
Files
8
License
MIT
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

paulnsorensen/easy-cheese/affinageInstalls these files
  • SKILL.md
  • references/auto-mode.md
  • references/commands.md
  • references/flow-details.md
  • references/handoff-templates.md
  • references/merge-conflict.md
  • references/report-template.md
  • scripts/affinage.pyz

What this skill tells the agent

/affinage

Act on existing claims about a PR. Claims can come from reviewers, CI checks, or merge conflicts. Grade each claim through the /age lens. Send accepted claims to /cure.

/affinage always grades claims that exist on the PR. Its entry path controls whether it also finds new /age findings:

  • Standalone — The user starts /affinage <pr> without handoff_context. Run /age on the PR diff unless the user passes --no-age. Add the new findings to the same report.
  • Chained — /cook or /cure supplies handoff_context. Skip the fresh review because /age already ran in this chain.

See ## Fresh review for the entry rule. See ## Merge-conflict resolution for the conflict path.

Phase entry

Run python3 skills/affinage/scripts/affinage.pyz wheypoint-resolve --ref <slug>. authoritative uses the record; its working_context is the first batched tilth_read. not-found proceeds cold; legacy shows its source and slug, then proceeds. gated, ambiguous, and error stop and show the payload. Show advisory stale-commit and grounded-path-missing findings.

Inputs

/affinage [<pr-ref>] [--auto --stake <floor>] [--plate] [--safe] [--open-pr] [--hard] [--full] [--include-outdated]

<pr-ref> accepts a PR number, a PR#<n> reference, or a full GitHub PR URL. Extract the integer before you call pr-status. The command accepts only the integer. If no reference exists, run gh pr view --json number on the current branch.

Flags:

  • --auto --stake <floor> — Run without selection prompts. <floor> accepts blocker, high, medium+, or all. Bare --auto uses the medium+ default floor. Use the same floor rules as /cure. Send /cure --auto --stake <floor>. Post replies without prompts. See references/auto-mode.md.
  • --safe — Add gates before cure selection and conflict resolution. This flag does not remove the default reply gate.
  • --open-pr — Let terminal /plate open a new PR when no PR exists. Without this flag, /plate only updates an open PR.
  • --plate — Run --auto --stake medium+ --open-pr. Grade the claims. Cure the selected findings. Post the replies. Then run /plate. An explicit --stake <floor> replaces medium+.
  • --hard — Pass the metacognitive gate flag to terminal /plate.
  • --full — Show all low findings when at least 10 low findings exist.
  • --include-outdated — Include outdated review threads.
  • --no-age — Skip the fresh review in standalone mode. This flag has no effect in chained mode.

Read `../cheese/references/harness-portability.md` for portability rules. It covers helper resolution, agent dispatch, GitHub operations, and handoff transitions. Use the bundle or repository helper first. Do not use the ${CLAUDE_SKILL_DIR} environment variable in an invocation path. The handoff blocks below define the portable contract. The rule "slash commands are host renderings, not the control model" applies here.

Flow

Read references/flow-details.md for exact commands, exit codes, and grading reasons.

  1. Resolve PR. Use <pr-ref> or gh pr view --json number. Normalize a PR#<n> reference or a PR URL to its integer. Resolve <owner>/<repo> from the Git remote.
  2. Fetch PR status. Run python3 skills/affinage/scripts/affinage.pyz pr-status <pr>. Exit 3 stops with status: halt: pr-status-logs-expired. Any other nonzero exit stops with status: halt: pr-status-unavailable. Route a conflicting or dirty merge state to ## Merge-conflict resolution.
  3. Run fresh review. Run this step only in standalone mode without --no-age. Build contextual review input and call the bundled age-route command. Include the comment count and CI failure class. Run /age with the complete subject plan and its evidence. Tag each new finding with [from-age:<dimension>].
  4. Fetch comments. Fetch inline threads from pulls/<pr>/comments. Skip comments with position: null unless the user passes --include-outdated. Fetch review bodies from pulls/<pr>/reviews. Keep each nonempty body. Remove duplicates by pull_request_review_id.
  5. Skip answered threads. Skip a thread when the resolved GitHub handle wrote its latest comment. Render the footer as agent on behalf of <handle>.
  6. Grade claims. Classify each claim by the /age dimension and severity rules. Do not increase severity because a reviewer selected CHANGES_REQUESTED. Put contained fixes in severity sections. Put claims that need outside evidence in ## Needs-investigation. Put wrong, unsupported, or large claims in ## Reviewer-rejected.
  7. Write report. Write .cheese/affinage/pr-<n>.md. Start with the four-line handoff slug. Add the /age report body and two affinage sections. See ## Output.
  8. Act or ask. Follow ## Handoff.
  9. Draft non-cure replies. Draft replies for rejected and investigation claims. Do not reply to CI or fresh-review findings.
  10. Draft cure replies. Run this step only after /cure. Read ### Applied and ### Deferred from .cheese/cure/pr-<n>.md. Draft Fixed — <applied summary>. for applied comment findings. Draft Attempted fix reverted — <reason>. for deferred comment findings.
  11. Post replies. Show one reply gate for every drafted reply. Skip the gate only when --auto is active. Post approved replies with python3 skills/affinage/scripts/affinage.pyz post-reply.
  12. Publish. Run this step only after all approved replies post. Publish when /cure applies at least one fix. Also publish when /melt resolved a merge conflict. Send terminal /plate [--open-pr] [--hard] [--safe]. Then run the post-PR learning write-back from ../cure/SKILL.md. Skip publication and write-back when the working tree has no change.

Fresh review

Standalone mode calls the router with entry="affinage". Pass the PR reference and the router values to /age. This prevents /age from calculating a smaller route with entry="age". Add each result to its severity section with [from-age:<dimension>]. Send these findings to /cure like other findings. Do not post GitHub replies for these findings.

Run the fresh review before you grade external claims. This order lets you remove duplicate findings. Use the same agent gate as the grading step.

Merge-conflict resolution

When pr-status reports conflicts, send the PR to /melt. /melt uses mergiraf, rerere, and kdiff3. Do not resolve conflicts by hand.

Default and --auto modes run checkout and /melt before /cure. --safe requires the handoff gate first. If /melt fails, write status: halt: merge-conflicts-need-human and stop. /melt leaves the resolution uncommitted. Terminal /plate commits and pushes that resolution. See references/merge-conflict.md.

Sub-agent context gate

Keep dialogue, selection, approval state, and reply posting in the parent context. Use a fresh read-only reviewer when any limit below is true:

  • More than 10 inputs exist.
  • The diff exceeds approximately 25 KB.
  • Threads cover more than 5 files.

Resolve the reviewer through the shared agent resolver. Use a general worker only with degraded: true. The reviewer returns a compact digest of graded findings. Each finding includes its dimension, severity, confidence, evidence, and draft push-back. The parent writes the report, controls selection, calls /cure, and posts replies. See ../age/references/sub-agent-gate.md for digest limits.

Preferred tools and fallbacks

Use `code-intelligence-routing.md` for source code operations. Use these affinage tools:

NeedPreferFallback
PR statuspython3 skills/affinage/scripts/affinage.pyz pr-statusgh pr checks and gh pr view

Use this skill in a project

Open any RiverX project, search the Skills panel for paulnsorensen/easy-cheese/affinage, and install it in one click.

Use this skill