Feature 09: AI harness and skills framework #62

Merged
approver_agent merged 8 commits from feature/d4a8ed83-9cee-459c-aca3-efd1ccf17ecd-ai-harness into dev 2026-10-05 11:18:54 -04:00
8 Commits
Author SHA1 Message Date
dev_agentandClaude Opus 5.5 bba8fb2155 Record late failures as provider_error timeouts
CI / ci (push) Successful in 1m35s
CI / ci (pull_request) Successful in 1m34s
A run whose work ended after the skill deadline with an error kept its
earlier status, so a slow PostProcess that failed stored a bad_output row
while the caller received a timeout. Any run past the deadline now stores
provider_error, with the error text still wrapping the underlying error.
Adds a test for the late-failure path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 11:03:08 -04:00
dev_agentandClaude Opus 5.5 db0835342f Bound ai_runs saves and redact every stored column
CI / ci (pull_request) Successful in 1m38s
CI / ci (push) Successful in 1m37s
- runOnce no longer saves with an unbounded context.WithoutCancel. Work
  that ended in time must write its row before the skill deadline; if the
  writer is not free by then the run fails with llm.ErrTimeout and its
  row records the timeout. A failed run's row is written within
  runSaveTimeout (5s); if that write fails too, the run returns both
  errors and no row is stored. A stored row's status now always matches
  what the caller received. The row ID is fixed per run, so a second
  save attempt can never add a second row.
- skill, provider and model are redacted with the same redactor as the
  bodies; TestRunRowsHoldNoSecrets seeds the API key and a webhook URL
  into the model value.
- guard_test: "row saved late" now expects a provider_error timeout row;
  new "writer blocked" case proves Run returns ErrTimeout within the
  bound and stores no row.
- Purge doc and ARCHITECTURE: the daily purge is owned by Feature 20's
  scheduler, which must call harness.Purge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 10:52:42 -04:00
dev_agent a8b0c7894f Concurrency guards: single-flight, semaphore and timeouts (#61)
CI / ci (push) Successful in 1m35s
CI / ci (pull_request) Successful in 1m35s
Co-authored-by: dev_agent <dev_agent@cubecraftlabs.com>
2026-10-05 10:42:18 -04:00
dev_agent 87316d8b70 ai_runs logging, redaction and retention (#60)
CI / ci (push) Successful in 1m34s
Co-authored-by: dev_agent <dev_agent@cubecraftlabs.com>
2026-10-05 09:55:06 -04:00
dev_agent 5d5404b3cb Name normalization and dedupe (#59)
CI / ci (push) Successful in 1m32s
Co-authored-by: dev_agent <dev_agent@cubecraftlabs.com>
2026-10-05 09:16:16 -04:00
dev_agent 6ff6443db7 Household context builder with token budget (#57)
CI / ci (push) Successful in 1m34s
Co-authored-by: dev_agent <dev_agent@cubecraftlabs.com>
2026-10-05 08:34:44 -04:00
dev_agent 942ac42b86 Layered prompt rendering from embedded templates (#55)
CI / ci (push) Successful in 1m33s
Co-authored-by: dev_agent <dev_agent@cubecraftlabs.com>
2026-10-05 08:15:35 -04:00
dev_agent 55c15b1b3a Skill harness interface and repair retry (#53)
CI / ci (push) Successful in 1m31s
Co-authored-by: dev_agent <dev_agent@cubecraftlabs.com>
2026-10-05 07:55:34 -04:00