Summary
| Task |
Description |
Typecheck |
Key finding |
| 1 (reused) |
JSONL File Analyzer |
✅ pass |
Clean use of defineTool with JSON.parse error handling; s.record for valueTypes |
| 2 (reused) |
NPM Peer Dep Checker |
✅ pass |
Good use of p.read + p.bash combo; s.enum for severity levels |
| 3 (reused) |
TS Barrel Module Writer |
✅ pass |
p.writeOutput for file generation; regex tool for identifier validation |
| 4 (reused) |
Git Remote Metadata Inspector |
✅ pass |
steering() addon + s.record output keyed by remote name |
| 5 (reused) |
OS Environment Variable Scanner |
✅ pass |
p.bash("env") + classification tool; nested s.record(s.object(...)) output |
| 6 (reused) |
Sequential Commit Pipeline |
✅ pass (after fix) |
Workflow body used wrong positional (call, input) → fixed to ({call}) destructuring; meta required |
| 7 (new) |
TS Tuple Pattern Extractor |
✅ pass (after fix) |
const [] type inference on ?? [] fails — explicit string[] annotation required |
| 8 (new) |
TS Interface Stub Writer |
✅ pass |
Good p.writeOutput usage; regex method signature validation in tool |
| 9 (new) |
Git Grep Search Workflow |
✅ pass (after fix) |
Workflow body used wrong (call, input) positional form + missing meta field |
| 10 (new) |
JSON Union Type Inferrer |
✅ pass |
s.array(s.unknown) in tool parameters; inferredType as const for enum safety |
Problems encountered
Task 6 — Sequential Commit Pipeline (reused)
What it tried: A three-step workflow chaining commitCollector → commitClassifier → commitAggregator.
Error: WorkflowContext<unknown> has no call signatures — the body was written as async (call) => { ... } treating call as the first positional parameter, but body receives a single WorkflowContext object to destructure.
Root cause: The workflow body signature is body(context: WorkflowContext<I>) and call is a property on that context. Using async (call) => ... binds the entire context to the name call.
Fix: Changed to async ({ call }) => { ... } and added required meta field.
Task 7 — TS Tuple Pattern Extractor (new)
What it tried: Used ?? fallback on String.prototype.match() to get an empty array, then .concat().
Error: Type 'RegExpMatchArray | []' is not assignable to parameter of type 'ConcatArray<never>' — TypeScript cannot narrow RegExpMatchArray | [] to string[] because [] is never[].
Root cause: content.match(pattern) ?? [] returns RegExpMatchArray | [] and [] is typed as never[], making the type intersection impossible without annotation.
Fix: Added explicit const tuples: string[] = content.match(pattern) ?? []; annotation.
Task 9 — Git Grep Search Workflow (new)
Error 1: Same workflow body positional arg issue as task 6.
Error 2: Workflow with input schema required WorkflowSpec overload, but TypeScript picked WorkflowWithoutInputSpec — missing meta field caused overload confusion.
Fix: Added meta field and changed to async ({ call, input }) => { ... } destructuring.
Improvement opportunities
Missing or undiscoverable schema helpers (s.*)
No missing helpers this run. The existing set (s.record, s.optional, s.unknown, s.enum, s.array, s.int) covered all patterns well.
Missing or undiscoverable prompt helpers (p.*)
p.writeOutput and p.writeInput semantics are subtle — the order of arguments is non-obvious. A clearer example in SKILL.md showing p.writeOutput(outputFieldName, pathFieldName) would reduce confusion.
Error message quality
The error WorkflowContext<unknown> has no call signatures is misleading — the actual problem is destructuring. A more helpful message would be: "Did you mean ({ call }) => instead of (call) =>?"
API ergonomics
The meta field being required on both WorkflowSpec and WorkflowWithoutInputSpec is a common stumbling block. Generated programs consistently omit it on first try. Consider making meta optional with a default (similar to how name defaults on agent()), or documenting the required field prominently in SKILL.md under "workflow construction rules".
The two workflow overloads (WorkflowSpec with input vs WorkflowWithoutInputSpec) make it hard to add input to an existing workflow — TypeScript switches overloads silently and the error messages point to the wrong overload.
Candidate lint rules
Rule: workflow-body-positional-call
- Invalid:
body: async (call) => { ... }
- Valid:
body: async ({ call }) => { ... }
- Reason: Models consistently treat the context object as a
call function. This produces a confusing TS error about WorkflowContext not being callable rather than pointing to the destructuring mistake.
- Autofix: Yes — replace
(call) with ({ call }) when call is used as a function in the body.
Documentation gaps
SKILL.md's high-frequency decisions table mentions workflow({ meta, input?, body }) but doesn't show meta as required. The canonical example should include meta or the construction rules should explicitly call it out: "Always include meta: { name, description } on every workflow() call."
Tasks run today
- (reused) JSONL file analyzer with defineTool analyzeJsonLine and repair addon
- (reused) NPM peer dependency conflict checker with checkPeerConflict tool and repair addon
- (reused) TypeScript barrel module writer with p.write and validateExportName tool
- (reused) Git remote metadata inspector with classifyRemote tool and steering addon
- (reused) OS environment variable scanner with classifyEnvVar tool and repair addon
- (reused) Sequential workflow subagent pipeline with three chained agents via call()
- (new) TypeScript tuple type pattern extractor with async defineTool and node:fs/promises
- (new) TypeScript interface stub writer with validateMethodSignature tool and p.write
- (new) Git grep code search workflow with two subagents chained via call()
- (new) JSON union type inferrer with inferFieldType tool and s.array(s.unknown)
Generated by Daily Rig Task Generator · sonnet46 134.1 AIC · ⌖ 9.31 AIC · ⊞ 6.8K · ◷
Summary
defineToolwith JSON.parse error handling;s.recordfor valueTypesp.read+p.bashcombo;s.enumfor severity levelsp.writeOutputfor file generation; regex tool for identifier validationsteering()addon +s.recordoutput keyed by remote namep.bash("env")+ classification tool; nesteds.record(s.object(...))output(call, input)→ fixed to({call})destructuring;metarequiredconst []type inference on?? []fails — explicitstring[]annotation requiredp.writeOutputusage; regex method signature validation in tool(call, input)positional form + missingmetafields.array(s.unknown)in tool parameters;inferredType as constfor enum safetyProblems encountered
Task 6 — Sequential Commit Pipeline (reused)
What it tried: A three-step workflow chaining commitCollector → commitClassifier → commitAggregator.
Error:
WorkflowContext<unknown> has no call signatures— the body was written asasync (call) => { ... }treatingcallas the first positional parameter, butbodyreceives a singleWorkflowContextobject to destructure.Root cause: The workflow body signature is
body(context: WorkflowContext<I>)andcallis a property on that context. Usingasync (call) => ...binds the entire context to the namecall.Fix: Changed to
async ({ call }) => { ... }and added requiredmetafield.Task 7 — TS Tuple Pattern Extractor (new)
What it tried: Used
??fallback onString.prototype.match()to get an empty array, then.concat().Error:
Type 'RegExpMatchArray | []' is not assignable to parameter of type 'ConcatArray<never>'— TypeScript cannot narrowRegExpMatchArray | []tostring[]because[]isnever[].Root cause:
content.match(pattern) ?? []returnsRegExpMatchArray | []and[]is typed asnever[], making the type intersection impossible without annotation.Fix: Added explicit
const tuples: string[] = content.match(pattern) ?? [];annotation.Task 9 — Git Grep Search Workflow (new)
Error 1: Same workflow body positional arg issue as task 6.
Error 2: Workflow with
inputschema requiredWorkflowSpecoverload, but TypeScript pickedWorkflowWithoutInputSpec— missingmetafield caused overload confusion.Fix: Added
metafield and changed toasync ({ call, input }) => { ... }destructuring.Improvement opportunities
Missing or undiscoverable schema helpers (
s.*)No missing helpers this run. The existing set (
s.record,s.optional,s.unknown,s.enum,s.array,s.int) covered all patterns well.Missing or undiscoverable prompt helpers (
p.*)p.writeOutputandp.writeInputsemantics are subtle — the order of arguments is non-obvious. A clearer example in SKILL.md showingp.writeOutput(outputFieldName, pathFieldName)would reduce confusion.Error message quality
The error
WorkflowContext<unknown> has no call signaturesis misleading — the actual problem is destructuring. A more helpful message would be: "Did you mean({ call }) =>instead of(call) =>?"API ergonomics
The
metafield being required on bothWorkflowSpecandWorkflowWithoutInputSpecis a common stumbling block. Generated programs consistently omit it on first try. Consider makingmetaoptional with a default (similar to hownamedefaults onagent()), or documenting the required field prominently in SKILL.md under "workflow construction rules".The two workflow overloads (
WorkflowSpecwithinputvsWorkflowWithoutInputSpec) make it hard to addinputto an existing workflow — TypeScript switches overloads silently and the error messages point to the wrong overload.Candidate lint rules
Rule:
workflow-body-positional-callbody: async (call) => { ... }body: async ({ call }) => { ... }callfunction. This produces a confusing TS error aboutWorkflowContextnot being callable rather than pointing to the destructuring mistake.(call)with({ call })whencallis used as a function in the body.Documentation gaps
SKILL.md's high-frequency decisions table mentions
workflow({ meta, input?, body })but doesn't showmetaas required. The canonical example should includemetaor the construction rules should explicitly call it out: "Always includemeta: { name, description }on everyworkflow()call."Tasks run today