Skip to content

[rig-tasks] Daily rig evaluation — 2026-07-26 — 10/10 passed #186

Description

@github-actions

Summary

Task Description Typecheck Key finding
1 (reused) Git tag release timeline reporter (nano subagent) ✅ pass Clean subagent delegation pattern; agents: { timelineSummarizer } wired correctly
2 (reused) Service health probe checker (input array, steering) ✅ pass addons: [steering({...})] array form required; s.optional(s.int) for httpCode correct
3 (reused) Git metadata template renderer (p.readInput, p.writeInput) ✅ pass Used p.writeInput("outputPath","renderedContent") correctly for dynamic output path
4 (reused) Changelog entry generator (defineTool, p.write, nested s.object) ✅ pass s.object({ breaking: s.array(s.string), ... }) nested cleanly; double import of defineTool initially (fixed)
5 (reused) TODO/FIXME/HACK tracker (p.bash grep, p.write, s.record) ✅ pass s.record(s.int) for byType counts is idiomatic; p.write with placeholder content works
6 (reused) Multi-file glob summarizer (nano subagent per file, s.record) ✅ pass output: s.record(s.string) at root level is valid without wrapping in s.object
7 (new) Shell script safety flag analyzer (async defineTool, node:fs/promises) ✅ pass async handler with await import("node:fs/promises") pattern typechecks cleanly
8 (new) Lock file drift detector (defineTool JSON.parse, repair addon) ✅ pass import { ..., repair } from "rig" — repair imported directly from rig; addons: [repair()] correct
9 (new) Git conflict marker scanner (p.bash, steering addon) ✅ pass s.enum("<<<<<<<", "=======", ">>>>>>>") with special chars typechecks fine
10 (new) Proto file field extractor (async defineTool, regex) ✅ pass s.record(s.array(s.object({...}))) as root output is valid and idiomatic

Problems encountered

No failures this run. All 10 programs passed typecheck on the first attempt.


Improvement opportunities

Missing or undiscoverable schema helpers (s.*)

  • No s.int vs s.number reminder in inline docs: When writing fieldNumber: s.int, newcomers may reach for s.number by default. A short inline note in SKILL.md that "use s.int/s.integer for counts, indices, line numbers; s.number for floats" would help (currently only in the table body, not the helper list).
  • s.nonEmptyArray undiscoverable: Task 6 (file list) could have used s.nonEmptyArray but the helper doesn't appear prominently in examples.

Missing or undiscoverable prompt helpers (p.*)

  • p.writeInput signature confusion: p.writeInput(inputPathField, contentOutputField) is asymmetric with p.writeOutput(field, path) — the arg order flips between "field then path" vs "path-field then content-field". Task 3 required careful reference reading to get right. A concrete example showing both forms side-by-side in SKILL.md would reduce errors.
  • p.readInput only reads a single field: Task 3 needed to read two input fields (templatePath and outputPath). Only templatePath could be read with p.readInput; outputPath was used via p.writeInput. This asymmetry is not obvious from SKILL.md.

Error message quality

No typecheck failures this run, so no error messages to analyze.

API ergonomics

  • addons accepts array or single value: Tasks 2, 8, 9 used addons: [steering()] / addons: [repair()] (array form). Earlier samples sometimes use addons: steering({...}) (single form). The reference table says "stable addons" in spec, but doesn't show the array form explicitly. Clarifying that both are valid would help.
  • Double import of defineTool: Task 4 initially had import { agent, p, s } from "rig" and then a separate import { defineTool } from "rig". The construction rule says "one import statement" — the linter should catch duplicate imports from "rig".

Candidate lint rules

Rule: no-duplicate-rig-import

  • Invalid: import { agent, p, s } from "rig"; import { defineTool } from "rig";
  • Valid: import { agent, defineTool, p, s } from "rig";
  • Why model-confusing: Models sometimes emit a second import when they realize they need defineTool or an addon after writing the first import line.
  • Safe autofix: yes — merge named imports into the first statement.

Documentation gaps

  • p.writeInput vs p.writeOutput comparison example missing from SKILL.md: Both are mentioned in the reference table but only p.writeOutput has an inline example. Adding a p.writeInput code snippet to references/prompt-intents.md would close this gap.
  • repair() import not shown in canonical example: SKILL.md's default program uses no addons. Adding a one-line // with repair: import { agent, p, s, repair } from "rig"; comment in the addons section would make it clear that addons are imported directly from "rig", not from a subpath.

Tasks run today

  • (reused) Git tag release timeline reporter using p.bash git tag --sort and git log between tags, two-step chain with timelineSummarizer subagent (nano), outputs s.array(s.object) with tag/date/commitCount/topAuthors plus s.boolean hasUnreleasedCommits
  • (reused) Service health probe checker that accepts s.array(s.string) of URLs, uses p.bash curl checks per endpoint, steering addon for unexpected status codes, outputs s.array(s.object) per endpoint with s.enum status (up/down/slow/unknown), healthyCount, and overallStatus s.enum(all-healthy/degraded/critical)
  • (reused) Git-metadata template renderer that reads a template via p.readInput, gathers commit metadata via p.bash git log, uses defineTool to parse the log line, fills {{commit}}/{{author}}/{{branch}}/{{date}}/{{message}} placeholders, and writes rendered output via p.writeInput
  • (reused) Changelog entry generator that reads git diff via p.bash, uses defineTool to validate semver bump type, and writes CHANGELOG.md via p.write, with s.object output tracking changes by category
  • (reused) TODO/FIXME/HACK comment tracker using p.bash grep scan and p.write to produce markdown report
  • (reused) Multi-file glob summarizer: uses p.bash to find TS files, a nano fileSummarizer subagent per file, coordinator aggregates into s.record(s.string) keyed by path
  • (new) Shell script safety flag analyzer: uses p.bash find to locate .sh files, async defineTool with node:fs/promises readFile to parse shebang and detect set -e/set -u/set -o pipefail, outputs s.record(s.object) with safetyLevel s.enum(strict/partial/unsafe) keyed by file path
  • (new) Lock file drift detector: reads package.json and package-lock.json via p.bash cat, uses defineTool with JSON.parse to cross-check declared vs locked versions, repair addon, outputs s.object with driftedPackages s.array/driftCount s.int/allInSync s.boolean
  • (new) Git conflict marker scanner: uses p.bash grep -rn for conflict markers across tracked files, steering addon to cover all file types, outputs s.object with conflicts s.array/affectedFiles s.array(s.path)/conflictCount s.int/isClean s.boolean
  • (new) Proto file field extractor: uses p.bash find for .proto files, async defineTool with node:fs/promises readFile and regex to parse message/field definitions, outputs s.record(s.array(s.object)) with fieldName/fieldType/fieldNumber s.int/isRepeated s.boolean keyed by message name

Generated by Daily Rig Task Generator · sonnet46 125.8 AIC · ⌖ 9.47 AIC · ⊞ 6.7K ·

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions