> Restoration note (2026-05-18): This spec was originally landed
> via SciDEX PR #1225 (branch watchdog-followups) on 2026-04-28.
> That PR was closed without merging; the spec file was dropped.
> The corresponding Orchestra task
> af07897f-6af5-4f87-b850-6294fcdd5a5c is still registered and
> active. Restoring this file fixes the broken spec_path reference.
Once a week, audit how the abandonment watchdog has been auto-completing
tasks and confirm:
[Watchdog] Fix: repair-task auto-completedone for one-shots, done/openarchived/failed if explicitly closed).
commits>0 have a correspondinglast_commit_sha against git log).
reason="repair_clean_exit" / reason="repair_periodic_scan"If the audit finds an unexpected pattern (e.g. one-shot tasks
auto-completed with 0 commits and parent status=open), open a Senate
triage task with the affected run IDs.
The 2026-04-27/28 manual audit caught the operator-facing confusion
("Auto-completed by abandonment watchdog: 0 commit(s) on") and verified
no work was actually being lost. Once Orchestra PR #223 lands, the
message confusion goes away, but the behavior could still drift —
e.g. a future regression where a real task gets the
reason="repair_clean_exit" path applied incorrectly.
This recurring task is the periodic check that the watchdog stays
honest.
The audit script (scripts/audit_watchdog_auto_completes.py,
shipped as part of this task) queries Orchestra's task_runs DB:
task_runs row with status=completed in the last 7 daysAuto-completed.
reason (now embedded in the summary text postcommits_landed: verify last_commit_sha is set (or, until[task:<id>]git log --all).repair_clean_exit / repair_periodic_scan: verify the parent{done, archived, failed} for one-shots, or {open, done} for/home/ubuntu/scidex/logs/watchdog_auto_complete_audit-latest.json.
opencommits_landed row with no matching git commit), open a Senateorchestra runs shows a completedscripts/audit_watchdog_auto_completes.py with the algorithm[Watchdog] Fix: description patterncommits_landed runs to git commits viagit log --all --grep='[task:<id>]'.
{
"generated_at": "...",
"window_days": 7,
"total_auto_completes": 0,
"by_reason": {"commits_landed": 0, "repair_clean_exit": 0, ...},
"anomalies": [{"run_id": "...", "reason": "...", "issue": "..."}]
}anomalies is non-empty, open Senate triage tasks (cap 3).reason= field is now embedded in the summary text and parsable.
ecead4e7-d198-4fd2-9bd1-299abc4de6a3 (populate last_commit_sha)commits_landed verification becomesgit log --grep fallback.None — this is a leaf operational task.
Lower than the abandoned-run watchdog (95) because this audits an
already-audited pattern. Higher than typical research tasks because
operational integrity drift is hard to diagnose retroactively.