Summary
| Task |
Description |
Typecheck |
Key finding |
| 1 (reused) |
Git hotspot analyzer v3 — p.bash git log + shortlog, defineTool, steering |
✅ pass |
Clean use of s.record(s.object) as root output; steering message effectively guides risk classification |
| 2 (reused) |
LOC statistics v2 — p.bash find + wc, async defineTool per extension |
✅ pass |
Async defineTool with execSync works correctly; s.record(s.object) root output pattern confirmed |
| 3 (reused) |
Import cycle detector v3 — p.bash madge, p.readOptional tsconfig, repair() |
✅ pass |
repair() (no args) + maxTurns: 3 in spec is the correct pattern; p.readOptional with "{}" fallback works well |
| 4 (reused) |
Coverage badge updater v2 — p.readOptional coverage JSON, p.write README |
✅ pass |
p.write used inline in instructions template; s.record(s.number) for coverageByCategory is idiomatic |
| 5 (reused) |
Dep license auditor v2 — dual p.bash for npm ls + node -e |
✅ pass |
Multiple p.bash calls compose cleanly in one p`` template; s.enum classification is concise |
| 6 (reused) |
Test coverage mapper v2 — p.bash find source+test, defineTool heuristic, repair |
✅ pass |
Sync defineTool with string array parameter works well; repair() on mapper catches edge-case failures |
| 7 (new) |
Regex pattern tester — input schema, defineTool runRegexTest, repair |
✅ pass |
p.json("input") reference in instructions compiles; sync defineTool handler with try/catch is robust |
| 8 (new) |
Commit churn classifier — p.bash git log pipe chain, steering |
✅ pass |
Simple program with no tools; steering addon alone is sufficient for numeric threshold classification |
| 9 (new) |
NPM package size — p.bash npm pack --dry-run, defineTool classifySize |
✅ pass |
p.readOptional("package.json","{}") alongside p.bash intents composes cleanly |
| 10 (new) |
TS branch coverage — p.readInput(filePath), nano subagent, agents: { branchAnalyzer } |
✅ pass |
Named subagent pattern (agents: { branchAnalyzer }) with nano model is idiomatic and typechecks correctly |
Problems encountered
No failures this run. All 10 programs passed typecheck on the first attempt.
Improvement opportunities
Missing or undiscoverable schema helpers (s.*)
No gaps found this run. s.record, s.int, s.enum, s.optional, s.path all worked as documented. The distinction between s.int (integer count) vs s.number (float) was consistently applied correctly following SKILL.md guidance.
Missing or undiscoverable prompt helpers (p.*)
p.json("input"): The SKILL.md documents p.json(value) for "structured inline data" but it is not obvious that passing the string "input" causes the agent's runtime input to be serialized. A note clarifying p.json("input") as a special sentinel that injects the full input object would reduce confusion.
p.readInput vs p.read: Task 10 used p.readInput("filePath") correctly but this distinction (runtime path from input vs static known path) is easy to confuse. The SKILL.md table is clear but a callout box in the references would help.
Error message quality
No typecheck errors this run. The --typecheck output "typecheck passed" / error with line numbers is clear and sufficient.
API ergonomics
p.write placement in instructions: Task 4 required placing ${p.write("README.md", "...")} inline in the instructions template to declare the write intent. It is not obvious that this placeholder content is discarded and the agent generates the actual content. A SKILL.md note clarifying that p.write declares the intent (not the content) and that the agent must be instructed to write actual content would prevent confusion.
repair() arg confusion: The no-args pattern addons: repair() vs the incorrect addons: repair({ maxTurns: 3 }) is documented but remains a common confusion vector. The correct pattern is maxTurns: 3 in the spec + addons: repair() separately.
Candidate lint rules
Rule: no-repair-with-args
- Invalid:
addons: repair({ maxTurns: 3 })
- Valid:
maxTurns: 3, addons: repair()
- Why confusing:
repair() looks like it accepts a config object similar to steering({ message }). Models frequently try to pass maxTurns to repair().
- Safe autofix: Yes — extract the
maxTurns to the spec level and remove it from repair().
Rule: steering-before-repair
- Invalid:
addons: [repair(), steering()]
- Valid:
addons: [steering(), repair()]
- Why confusing: Array order matters for addon execution; models sometimes place repair first.
- Safe autofix: Yes — swap order automatically.
Documentation gaps
p.json("input") deserves an explicit example in references/prompt-intents.md showing that passing the string "input" injects the full input object at runtime.
references/composition.md should include a worked example of agents: { mySubagent } with the nano model to make the subagent naming pattern more discoverable.
Tasks run today
- (reused) Hot-spot file analyzer using p.bash git log --follow and p.bash git shortlog per file, with steering addon, outputs s.record(s.object) keyed by file with churnScore and topContributors
- (reused) Lines-of-code statistics gatherer using p.bash wc -l and find, with defineTool for per-extension aggregation, outputs s.record(s.object) with lineCount and fileCount per extension
- (reused) Import cycle detector using p.bash madge --circular and p.bash cat tsconfig.json, repair addon maxTurns:3, outputs s.object with cycles array
- (reused) Coverage badge updater that reads coverage/coverage-summary.json via p.readOptional, writes shields.io badge markdown to README.md via p.write
- (reused) Dependency license auditor using p.bash npm ls --json, classifies each as permissive/copyleft/unknown, outputs s.object with packages array and hasCopyleft
- (reused) Test coverage mapper using p.bash find for source/test files, defineTool for filename-heuristic matching, repair addon
- (new) Regex pattern test runner with input schema, defineTool runRegexTest, repair addon, outputs s.object with results/passCount/failCount/allPassed
- (new) Commit churn classifier using p.bash git log pipe chain, steering addon, outputs s.record(s.object) with churnCount and riskLevel
- (new) NPM package size estimator using p.bash npm pack --dry-run, defineTool classifySize, outputs s.object with estimatedSizeKb/topFiles/sizeRating/recommendation
- (new) TypeScript branch coverage analyzer with p.readInput, nano branchAnalyzer subagent, outputs s.object with branches array and summary counts
Generated by Daily Rig Task Generator · sonnet46 137.3 AIC · ⌖ 10.2 AIC · ⊞ 6.7K · ◷
Summary
Problems encountered
No failures this run. All 10 programs passed typecheck on the first attempt.
Improvement opportunities
Missing or undiscoverable schema helpers (
s.*)No gaps found this run.
s.record,s.int,s.enum,s.optional,s.pathall worked as documented. The distinction betweens.int(integer count) vss.number(float) was consistently applied correctly following SKILL.md guidance.Missing or undiscoverable prompt helpers (
p.*)p.json("input"): The SKILL.md documentsp.json(value)for "structured inline data" but it is not obvious that passing the string"input"causes the agent's runtime input to be serialized. A note clarifyingp.json("input")as a special sentinel that injects the full input object would reduce confusion.p.readInputvsp.read: Task 10 usedp.readInput("filePath")correctly but this distinction (runtime path from input vs static known path) is easy to confuse. The SKILL.md table is clear but a callout box in the references would help.Error message quality
No typecheck errors this run. The
--typecheckoutput "typecheck passed" / error with line numbers is clear and sufficient.API ergonomics
p.writeplacement in instructions: Task 4 required placing${p.write("README.md", "...")}inline in the instructions template to declare the write intent. It is not obvious that this placeholder content is discarded and the agent generates the actual content. A SKILL.md note clarifying thatp.writedeclares the intent (not the content) and that the agent must be instructed to write actual content would prevent confusion.repair()arg confusion: The no-args patternaddons: repair()vs the incorrectaddons: repair({ maxTurns: 3 })is documented but remains a common confusion vector. The correct pattern ismaxTurns: 3in the spec +addons: repair()separately.Candidate lint rules
Rule:
no-repair-with-argsaddons: repair({ maxTurns: 3 })maxTurns: 3, addons: repair()repair()looks like it accepts a config object similar tosteering({ message }). Models frequently try to passmaxTurnstorepair().maxTurnsto the spec level and remove it fromrepair().Rule:
steering-before-repairaddons: [repair(), steering()]addons: [steering(), repair()]Documentation gaps
p.json("input")deserves an explicit example inreferences/prompt-intents.mdshowing that passing the string"input"injects the full input object at runtime.references/composition.mdshould include a worked example ofagents: { mySubagent }with thenanomodel to make the subagent naming pattern more discoverable.Tasks run today