[rig-tasks] Daily rig evaluation — 2026-09-01 — 10/10 passed
- Dominant language
- TypeScript
- Stars
- 13
- Forks
- 0
- Avg merge
- 1d 5h
- Merged PRs (30d)
- 25
Description
## Summary
| Task | Description | Kind | Typecheck | Key finding |
|------|-------------|------|-----------|-------------|
| 1 (reused) | Dockerfile ENV inspector | agent | ✅ pass | Clean use of async defineTool + node:fs/promises readFile with dual regex for KEY=VALUE and KEY VALUE forms |
| 2 (reused) | NPM script prefix analyzer | agent | ✅ pass | `as const` on return values correctly preserves literal types for s.enum comparison |
| 3 (reused) | INI config file parser | agent | ✅ pass | p.readInput correctly used with caller-supplied s.object input; tool parses sections/key-value cleanly |
| 4 (reused) | Git reflog inspector | agent | ✅ pass | steering() addon appropriate for classification task; fallback `|| echo 'no reflog'` is good defensive practice |
| 5 (reused) | Source line length auditor | agent | ✅ pass | Good use of find with p.bash + async defineTool; s.optional(s.string) for mostVerboseFile is correct |
| 6 (reused) | NPM script dep workflow | workflow | ✅ pass | Initial errors: `call` incorrectly imported from `"rig"` (not exported), `meta` missing `description`, `call(agent, undefined)` not valid — all fixed |
| 7 (new) | HTML form field extractor | agent | ✅ pass | Initial error: `exactOptionalPropertyTypes` requires explicit conditional assignment for optional fields rather than assigning `undefined`; fixed with guarded push pattern |
| 8 (new) | Dotenv template validator | agent | ✅ pass | p.readOptional with empty string fallback is idiomatic; steering() appropriate for comparison/decision tasks |
| 9 (new) | TypeScript namespace usage reporter | agent | ✅ pass | p.glob + per-file async defineTool is the correct fan-out pattern; augmentation detection via `declare module/namespace` regex is precise |
| 10 (new) | Multi-stage artifact pipeline | workflow | ✅ pass | Initial errors: same `call` import issue + missing `meta.description` as task 6; fixed using `body: async ({ call }) =>` destructuring and TypeScript-owned result assembly |
---
## Problems encountered
### Task 6 — NPM script dep workflow (initial failures)
**What the code tried to do:** A `workflow()` with two sequential agent calls passing structured output from scriptGraphBuilder to cycleDetector.
**Errors:**
```
error TS2305: Module '"rig"' has no exported member 'call'.
error TS2769: Property 'description' is missing in type '{ name: string; }' but required in type 'WorkflowMeta'.
error TS2345: Argument of type 'undefined' is not assignable to parameter of type 'string | PromptIntent | PromptBuilder'.
```
**Root cause:** Three distinct mistakes:
1. `call` is not exported from `"rig"` — it is destructured from the `body({ call })` parameter or imported from `"rig/globals"`.
2. `workflow({ meta: { name } })` requires a `description` field in `WorkflowMeta`.
3. `call(agent, undefined)` is not valid — agents always receive a string prompt or typed input.
**Fix:** Used `body: async ({ call }) =>` destructuring, added `description` to meta, passed a string prompt to agents.
### Task 7 — HTML form field extractor (initial failure)
**What the code tried to do:** Push objects with optional `name`/`id` fields by assigning `undefined` values.
**Errors:**
```
error TS2379: exactOptionalPropertyTypes: 'string | undefined' is not assignable to type 'string'.
```
**Root cause:** With `exactOptionalPropertyTypes: true`, assigning `undefined` to an optional field that expects only `string` is rejected. The fix is to conditionally include the property only when the value is defined.
**Fix:** Build the entry object without optional fields, then conditionally assign them.
### Task 10 — Multi-stage artifact pipeline (initial failures)
Same `call` import and `meta.description` errors as task 6. Fixed identically.
---
## Improvement opportunities
### Missing or undiscoverable schema helpers (`s.*`)
No missing helpers this run. The existing set (`s.object`, `s.record`, `s.array`, `s.enum`, `s.optional`, `s.path`, `s.int`, `s.number`, `s.boolean`, `s.string`) covered all needs.
### Missing or undiscoverable prompt helpers (`p.*`)
`p.readOptional` with an empty-string fallback (task 8) is not clearly documented in SKILL.md's quick reference table. Consider adding it as a distinct row: `p.readOptional(path, fallback?)` — currently documented only in the focused reference.
### Error message quality
The `exactOptionalPropertyTypes` error (`TS2379`) is confusing because it mentions a parameter type mismatch rather than naming the root cause directly. The fix (conditional assignment) is non-obvious from the error text alone.
The `call` import error (`TS2305: Module '"rig"' has no exported member 'call'`) is clear, but nothing in the error guides toward the correct `body({ call })` destructuring pattern. A short comment in SKILL.md would prevent this.
### API ergonomics
1. **`call` discoverability**: The most common workflow mistake is `import { call } from "rig"`. SKILL.md's composition rule could add a note: "`call` is available via `body({ call })` destructuring — do not import it from `"rig"`."
2. **`workflow` meta requirement**: `description` being required in `WorkflowMeta` is not called out in the high-frequency decisions table. A brief reminder alongside the `workflow()` row would prevent the error.
3. **`call(agent, undefined)` vs `call(agent, string)`**: It is unclear from the table that agents always require a non-null prompt. Noting "pass a string prompt or typed input; never `undefined`" would help.
### Candidate lint rules
**Rule: `no-rig-call-import`**
- Invalid: `import { agent, call } from "rig";`
- Valid: `body: async ({ call }) => { ... }` or `import { call } from "rig/globals";`
- Why model-confusing: `call` looks like a plain function export given how `agent` and `workflow` are imported. The destructuring pattern is non-obvious without reading the full reference.
- Safe autofix: possible — remove `call` from the `"rig"` import and add `import { call } from "rig/globals"` as a fallback (with a comment to prefer destructuring inside `body`).
### Documentation gaps
- SKILL.md high-frequency decisions table should add: `workflow meta` → must include both `name` and `description`.
- SKILL.md should note that `call` inside `workflow.body` is always obtained via destructuring, not via import.
- `p.readOptional` deserves a row in the quick-reference table with an example fallback value.
---
## Tasks run today
- (reused) Dockerfile ENV instruction parser
- (reused) NPM script command prefix analyzer
- (reused) INI config file parser
- (reused) Git reflog inspector
- (reused) Source file line length auditor
- (reused) NPM script dependency workflow
- (new) HTML form field extractor
- (new) Dotenv template validator
- (new) TypeScript namespace usage reporter
- (new) Multi-stage build artifact pipeline
> Generated by [Daily Rig Task Generator](https://github.com/githubnext/rig/actions/runs/33482646338) · sonnet46 164.3 AIC · ⌖ 9.36 AIC · ⊞ 6.8K · [◷](https://github.com/search?q=repo%3Agithubnext%2Frig+is%3Aissue+%22gh-aw-workflow-call-id%3A+githubnext%2Frig%2Fdaily-rig-task-generator%22&type=issues)
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with SKILL.md's high-frequency decisions table and quick-reference section, then compare them with the workflow and prompt-helper findings in this issue. Document the workflow meta requirements, the body({ call }) pattern, non-undefined agent prompts, and p.readOptional with a fallback. Done means the listed gaps are covered with concise examples and the existing reference remains consistent.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- developer-experience, documentation
- Issue type
- Documentation
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 74/100