Summary
| Task |
Description |
Kind |
Typecheck |
Key finding |
| 1 (reused) |
JSON fixture anonymizer |
agent |
✅ pass |
Clean defineTool with field-name heuristics; p.writeInput + p.readInput used correctly |
| 2 (reused) |
CSV to Markdown table converter |
agent |
✅ pass |
parseCSVRow tool with .map() and explicit type annotation — good pattern |
| 3 (reused) |
TOML config section analyzer |
agent |
✅ pass |
Async tool with node:fs/promises; p.glob used correctly for discovery |
| 4 (reused) |
Git checkpoint summarizer |
agent |
✅ pass |
Multiple p.bash intents in one template string; s.optional(s.string) output field |
| 5 (reused) |
TypeScript literal type union extractor |
agent |
✅ pass |
Async tool with regex and Record accumulation; steering() addon appropriate |
| 6 (reused) |
Markdown heading validator |
agent |
✅ pass |
Nested s.object in s.array in s.record output — deep schema validated cleanly |
| 7 (new) |
TypeScript barrel module writer |
agent |
✅ pass (after fix) |
Initially had unused join import from node:path; removed and typecheck passed |
| 8 (new) |
Git remote metadata inspector |
agent |
✅ pass |
Enum-keyed s.record output; steering() addon correctly placed |
| 9 (new) |
OS environment variable scanner |
agent |
✅ pass (after fix) |
Initially had unused homedir import from node:os; removed and typecheck passed |
| 10 (new) |
Sequential commit classifier workflow |
workflow |
✅ pass (after fix) |
Multiple errors: call wrongly imported from "rig", missing meta field, agent input mismatch |
Problems encountered
Task 7 — Unused join import
What it tried: Import join from node:path to construct the output path, but didn't use it in the tool handler.
Error: TS6133: 'join' is declared but its value is never read.
Root cause: The agent's p.writeInput handles path construction at runtime; the join call was unnecessary boilerplate.
Fix: Removed the unused import.
Task 9 — Unused homedir import
What it tried: Import homedir from node:os for environment variable classification context, but didn't use it in the tool.
Error: TS6133: 'homedir' is declared but its value is never read.
Root cause: The classification logic only needed the variable name/value, not the actual home directory value at generation time.
Fix: Removed the unused import.
Task 10 — Multiple workflow errors
What it tried: A sequential three-agent workflow using call imported from "rig".
Errors:
TS2305: Module '"rig"' has no exported member 'call' — call must come from the body destructure parameter, not a top-level import.
'agents' does not exist in type 'WorkflowSpec' — agents: is an agent() field, not a workflow() field.
meta is required in WorkflowSpec and WorkflowWithoutInputSpec.
- Agent input mismatch: the second agent's input was typed as
s.array(...) but the coordinator called it with a raw array.
Root cause: Confusion between agent-style coordination (uses agents: dict) and workflow-style coordination (uses TypeScript body with destructured call). Also meta is required.
Fix: Rewrote to use workflow({ meta: {...}, body: async ({ call, phase }) => {...} }) with call(agent, input) in the body.
Improvement opportunities
Missing or undiscoverable schema helpers (s.*)
- No issues encountered this run. All needed helpers (
s.record, s.array, s.object, s.enum, s.optional, s.int, s.boolean, s.path, s.string) were used correctly after the first attempt.
Missing or undiscoverable prompt helpers (p.*)
p.writeInput(pathField, outputField) and p.readInput(field) are not well-surfaced. Task 7's first draft imported node:path unnecessarily because it wasn't clear that p.writeInput handles path routing automatically.
Error message quality
TS6133: 'X' is declared but its value is never read is perfectly clear — no improvement needed.
- The workflow overload error is dense but accurate. A simpler error like "workflow() requires a meta field" would be faster to act on than reading the full overload diff.
API ergonomics
- The
workflow body signature is the most common source of confusion: call comes from the destructured body argument, not from an import. This is inconsistent with agent which uses agents: for subagent registration. A lint rule or clearer error would help.
meta being required on workflow is easy to forget; SKILL.md mentions it in examples but doesn't call it out as required in a decision table.
- Agent input type mismatch: when an agent declares
input: s.array(...), callers expect to pass an array directly, but in the coordinator we wrapped it in { commits: ... } for a cleaner schema, which worked fine once the types matched.
Candidate lint rules
no-unused-node-builtins: Flags import { X } from "node:*" where X is never used. This pattern appeared in tasks 7 and 9. Invalid: import { join } from "node:path" (unused). Valid: import { readFile } from "node:fs/promises" (used in tool handler). Model-confusing because the tool description mentions "node:path" or "node:os" as a feature, so the model imports the module even when the function isn't directly called. Safe autofix: remove the import.
Documentation gaps
- SKILL.md should add a row to the High-frequency decisions table: Sequential subagents in workflow →
workflow({ meta, body: async ({ call }) => ... }) — call comes from the body destructure, not an import. Currently workflow is only shown in the table as "Deterministic TypeScript fan-out" without clarifying the meta requirement.
- The
p.writeInput / p.readInput semantics should be more prominent in the decisions table — it's not obvious these replace explicit node:path construction.
Tasks run today
- (reused) JSON fixture anonymizer:
defineTool with heuristics, p.readInput, p.writeInput, repair(), s.object output
- (reused) CSV to Markdown table converter:
defineTool row parser, p.readInput, p.writeInput, repair(), s.boolean input field
- (reused) TOML config section analyzer: async
defineTool with node:fs/promises, p.glob, repair(), s.record output
- (reused) Git checkpoint summarizer: multiple
p.bash in template, s.enum classifier tool, s.optional, repair()
- (reused) TypeScript literal type union extractor: async
defineTool with regex accumulation, p.bash find, steering()
- (reused) Markdown heading validator: async
defineTool, p.glob, nested s.record/s.array/s.object, repair()
- (new) TypeScript barrel module writer:
defineTool identifier validator, p.writeInput, repair(), s.boolean output
- (new) Git remote metadata inspector:
defineTool URL classifier, p.bash multi-command, s.record + s.enum, steering()
- (new) OS environment variable scanner:
defineTool with node:os, p.bash env, s.record nested object, repair()
- (new) Sequential commit classifier workflow: three-agent
workflow pipeline, meta, phase(), chained call() in body
Generated by Daily Rig Task Generator · sonnet46 106.5 AIC · ⌖ 9.17 AIC · ⊞ 6.8K · ◷
Summary
defineToolwith field-name heuristics;p.writeInput+p.readInputused correctlyparseCSVRowtool with.map()and explicit type annotation — good patternnode:fs/promises;p.globused correctly for discoveryp.bashintents in one template string;s.optional(s.string)output fieldRecordaccumulation;steering()addon appropriates.objectins.arrayins.recordoutput — deep schema validated cleanlyjoinimport fromnode:path; removed and typecheck passeds.recordoutput;steering()addon correctly placedhomedirimport fromnode:os; removed and typecheck passedcallwrongly imported from"rig", missingmetafield, agentinputmismatchProblems encountered
Task 7 — Unused
joinimportWhat it tried: Import
joinfromnode:pathto construct the output path, but didn't use it in the tool handler.Error:
TS6133: 'join' is declared but its value is never read.Root cause: The agent's
p.writeInputhandles path construction at runtime; thejoincall was unnecessary boilerplate.Fix: Removed the unused import.
Task 9 — Unused
homedirimportWhat it tried: Import
homedirfromnode:osfor environment variable classification context, but didn't use it in the tool.Error:
TS6133: 'homedir' is declared but its value is never read.Root cause: The classification logic only needed the variable name/value, not the actual home directory value at generation time.
Fix: Removed the unused import.
Task 10 — Multiple workflow errors
What it tried: A sequential three-agent workflow using
callimported from"rig".Errors:
TS2305: Module '"rig"' has no exported member 'call'—callmust come from thebodydestructure parameter, not a top-level import.'agents' does not exist in type 'WorkflowSpec'—agents:is anagent()field, not aworkflow()field.metais required inWorkflowSpecandWorkflowWithoutInputSpec.s.array(...)but the coordinator called it with a raw array.Root cause: Confusion between
agent-style coordination (usesagents:dict) andworkflow-style coordination (uses TypeScriptbodywith destructuredcall). Alsometais required.Fix: Rewrote to use
workflow({ meta: {...}, body: async ({ call, phase }) => {...} })withcall(agent, input)in the body.Improvement opportunities
Missing or undiscoverable schema helpers (
s.*)s.record,s.array,s.object,s.enum,s.optional,s.int,s.boolean,s.path,s.string) were used correctly after the first attempt.Missing or undiscoverable prompt helpers (
p.*)p.writeInput(pathField, outputField)andp.readInput(field)are not well-surfaced. Task 7's first draft importednode:pathunnecessarily because it wasn't clear thatp.writeInputhandles path routing automatically.Error message quality
TS6133: 'X' is declared but its value is never readis perfectly clear — no improvement needed.API ergonomics
workflowbodysignature is the most common source of confusion:callcomes from the destructured body argument, not from an import. This is inconsistent withagentwhich usesagents:for subagent registration. A lint rule or clearer error would help.metabeing required onworkflowis easy to forget; SKILL.md mentions it in examples but doesn't call it out as required in a decision table.input: s.array(...), callers expect to pass an array directly, but in the coordinator we wrapped it in{ commits: ... }for a cleaner schema, which worked fine once the types matched.Candidate lint rules
no-unused-node-builtins: Flagsimport { X } from "node:*"whereXis never used. This pattern appeared in tasks 7 and 9. Invalid:import { join } from "node:path"(unused). Valid:import { readFile } from "node:fs/promises"(used in tool handler). Model-confusing because the tool description mentions "node:path" or "node:os" as a feature, so the model imports the module even when the function isn't directly called. Safe autofix: remove the import.Documentation gaps
workflow({ meta, body: async ({ call }) => ... })—callcomes from the body destructure, not an import. Currentlyworkflowis only shown in the table as "Deterministic TypeScript fan-out" without clarifying themetarequirement.p.writeInput/p.readInputsemantics should be more prominent in the decisions table — it's not obvious these replace explicitnode:pathconstruction.Tasks run today
defineToolwith heuristics,p.readInput,p.writeInput,repair(),s.objectoutputdefineToolrow parser,p.readInput,p.writeInput,repair(),s.booleaninput fielddefineToolwithnode:fs/promises,p.glob,repair(),s.recordoutputp.bashin template,s.enumclassifier tool,s.optional,repair()defineToolwith regex accumulation,p.bashfind,steering()defineTool,p.glob, nesteds.record/s.array/s.object,repair()defineToolidentifier validator,p.writeInput,repair(),s.booleanoutputdefineToolURL classifier,p.bashmulti-command,s.record+s.enum,steering()defineToolwithnode:os,p.bash env,s.recordnested object,repair()workflowpipeline,meta,phase(), chainedcall()in body