the-custodian/docs/evidence/2026-10-03-dependency-graph-triage/README.md
codex 786b082a19
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Python Tests / pytest (push) Successful in 23s
CUST-WP-0075: reconcile owner waits and decision routing
2026-10-04 01:17:18 +02:00

7.6 KiB

Dependency-graph triage — 2026-10-03

Evidence for CUST-WP-0075. Two views of the same open set, both taken 2026-10-03 against the primary (railiance01).

File Source What it answers
scan_workplan_files.py → file-view.txt every registered repo's workplans/*.md (145 repos, 1128 workplans) authoritative: satisfied waits, mis-statused workplans, gate roots by transitive fan-in, cycles, human gates
graph_hub_view.py → hub-view.txt GET /workplans/, /tasks/, /workplans/{id}/dependencies/ what the read model currently carries (201 unique edges)

Run with TRIAGE_SCRATCH=<dir> holding repos.json, wps.json, waits.json, tasks_todo.json, tasks_progress.json, deps.json from the API.

Headline numbers (file view)

  • 108 open workplans: 100 blocked, 5 active, 2 proposed, 1 backlog.
  • 232 wait tasks, 44 todo, 4 progress inside them.
  • 8 wait tasks whose every depends_on target is already terminal.
  • 4 blocked workplans with no wait task; 3 non-blocked workplans whose only open tasks are waits; 1 blocked workplan with zero open tasks.
  • 69 human gates (needs_human: true). Zero carry a decision_id, although the standard (canon/standards/task-wait-qualifiers_v0.1.md) and C-40 rule 4 already support clearing a task when its decision resolves.
  • No cycles among open nodes.
  • Top roots by transitive fan-in: SAND-WP-0015-T04 (7 workplans), SECRETS-WP-0009-T03 (5), GLAS-WP-0012 (4), NK-WP-0040 (4), FEP-WP-0002-T03 (4, a todo — not blocked at all), RAPPS-WP-0014-T03 (3).

Repeatable monitor (CUST-WP-0075-T05)

From the Custodian checkout, with Python and PyYAML installed:

python3 scripts/monitor_dependency_triage.py --output /tmp/dependency-triage

The monitor makes GET requests only. It captures the repository registry, scans available owner files, compares every open non-residual wait's status and qualifiers with its hub projection, and records the three T06 handoffs. monitor.json contains counts and actionable findings; file-view.txt contains the graph analysis. Raw registry and file indexes stay in the scratch directory. No schedule, worker injection, owner-file change, or decision resolution is enabled.

unavailable_checkouts and parse_warnings make coverage limits explicit. The scanner now reads YAML lists and quoted text correctly; historic task fences containing prose use a reported fallback. The detailed file view includes residuals for observation; the monitor's actionable counts exclude them. Terminal predecessors are candidates for review: independent human and owner gates remain binding. Replies newer than a proposal are candidates, not evidence of acceptance; reviewed owner workplan IDs or declines still belong in T06.

The refreshed snapshot is monitor-2026-10-03.json. It supersedes the earlier headline counts for the visible checkouts. Four new unrouted human gates, sixteen unqualified waits, and twelve qualifier differences need follow-up through T05; the earlier T02/T03 completion records are historical. Six registered checkouts were unavailable. The sixteen degraded parses are in historic Vergabe workplans. These results do not establish fleet-wide completeness.

Focused regression checks:

python3 -m unittest discover -s tests -p test_dependency_triage.py

Repository workers and reviewed handoffs

The founder authorized repo workers for the continuation. Dispatch and results are tracked in worker-dispatch-2026-10-03.json. Assignments cover owner proposal dispositions, qualifier reconciliation, and review of terminal predecessors. Workers preserve human gates and residuals; source preparation and owner handoff do not establish production acceptance.

After reviewing an owner's proposal reply, record its disposition in owner-handoff-receipts.json, keyed by the original proposal message UUID:

{
  "original-message-uuid": {
    "reply_message_id": "owner-reply-uuid",
    "disposition": "accepted",
    "reason": "Concrete proposal disposition and remaining scope",
    "owner_workplan_id": "OWNER-WP-NNNN",
    "owner_task_ids": ["OWNER-WP-NNNN-T01"]
  }
}

The monitor reads this file by default, or accepts --handoff-receipts <path>. Accepted and partially accepted dispositions require a non-residual owner plan and actual task records; a decline requires a reason. The reply must name the right owner, recipient and proposal thread. Unreviewed or unrelated replies leave the case waiting. A satisfied case closes the proposal handoff only; implementation tasks retain their statuses and authority boundaries.

The registry has stale or missing paths for four locally available checkouts. Use explicit overrides to cover them without changing registry authority:

python3 scripts/monitor_dependency_triage.py --output /tmp/dependency-triage \
  --repo-path access-engine=/home/worsch/access-engine \
  --repo-path repo-manager=/home/worsch/repo-manager \
  --repo-path railiance-bootstrap=/home/worsch/railiance-bootstrap \
  --repo-path railiance-hosts=/home/worsch/railiance-hosts

registry.json preserves the returned registry; repos.json is the effective local scan input. The report records overrides explicitly. The expanded scan found three additional unrouted Access Engine gates, assigned to its worker. inter-hub and markitect-project remain unavailable locally.

2026-10-04 worker close

The closing snapshot is monitor-workers-2026-10-04.json, with its authoritative graph view. Across 146 registered repos and 144 available checkouts, the visible non-residual view has 106 open plans, 241 waits and 86 human gates. It has zero unrouted human gates, unqualified waits, terminal-predecessor waits or qualifier differences. All three proposal handoffs have reviewed original-thread dispositions and owner records. These are point-in-time results; continuing human/owner gates remain binding.

Dispatch results name 19 affected repo scopes. Selected UUID verification records 28 qualifier/dependency rows; six human routes and three Activity/User waits were separately verified against their actual source blocks. Monitor regressions: 11 pass. State Hub checker/CLI: 182 pass. Warden routing/plan: 118 pass. Platform renderer: 7 pass; existing suite retains one unrelated catalog exact-set failure (52/53), and its broad audit retains three historical C07 failures.

The two unavailable checkouts are inter-hub and markitect-project. Sixteen historical Vergabe task-fence fallback warnings remain. The original snapshot and earlier headline counts are historical evidence, not closing results.

Activity Core normal registrar sync remains blocked on historical labels and unsafe receiving derivation: see read-only proof and owner recommendation. Current ACTIVITY0042 task UUIDs match source after the direct checker; that does not restore historical receiving preservation. The prepared registrar-only patch was not applied. Owner request 6bf8ca98-ada1-43ab-83e7-207d4ab195fe and ACTIVITY-WP-0042-T08 retain that blocker. The checker also reports three rejected historical self-dependency writes; no legacy repair is claimed.

Live continuing records: STATE-WP-0094-T03/T04/T05, RPF-WP-0050-T02/T03/T04, WARDEN-WP-0041-T02/T03, and the unpromoted cadence residual CUST-WP-0076-T01. No schedule, custody choice, provisioning session or runtime rollout is inferred.