Summary
| Task |
Description |
Typecheck |
Key finding |
| 1 (reused) |
Git tag release timeline reporter (nano subagent) |
✅ pass |
Clean subagent delegation pattern; agents: { timelineSummarizer } wired correctly |
| 2 (reused) |
Service health probe checker (input array, steering) |
✅ pass |
addons: [steering({...})] array form required; s.optional(s.int) for httpCode correct |
| 3 (reused) |
Git metadata template renderer (p.readInput, p.writeInput) |
✅ pass |
Used p.writeInput("outputPath","renderedContent") correctly for dynamic output path |
| 4 (reused) |
Changelog entry generator (defineTool, p.write, nested s.object) |
✅ pass |
s.object({ breaking: s.array(s.string), ... }) nested cleanly; double import of defineTool initially (fixed) |
| 5 (reused) |
TODO/FIXME/HACK tracker (p.bash grep, p.write, s.record) |
✅ pass |
s.record(s.int) for byType counts is idiomatic; p.write with placeholder content works |
| 6 (reused) |
Multi-file glob summarizer (nano subagent per file, s.record) |
✅ pass |
output: s.record(s.string) at root level is valid without wrapping in s.object |
| 7 (new) |
Shell script safety flag analyzer (async defineTool, node:fs/promises) |
✅ pass |
async handler with await import("node:fs/promises") pattern typechecks cleanly |
| 8 (new) |
Lock file drift detector (defineTool JSON.parse, repair addon) |
✅ pass |
import { ..., repair } from "rig" — repair imported directly from rig; addons: [repair()] correct |
| 9 (new) |
Git conflict marker scanner (p.bash, steering addon) |
✅ pass |
s.enum("<<<<<<<", "=======", ">>>>>>>") with special chars typechecks fine |
| 10 (new) |
Proto file field extractor (async defineTool, regex) |
✅ pass |
s.record(s.array(s.object({...}))) as root output is valid and idiomatic |
Problems encountered
No failures this run. All 10 programs passed typecheck on the first attempt.
Improvement opportunities
Missing or undiscoverable schema helpers (s.*)
- No
s.int vs s.number reminder in inline docs: When writing fieldNumber: s.int, newcomers may reach for s.number by default. A short inline note in SKILL.md that "use s.int/s.integer for counts, indices, line numbers; s.number for floats" would help (currently only in the table body, not the helper list).
s.nonEmptyArray undiscoverable: Task 6 (file list) could have used s.nonEmptyArray but the helper doesn't appear prominently in examples.
Missing or undiscoverable prompt helpers (p.*)
p.writeInput signature confusion: p.writeInput(inputPathField, contentOutputField) is asymmetric with p.writeOutput(field, path) — the arg order flips between "field then path" vs "path-field then content-field". Task 3 required careful reference reading to get right. A concrete example showing both forms side-by-side in SKILL.md would reduce errors.
p.readInput only reads a single field: Task 3 needed to read two input fields (templatePath and outputPath). Only templatePath could be read with p.readInput; outputPath was used via p.writeInput. This asymmetry is not obvious from SKILL.md.
Error message quality
No typecheck failures this run, so no error messages to analyze.
API ergonomics
addons accepts array or single value: Tasks 2, 8, 9 used addons: [steering()] / addons: [repair()] (array form). Earlier samples sometimes use addons: steering({...}) (single form). The reference table says "stable addons" in spec, but doesn't show the array form explicitly. Clarifying that both are valid would help.
- Double import of
defineTool: Task 4 initially had import { agent, p, s } from "rig" and then a separate import { defineTool } from "rig". The construction rule says "one import statement" — the linter should catch duplicate imports from "rig".
Candidate lint rules
Rule: no-duplicate-rig-import
- Invalid:
import { agent, p, s } from "rig"; import { defineTool } from "rig";
- Valid:
import { agent, defineTool, p, s } from "rig";
- Why model-confusing: Models sometimes emit a second import when they realize they need
defineTool or an addon after writing the first import line.
- Safe autofix: yes — merge named imports into the first statement.
Documentation gaps
p.writeInput vs p.writeOutput comparison example missing from SKILL.md: Both are mentioned in the reference table but only p.writeOutput has an inline example. Adding a p.writeInput code snippet to references/prompt-intents.md would close this gap.
repair() import not shown in canonical example: SKILL.md's default program uses no addons. Adding a one-line // with repair: import { agent, p, s, repair } from "rig"; comment in the addons section would make it clear that addons are imported directly from "rig", not from a subpath.
Tasks run today
- (reused) Git tag release timeline reporter using p.bash git tag --sort and git log between tags, two-step chain with timelineSummarizer subagent (nano), outputs s.array(s.object) with tag/date/commitCount/topAuthors plus s.boolean hasUnreleasedCommits
- (reused) Service health probe checker that accepts s.array(s.string) of URLs, uses p.bash curl checks per endpoint, steering addon for unexpected status codes, outputs s.array(s.object) per endpoint with s.enum status (up/down/slow/unknown), healthyCount, and overallStatus s.enum(all-healthy/degraded/critical)
- (reused) Git-metadata template renderer that reads a template via p.readInput, gathers commit metadata via p.bash git log, uses defineTool to parse the log line, fills {{commit}}/{{author}}/{{branch}}/{{date}}/{{message}} placeholders, and writes rendered output via p.writeInput
- (reused) Changelog entry generator that reads git diff via p.bash, uses defineTool to validate semver bump type, and writes CHANGELOG.md via p.write, with s.object output tracking changes by category
- (reused) TODO/FIXME/HACK comment tracker using p.bash grep scan and p.write to produce markdown report
- (reused) Multi-file glob summarizer: uses p.bash to find TS files, a nano fileSummarizer subagent per file, coordinator aggregates into s.record(s.string) keyed by path
- (new) Shell script safety flag analyzer: uses p.bash find to locate .sh files, async defineTool with node:fs/promises readFile to parse shebang and detect set -e/set -u/set -o pipefail, outputs s.record(s.object) with safetyLevel s.enum(strict/partial/unsafe) keyed by file path
- (new) Lock file drift detector: reads package.json and package-lock.json via p.bash cat, uses defineTool with JSON.parse to cross-check declared vs locked versions, repair addon, outputs s.object with driftedPackages s.array/driftCount s.int/allInSync s.boolean
- (new) Git conflict marker scanner: uses p.bash grep -rn for conflict markers across tracked files, steering addon to cover all file types, outputs s.object with conflicts s.array/affectedFiles s.array(s.path)/conflictCount s.int/isClean s.boolean
- (new) Proto file field extractor: uses p.bash find for .proto files, async defineTool with node:fs/promises readFile and regex to parse message/field definitions, outputs s.record(s.array(s.object)) with fieldName/fieldType/fieldNumber s.int/isRepeated s.boolean keyed by message name
Generated by Daily Rig Task Generator · sonnet46 125.8 AIC · ⌖ 9.47 AIC · ⊞ 6.7K · ◷
Summary
agents: { timelineSummarizer }wired correctlyaddons: [steering({...})]array form required;s.optional(s.int)for httpCode correctp.writeInput("outputPath","renderedContent")correctly for dynamic output paths.object({ breaking: s.array(s.string), ... })nested cleanly; double import ofdefineToolinitially (fixed)s.record(s.int)for byType counts is idiomatic; p.write with placeholder content worksoutput: s.record(s.string)at root level is valid without wrapping in s.objectasync handlerwithawait import("node:fs/promises")pattern typechecks cleanlyimport { ..., repair } from "rig"— repair imported directly from rig;addons: [repair()]corrects.enum("<<<<<<<", "=======", ">>>>>>>")with special chars typechecks fines.record(s.array(s.object({...})))as root output is valid and idiomaticProblems encountered
No failures this run. All 10 programs passed typecheck on the first attempt.
Improvement opportunities
Missing or undiscoverable schema helpers (
s.*)s.intvss.numberreminder in inline docs: When writingfieldNumber: s.int, newcomers may reach fors.numberby default. A short inline note in SKILL.md that "uses.int/s.integerfor counts, indices, line numbers;s.numberfor floats" would help (currently only in the table body, not the helper list).s.nonEmptyArrayundiscoverable: Task 6 (file list) could have useds.nonEmptyArraybut the helper doesn't appear prominently in examples.Missing or undiscoverable prompt helpers (
p.*)p.writeInputsignature confusion:p.writeInput(inputPathField, contentOutputField)is asymmetric withp.writeOutput(field, path)— the arg order flips between "field then path" vs "path-field then content-field". Task 3 required careful reference reading to get right. A concrete example showing both forms side-by-side in SKILL.md would reduce errors.p.readInputonly reads a single field: Task 3 needed to read two input fields (templatePathandoutputPath). OnlytemplatePathcould be read withp.readInput;outputPathwas used viap.writeInput. This asymmetry is not obvious from SKILL.md.Error message quality
No typecheck failures this run, so no error messages to analyze.
API ergonomics
addonsaccepts array or single value: Tasks 2, 8, 9 usedaddons: [steering()]/addons: [repair()](array form). Earlier samples sometimes useaddons: steering({...})(single form). The reference table says "stable addons" in spec, but doesn't show the array form explicitly. Clarifying that both are valid would help.defineTool: Task 4 initially hadimport { agent, p, s } from "rig"and then a separateimport { defineTool } from "rig". The construction rule says "oneimportstatement" — the linter should catch duplicate imports from"rig".Candidate lint rules
Rule: no-duplicate-rig-import
import { agent, p, s } from "rig"; import { defineTool } from "rig";import { agent, defineTool, p, s } from "rig";defineToolor an addon after writing the first import line.Documentation gaps
p.writeInputvsp.writeOutputcomparison example missing from SKILL.md: Both are mentioned in the reference table but onlyp.writeOutputhas an inline example. Adding ap.writeInputcode snippet toreferences/prompt-intents.mdwould close this gap.repair()import not shown in canonical example: SKILL.md's default program uses no addons. Adding a one-line// with repair: import { agent, p, s, repair } from "rig";comment in the addons section would make it clear that addons are imported directly from"rig", not from a subpath.Tasks run today