Skip to content

[rig-tasks] Add 10 rig samples — 2026-07-27 - #211

Merged
pelikhan merged 1 commit into
mainfrom
rig-tasks/2026-07-27-5cb3390a5ed1fdbc
Jul 27, 2026
Merged

[rig-tasks] Add 10 rig samples — 2026-07-27#211
pelikhan merged 1 commit into
mainfrom
rig-tasks/2026-07-27-5cb3390a5ed1fdbc

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Added 10 new rig sample files to skills/rig/samples/.

# File Description Typecheck
1 200-npm-audit-simplifier.md NPM audit simplifier with repair addon and s.record grouped output pass
2 201-git-stash-inventory.md Git stash inventory with multi-command p.bash and staleness s.enum pass
3 202-ts-interface-conflict-checker.md TS interface conflict checker with async defineTool and repair pass
4 203-git-worktree-mapper.md Git worktree mapper with sync defineTool porcelain parser pass
5 204-test-naming-enforcer.md Test naming enforcer with steering addon and s.record(s.object) pass
6 205-pkg-dependency-graph.md Package dependency graph with p.read + p.bash and defineTool pass
7 206-ci-flake-triager.md CI flake triager with p.readOptional fallback and repair pass
8 207-config-drift-reconciler.md Config drift reconciler with p.write and s.unknown nested fields pass
9 208-release-note-enricher.md Release note enricher with input, defineTool regex, and [steering(), repair()] pass
10 209-docs-refactor-coordinator.md Docs refactor coordinator with two named nano subagents pass

Typecheck failures

No failures — all 10 programs passed typecheck on first attempt.

Tasks run

  • (reused) NPM audit simplifier
  • (reused) Git stash inventory analyzer
  • (reused) TypeScript interface conflict checker
  • (reused) Git worktree mapper
  • (reused) Test file naming convention enforcer
  • (reused) Package dependency graph extractor
  • (new) CI flake triager
  • (new) Config drift reconciler
  • (new) Release note enricher
  • (new) Docs refactor coordinator

Generated by Daily Rig Task Generator · sonnet46 113.5 AIC · ⌖ 7.31 AIC · ⊞ 6.7K ·

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@pelikhan
pelikhan marked this pull request as ready for review July 27, 2026 05:42
@pelikhan
pelikhan merged commit 6a4b7f2 into main Jul 27, 2026
1 check passed
@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor Author

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skills-Based Review 🧠

Applied /grill-with-docs and /codebase-design — requesting changes on three correctness issues in the sample code.

📋 Key Themes & Highlights

Key Themes

  • Unreachable enum value (dirty state in 203): the sync parseWorktreePorcelain tool can't check git status, so the enum variant it declares is never reachable — misleading for readers learning sync vs async tool patterns.
  • Unused parameter (205): name is declared in classifyDependency parameters but silently ignored in the handler — a subtle signal that goes against the "clean, self-explanatory" code style goal.
  • Empty steering call (208): steering() without a message generates a no-op re-prompt; should either be given a message or replaced with repair() alone.

Positive Highlights

  • ✅ All 10 samples pass typecheck on first attempt — excellent quality baseline
  • ✅ Good coverage of diverse patterns: async/sync tools, repair, steering, subagents, p.readOptional, p.write, s.unknown, s.enum
  • 208-release-note-enricher.md cleanly demonstrates the input + defineTool + multi-addon pattern
  • 202-ts-interface-conflict-checker.md is a well-formed async defineTool example
  • s.path used correctly for outputPath in 209

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 50 AIC · ⌖ 4.62 AIC · ⊞ 6.3K
Comment /matt to run again

tools: [lookupTicketMetadata],
maxTurns: 5,
addons: [steering(), repair()],
});

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/grill-with-docs] steering() is called without a message argument — the addon has no guidance to steer toward. An empty steering prompt is unlikely to help the model self-correct.

💡 Add a message or replace with repair()

Supply a concrete steering message:

addons: [steering({ message: "Ensure riskLabel and all section headings are populated." }), repair()],

Or if the intent is just parse-correction, repair() alone is sufficient.

path: s.string,
branch: s.optional(s.string),
state: s.enum("locked", "bare", "clean", "dirty"),
})),

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/grill-with-docs] The parseWorktreePorcelain tool receives the porcelain output via its output parameter, but the instructions say to check for uncommitted changes and set state to dirty — the tool never does this check. The sync handler has no way to run git status per worktree, so the dirty state in the output schema can never actually be populated.

💡 Options to reconcile this

Option A: Remove dirty from the enum (the tool can only observe locked/bare/clean from porcelain output), then let the agent instructions drive a follow-up p.bash("git status --porcelain \"<path>\"") check.

Option B: Change parseWorktreePorcelain to an async handler that shells out to git status per entry — similar to 202-ts-interface-conflict-checker.md.

As written, the dirty state is unreachable and the example may mislead readers about what sync tools can do.

}),
handler({ inDependencies, inDevDependencies, inPeerDependencies }) {
if (inPeerDependencies) return "peer";
if (inDevDependencies) return "dev";

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/grill-with-docs] The classifyDependency tool ignores its name parameter entirely — it's declared in parameters but never destructured or used in handler. This is misleading for readers learning tool patterns.

💡 Either use the parameter or remove it

If the name is used only for display in the output (already in directDeps[].name), drop it from the tool parameters:

parameters: s.object({
  inDependencies: s.boolean,
  inDevDependencies: s.boolean,
  inPeerDependencies: s.boolean,
}),

Or destructure it and surface it in the return value if it serves a purpose.

changedKeys: s.record(s.object({
baseline: s.unknown,
actual: s.unknown,
})),

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/grill-with-docs] The p.write("config-patch.json", "PATCH_CONTENT") placeholder is a string literal, not the actual field from the output schema. Readers following this pattern may expect to see how the agent's structured output flows into the write intent — but here the written content is hardcoded, making the connection between the changedKeys output and the file write opaque.

💡 Clarify the relationship between output and write intent

If the intent is to write the changedKeys object as JSON, show that in the placeholder text or a comment:

// p.write writes the agent-generated JSON patch; the output schema captures the parsed form
${p.write("config-patch.json", "{}")}

This makes the sample more instructive about how p.write and structured output coexist in the same agent.

model: "small",
instructions: p`Delegate API extraction and prose cleanup to the named subagents. Merge their results: the apiExtractor returns the list of API names, and proseCleanup returns rewritten prose. Combine into a final output and write the refactored content to ${p.write("docs/refactored.md", "REFACTORED_CONTENT")}. Count the changes made to the prose.`,
output: s.object({
extractedApis: s.array(s.string),

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/grill-with-docs] s.path is used for outputPath in the output schema, which is good — but docsRefactorCoordinator instructions say to write to docs/refactored.md via p.write("docs/refactored.md", "REFACTORED_CONTENT"). The REFACTORED_CONTENT placeholder does not reference the proseCleanup subagent's result in any visible way. Readers may not understand how subagent return values flow into write intents.

💡 Make the data flow explicit

Since p.write placeholders are instructions to the model, the instructions text should explicitly say which subagent result becomes the content:

instructions: p`Delegate API extraction to apiExtractor and prose cleanup to proseCleanup. Take the rewritten prose from proseCleanup and write it to ${p.write("docs/refactored.md", "<!-- rewritten prose from proseCleanup -->")}. Count the changes.`,

This makes the sample self-documenting about the subagent → write data flow.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant