Summary
| Task |
Description |
Typecheck |
Key finding |
| 1 (reused) |
Dead code detector — p.bash + defineTool estimateUsage + repair() |
✅ pass |
Initially used wrong import repair from "rig" instead of "rig/addons" — fixed by updating import |
| 2 (reused) |
OpenAPI spec validator — p.readOptional + defineTool checkStructure |
✅ pass |
Clean first-try pass; p.readOptional with literal filename worked well |
| 3 (reused) |
API endpoint extractor — p.bash + nano endpointClassifier subagent |
✅ pass |
Subagent pattern with agents: { endpointClassifier } worked cleanly |
| 4 (reused) |
Source file annotator — nano jsDocAnnotator subagent + p.write |
✅ pass |
p.write with template placeholder in instructions compiled fine |
| 5 (reused) |
Stale dependency detector — p.bash npm outdated + defineTool classifyDrift + repair() |
✅ pass |
Same repair import issue as task 1; "rig/addons" required |
| 6 (reused) |
Git tag timeline — nano timelineSummarizer subagent chain |
✅ pass |
Two-level subagent coordinator pattern compiled cleanly |
| 7 (new) |
Env variable type inferrer — p.readOptional + defineTool inferType |
✅ pass |
Clean first-try pass; s.record(s.object) + s.enum output well-formed |
| 8 (new) |
Makefile target extractor — p.readOptional + defineTool parseTargets + repair() |
✅ pass |
Same repair import issue; also fixed |
| 9 (new) |
Test fixture generator — input s.object({sourceFile: s.path}) + p.readInput + p.writeOutput + nano subagent |
✅ pass |
p.writeOutput requires exactly 2 arguments (field, path) — initially called with 1 arg; fixed |
| 10 (new) |
Server uptime log parser — p.bash journalctl + defineTool parseLogLine + steering() |
✅ pass |
steering also lives in "rig/addons", not "rig"; fixed import |
Problems encountered
Tasks 1, 5, 8, 10 — Wrong import source for addons
What the code tried to do: Used import { ..., repair } from "rig" and import { ..., steering } from "rig".
Error message:
error TS2305: Module '"rig"' has no exported member 'repair'.
error TS2305: Module '"rig"' has no exported member 'steering'.
Root cause: repair() and steering() are exported from "rig/addons", not from "rig". The SKILL.md mentions repair() and steering() in the addons table but doesn't show the import source explicitly in the inline quick-reference. The fix was a one-line import change: import { repair } from "rig/addons".
Task 9 — p.writeOutput called with too few arguments
What the code tried to do: Used p.writeOutput("suggestedFileName") to declare a write intent in instructions.
Error message:
error TS2554: Expected 2-3 arguments, but got 1.
Root cause: p.writeOutput(field, path, options?) requires a static destination path as the second argument. The field name alone is not sufficient. Fixed to p.writeOutput("suggestedFileName", "fixture-output.ts").
Improvement opportunities
Missing or undiscoverable schema helpers (s.*)
No missing helpers encountered this run. s.record(s.object), s.optional(s.string), and s.enum all worked as expected.
Missing or undiscoverable prompt helpers (p.*)
p.readOptional with multiple filenames: tasks frequently needed to try 2–3 candidate filenames (e.g., openapi.json vs openapi.yaml). There is no p.readFirstOf(paths[]) helper, so two separate p.readOptional calls are needed. A p.readFirstOf(["openapi.json", "openapi.yaml"]) helper would reduce boilerplate.
p.writeOutput is easy to call with 1 arg: the required path second argument is non-obvious when the path is dynamically computed from the output. A variant p.writeOutput(field) (no static path, path read from the field itself when it is a s.path) would remove ambiguity.
Error message quality
- The TS2305 error ("Module 'rig' has no exported member 'repair'") is clear, but the fix location (
"rig/addons") is not mentioned. The compiler error could be augmented by a custom lint rule that suggests "rig/addons" when known addon symbols are imported from "rig".
- The TS2554 error for
p.writeOutput ("Expected 2-3 arguments, but got 1") doesn't mention what the second argument should be.
API ergonomics
- Addons import split: The
"rig" vs "rig/addons" split is the single most common generation mistake. SKILL.md states "see composition.md" but the inline quick-reference table doesn't show which module to import from. Adding from "rig/addons" next to the addon names in the SKILL.md table would eliminate this error class entirely.
repair() placement in addons array: The rule that steering() must come before repair() is important but only mentioned in SKILL.md's references; a repeated note in the inline Construction Rules would help.
Candidate lint rules
Rule: no-addon-from-rig
- Problem:
repair, steering, timeout, oncePerAgent are imported from "rig" instead of "rig/addons".
- Invalid:
import { agent, repair, s } from "rig";
- Valid:
import { agent, s } from "rig"; import { repair } from "rig/addons";
- Why model-confusing: All other rig primitives (
agent, p, s, defineTool) live in "rig", so it's natural to assume addons do too. The split is invisible until typecheck.
- Autofix: Yes — move the addon identifiers to a
"rig/addons" import statement, adding one if absent.
Documentation gaps
- SKILL.md addon table (line ~52): The row
steering({ message? }), timeout({ timeout }), repair() should include the import module, e.g., from "rig/addons". Currently the import source only appears in references/composition.md.
p.writeOutput signature: SKILL.md's prompt intent table should show the full signature p.writeOutput(field, path, opts?) rather than just the intent name, to avoid the one-argument mistake.
Tasks run today
- (reused) Dead code detector using p.bash find for TS files and grep for exported symbols, defineTool for heuristic usage estimation, repair addon maxTurns:3
- (reused) OpenAPI spec validator using p.readOptional for json/yaml specs, defineTool<{content:string}> for structural checks, s.array of issues with s.enum type
- (reused) API endpoint extractor that scans route files via p.bash, outputs s.array(s.object) of endpoints, with a classifier subagent using s.enum for purpose
- (reused) Source file annotation writer that reads TypeScript files via p.read, uses a subagent to generate JSDoc comments, and writes annotated output via p.write
- (reused) Stale dependency detector using p.bash npm outdated --json and p.read package.json, defineTool for classifying version drift
- (reused) Git tag release timeline reporter using p.bash git tag --sort and git log between tags, two-step chain with timelineSummarizer subagent (nano)
- (new) Env variable type inferrer: reads .env.example via p.readOptional, uses defineTool with regex to classify each value type as s.enum(string/number/boolean/url/path/unknown)
- (new) Makefile target extractor: uses p.readOptional for Makefile, defineTool to parse phony vs real file targets, repair addon
- (new) Test fixture generator: accepts input s.object({sourceFile: s.path, functionName: s.string}), reads source via p.readInput, uses nano signatureAnalyzer subagent, writes fixture via p.writeOutput
- (new) Server uptime log parser: uses p.bash for systemd journal/log file, defineTool for parsing lifecycle events, steering addon for crash loops
Generated by Daily Rig Task Generator · sonnet46 103.3 AIC · ⌖ 7.35 AIC · ⊞ 6.7K · ◷
Summary
p.bash+defineTool estimateUsage+repair()repairfrom"rig"instead of"rig/addons"— fixed by updating importp.readOptional+defineTool checkStructurep.readOptionalwith literal filename worked wellp.bash+ nanoendpointClassifiersubagentagents: { endpointClassifier }worked cleanlyjsDocAnnotatorsubagent +p.writep.writewith template placeholder in instructions compiled finep.bash npm outdated+defineTool classifyDrift+repair()repairimport issue as task 1;"rig/addons"requiredtimelineSummarizersubagent chainp.readOptional+defineTool inferTypes.record(s.object)+s.enumoutput well-formedp.readOptional+defineTool parseTargets+repair()repairimport issue; also fixeds.object({sourceFile: s.path})+p.readInput+p.writeOutput+ nano subagentp.writeOutputrequires exactly 2 arguments (field, path) — initially called with 1 arg; fixedp.bash journalctl+defineTool parseLogLine+steering()steeringalso lives in"rig/addons", not"rig"; fixed importProblems encountered
Tasks 1, 5, 8, 10 — Wrong import source for addons
What the code tried to do: Used
import { ..., repair } from "rig"andimport { ..., steering } from "rig".Error message:
Root cause:
repair()andsteering()are exported from"rig/addons", not from"rig". The SKILL.md mentionsrepair()andsteering()in the addons table but doesn't show the import source explicitly in the inline quick-reference. The fix was a one-line import change:import { repair } from "rig/addons".Task 9 —
p.writeOutputcalled with too few argumentsWhat the code tried to do: Used
p.writeOutput("suggestedFileName")to declare a write intent in instructions.Error message:
Root cause:
p.writeOutput(field, path, options?)requires a static destination path as the second argument. The field name alone is not sufficient. Fixed top.writeOutput("suggestedFileName", "fixture-output.ts").Improvement opportunities
Missing or undiscoverable schema helpers (
s.*)No missing helpers encountered this run.
s.record(s.object),s.optional(s.string), ands.enumall worked as expected.Missing or undiscoverable prompt helpers (
p.*)p.readOptionalwith multiple filenames: tasks frequently needed to try 2–3 candidate filenames (e.g.,openapi.jsonvsopenapi.yaml). There is nop.readFirstOf(paths[])helper, so two separatep.readOptionalcalls are needed. Ap.readFirstOf(["openapi.json", "openapi.yaml"])helper would reduce boilerplate.p.writeOutputis easy to call with 1 arg: the requiredpathsecond argument is non-obvious when the path is dynamically computed from the output. A variantp.writeOutput(field)(no static path, path read from the field itself when it is as.path) would remove ambiguity.Error message quality
"rig/addons") is not mentioned. The compiler error could be augmented by a custom lint rule that suggests"rig/addons"when known addon symbols are imported from"rig".p.writeOutput("Expected 2-3 arguments, but got 1") doesn't mention what the second argument should be.API ergonomics
"rig"vs"rig/addons"split is the single most common generation mistake. SKILL.md states "see composition.md" but the inline quick-reference table doesn't show which module to import from. Addingfrom "rig/addons"next to the addon names in the SKILL.md table would eliminate this error class entirely.repair()placement inaddonsarray: The rule thatsteering()must come beforerepair()is important but only mentioned in SKILL.md's references; a repeated note in the inline Construction Rules would help.Candidate lint rules
Rule:
no-addon-from-rigrepair,steering,timeout,oncePerAgentare imported from"rig"instead of"rig/addons".import { agent, repair, s } from "rig";import { agent, s } from "rig"; import { repair } from "rig/addons";agent,p,s,defineTool) live in"rig", so it's natural to assume addons do too. The split is invisible until typecheck."rig/addons"import statement, adding one if absent.Documentation gaps
steering({ message? }), timeout({ timeout }), repair()should include the import module, e.g.,from "rig/addons". Currently the import source only appears inreferences/composition.md.p.writeOutputsignature: SKILL.md's prompt intent table should show the full signaturep.writeOutput(field, path, opts?)rather than just the intent name, to avoid the one-argument mistake.Tasks run today