Summary
| Task |
Description |
Kind |
Typecheck |
Key finding |
| 1 (reused) |
HTML anchor link extractor |
agent |
✅ pass |
Clean use of defineTool with readFile + regex loop; s.enum for link classification works well |
| 2 (reused) |
TS optional chaining counter |
agent |
✅ pass |
s.record(s.object(...)) pattern with steering() addon; regex-based counting idiomatic |
| 3 (reused) |
Git file size change tracker |
agent |
✅ pass |
execSync in tool handler for git cat-file -s; s.enum for grew/shrank/unchanged is expressive |
| 4 (reused) |
JSON pretty-printer stats |
agent |
✅ pass |
Multiple tools (read/analyze/write) chain naturally; s.unknown for JSON value parameter works |
| 5 (reused) |
TS interface method counter |
agent |
✅ pass |
p.glob + per-file tool calls; s.record(s.object) for named interfaces; steering() with message arg |
| 6 (reused) |
Git tag annotation extractor |
agent |
✅ pass |
execSync in tool for git cat-file -t; as const on return literals for enum matching |
| 7 (new) |
TS wildcard re-export detector |
agent |
✅ pass |
p.glob discovery + readFile/regex; s.array(s.string) for targets field; steering() addon |
| 8 (new) |
Markdown link classifier |
agent |
✅ pass |
p.glob("**/*.md") with per-file tool; s.record for file stats map; repair() addon |
| 9 (new) |
package.json field auditor |
agent |
✅ pass |
p.read("package.json") inline in instructions; s.enum("present","absent","malformed"); s.number for score |
| 10 (new) |
Parallel git stats workflow |
workflow |
✅ pass |
Initial attempt used import { call } from "rig" (wrong); fixed to destructure call from body param. Also needed meta.description and WorkflowMeta-compliant object. Promise.all with two subagents pattern works well. |
Problems encountered
Task 10 — Parallel git stats workflow (fixed)
What the code tried to do: Two subagents (commitStatsAgent, fileStatsAgent) run in parallel via Promise.all, then a call.json() combines results.
Error 1:
Module '"rig"' has no exported member 'call'.
Root cause: call is NOT exported from "rig". It is destructured from the body function parameter: body: async ({ call }) => { ... }. Fix: remove call from the import, add it to the body destructure.
Error 2:
Property 'description' is missing in type '{ name: string; }' but required in type 'WorkflowMeta'.
Root cause: WorkflowMeta requires both name and description. Fix: add description to meta.
Error 3:
'b' is of type 'unknown'.
Root cause: s.record(s.int) values are typed as unknown at the TypeScript call-site when accessed via Object.entries. Fix: cast with (b as number).
Improvement opportunities
Missing or undiscoverable schema helpers (s.*)
- No issues;
s.record(s.int), s.record(s.object(...)), s.enum(...), s.optional, s.unknown all worked cleanly.
Missing or undiscoverable prompt helpers (p.*)
p.glob is useful for discovery but has no built-in fan-out; models must be instructed to call tools per path, which is verbose in instructions. A short SKILL.md note about this pattern would reduce confusion.
Error message quality
- The error
Module '"rig"' has no exported member 'call' is clear, but the fix is non-obvious: call is a body parameter, not a module export. The SKILL.md table already documents this but it was still the most common first-draft mistake in workflow programs.
API ergonomics
WorkflowMeta requiring description is easy to forget when only name feels sufficient. A lint rule or a good TypeScript error with the field name visible would help.
s.record(s.int) entries being typed as unknown when destructured from Object.entries causes surprise. Models consistently need to add as number casts. A note in the s.record reference about this would prevent repeated failures.
Candidate lint rules
Rule: workflow-call-not-imported
- Invalid:
import { workflow, agent, call } from "rig";
- Valid:
body: async ({ call }) => { ... }
- Why:
call is only available as a body parameter; importing from "rig" always fails at typecheck.
- Safe autofix: Yes — remove
call from the named import and add it to the body destructure.
Documentation gaps
WorkflowMeta shape (name + description required) is not prominently documented. Add a minimal meta example to SKILL.md or the composition reference.
- The
s.record value-type-is-unknown issue with Object.entries is undocumented. Mention in the agent-api reference that sorting/aggregating s.record(s.int) values requires as number casts.
Tasks run today
- (reused) HTML anchor link extractor: p.bash find for .html, defineTool extractAnchors with regex, s.enum(internal/external/fragment), repair addon
- (reused) TypeScript optional chaining counter: p.bash find .ts, defineTool countNullSafetyOperators, s.record, steering addon
- (reused) Git file size change tracker: p.bash git diff --name-only, defineTool getFileSizeAtRevision via execSync, s.enum(grew/shrank/unchanged), repair addon
- (reused) JSON pretty-printer stats: s.object input, three tools (read/analyze/write), s.unknown parameter, repair addon
- (reused) TypeScript interface method counter: p.glob src/**/*.ts, defineTool countInterfaceMethods, s.record, steering addon
- (reused) Git tag annotation extractor: p.bash git tag -l, defineTool classifyTagType via execSync, s.enum, repair addon
- (new) TypeScript wildcard re-export detector: p.glob src/**/*.ts, defineTool scanWildcardReexports, s.array(s.string), steering addon
- (new) Markdown link classifier: p.glob **/*.md, defineTool extractLinks with regex, s.record, repair addon
- (new) package.json field auditor: p.read package.json, defineTool checkFieldPresence, s.enum(present/absent/malformed), s.number for score
- (new) Parallel git stats workflow: workflow + Promise.all, two subagents (commit stats + file stats), call.json for combining, s.enum(healthy/sparse/empty)
Generated by Daily Rig Task Generator · sonnet46 148.7 AIC · ⌖ 9.36 AIC · ⊞ 6.8K · ◷
Summary
defineToolwithreadFile+ regex loop;s.enumfor link classification works wells.record(s.object(...))pattern withsteering()addon; regex-based counting idiomaticexecSyncin tool handler forgit cat-file -s;s.enumfor grew/shrank/unchanged is expressives.unknownfor JSON value parameter worksp.glob+ per-file tool calls;s.record(s.object)for named interfaces;steering()with message argexecSyncin tool forgit cat-file -t;as conston return literals for enum matchingp.globdiscovery +readFile/regex;s.array(s.string)for targets field;steering()addonp.glob("**/*.md")with per-file tool;s.recordfor file stats map;repair()addonp.read("package.json")inline in instructions;s.enum("present","absent","malformed");s.numberfor scoreimport { call } from "rig"(wrong); fixed to destructurecallfrombodyparam. Also neededmeta.descriptionandWorkflowMeta-compliant object.Promise.allwith two subagents pattern works well.Problems encountered
Task 10 — Parallel git stats workflow (fixed)
What the code tried to do: Two subagents (
commitStatsAgent,fileStatsAgent) run in parallel viaPromise.all, then acall.json()combines results.Error 1:
Root cause:
callis NOT exported from"rig". It is destructured from thebodyfunction parameter:body: async ({ call }) => { ... }. Fix: removecallfrom the import, add it to thebodydestructure.Error 2:
Root cause:
WorkflowMetarequires bothnameanddescription. Fix: adddescriptiontometa.Error 3:
Root cause:
s.record(s.int)values are typed asunknownat the TypeScript call-site when accessed viaObject.entries. Fix: cast with(b as number).Improvement opportunities
Missing or undiscoverable schema helpers (
s.*)s.record(s.int),s.record(s.object(...)),s.enum(...),s.optional,s.unknownall worked cleanly.Missing or undiscoverable prompt helpers (
p.*)p.globis useful for discovery but has no built-in fan-out; models must be instructed to call tools per path, which is verbose in instructions. A short SKILL.md note about this pattern would reduce confusion.Error message quality
Module '"rig"' has no exported member 'call'is clear, but the fix is non-obvious:callis abodyparameter, not a module export. TheSKILL.mdtable already documents this but it was still the most common first-draft mistake in workflow programs.API ergonomics
WorkflowMetarequiringdescriptionis easy to forget when onlynamefeels sufficient. A lint rule or a good TypeScript error with the field name visible would help.s.record(s.int)entries being typed asunknownwhen destructured fromObject.entriescauses surprise. Models consistently need to addas numbercasts. A note in thes.recordreference about this would prevent repeated failures.Candidate lint rules
Rule:
workflow-call-not-importedimport { workflow, agent, call } from "rig";body: async ({ call }) => { ... }callis only available as a body parameter; importing from"rig"always fails at typecheck.callfrom the named import and add it to the body destructure.Documentation gaps
WorkflowMetashape (name+descriptionrequired) is not prominently documented. Add a minimalmetaexample toSKILL.mdor the composition reference.s.recordvalue-type-is-unknown issue withObject.entriesis undocumented. Mention in the agent-api reference that sorting/aggregatings.record(s.int)values requiresas numbercasts.Tasks run today