Sync work-record index
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Reject generated-only commits / generated-commit-guard (push) Successful in 7s
Python Tests / pytest (push) Successful in 22s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
codex 2026-10-11 23:06:25 +02:00
parent 8bc1f39493
commit 7ef6ba323e
3 changed files with 54 additions and 7 deletions

View file

@ -2,7 +2,7 @@
# Custodian Brief — the-custodian
**Domain:** infotech
**Last synced:** 2026-10-11 19:30 UTC
**Last synced:** 2026-10-11 21:06 UTC
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
## Active Workstreams
@ -16,7 +16,7 @@ Progress: 3/7 done | workplan_id: `ab288f92-d364-5c24-9362-aee451f266c3`
- ! Encode the standing change rule as a policy-nexus guardrail `5dd52156`
*(wait: policy-nexus owns guardrail publication; handoff written as PNEX-WP-0006.)*
- ! Attended window #1 `e3da807f`
*(wait: Founder runs docs/attended-window/2026-10-11-checklist.md (about 2 h).)*
*(wait: Partly done 2026-10-11: list cut from 14 to 3; U05-U07 accepted, U08 waits on KEY-WP-0040-T01. Remaining founder acts: USER-WP-0026-T03 readback, RPF-WP-0044-T08 coulombcore check, the U08 re-run, and Sol's added RPF-WP-0044-T04 issuer login.)*
- ► Stop agent-authored index and sync commits `8a3dc219`
### Separate agent credentials and establish supervised privileged execution

View file

@ -2,12 +2,13 @@
"""Deterministic flow report for the NetKingdom security estate.
Replaces agent sessions that poll wait tasks. Reads workplan files only (no hub,
no network) and prints four lists:
no network) and prints five lists:
READY todo/progress tasks in non-residual workplans: what agents should work on
READY todo/progress tasks with no unresolved explicit dependency or owner/human gate
UNBLOCKED wait tasks whose every depends_on target is done/cancel: requalify to todo
ATTENDED needs_human wait tasks: the attended-window checklist for the operator/founder
STALLED wait tasks qualified only by blocked_on message-from (owner reply), oldest first by file
DEPENDENT todo/progress tasks that still carry an unresolved dependency or owner gate
Usage: security_flow_report.py [--repos a,b,c] [--json]
"""
@ -54,13 +55,19 @@ def classify(tasks):
own = [t for t in tasks.values() if t["id"].startswith(d + "-T")]
return bool(own) and all(t["status"] in TERMINAL for t in own)
out = {"READY": [], "UNBLOCKED": [], "ATTENDED": [], "STALLED": []}
out = {"READY": [], "UNBLOCKED": [], "ATTENDED": [], "STALLED": [], "DEPENDENT": []}
for t in tasks.values():
wp = t["wp"]
if wp["status"] in ("finished", "archived") or wp["flavor"] == "residual":
continue
if t["status"] in ("todo", "progress"):
out["READY"].append(t)
missing = [d for d in t["deps"] if not dep_done(d)]
if t["human"]:
out["ATTENDED"].append(t)
elif missing or t["blocked_on"]:
out["DEPENDENT"].append(t | {"pending_dependencies": missing})
else:
out["READY"].append(t)
elif t["status"] == "wait":
if t["human"]:
out["ATTENDED"].append(t)
@ -83,12 +90,16 @@ def main():
res = classify(load(a.root, a.repos.split(",")))
if a.json:
print(json.dumps({k: [{x: t[x] for x in ("id", "status", "priority", "reason", "blocked_on")}
| {"repo": t["wp"]["repo"]} for t in v] for k, v in res.items()}, indent=1))
| {"repo": t["wp"]["repo"]}
| ({"pending_dependencies": t["pending_dependencies"]} if k == "DEPENDENT" else {})
for t in v] for k, v in res.items()}, indent=1))
return
for k, v in res.items():
print(f"\n## {k} ({len(v)})")
for t in v:
extra = t["blocked_on"] if k == "STALLED" else t["reason"]
if k == "DEPENDENT":
extra = ", ".join(t["pending_dependencies"]) or t["blocked_on"]
print(f"- {t['id']} [{t['status']}/{t['priority'] or '-'}] {t['wp']['repo']}"
+ (f" — {extra[:140]}" if extra else ""))

View file

@ -46,3 +46,39 @@ def test_default_estate_includes_custodian_and_explains_human_gate(tmp_path):
assert [t["id"] for t in result["READY"]] == ["CUST-WP-0079-T05"]
assert result["ATTENDED"][0]["reason"] == "Public publication in daily batch"
assert result["UNBLOCKED"] == []
def test_pending_owner_task_is_not_ready_until_predecessor_finishes(tmp_path):
workplan(tmp_path, "railiance-platform",
"id: RPF-WP-0044-T06\nstatus: todo\npriority: medium\n"
"depends_on: [ACTIVITY-WP-0041-T03]")
workplan(tmp_path, "activity-core",
"id: ACTIVITY-WP-0041-T03\nstatus: progress\npriority: high")
waiting = report(tmp_path)
assert [t["id"] for t in waiting["READY"]] == ["ACTIVITY-WP-0041-T03"]
assert waiting["DEPENDENT"][0]["pending_dependencies"] == ["ACTIVITY-WP-0041-T03"]
workplan(tmp_path, "activity-core",
"id: ACTIVITY-WP-0041-T03\nstatus: done\npriority: high")
assert [t["id"] for t in report(tmp_path)["READY"]] == ["RPF-WP-0044-T06"]
def test_unknown_dependency_and_legacy_owner_gate_are_visible_but_not_ready(tmp_path):
workplan(tmp_path, "access-engine",
"id: FLEX-WP-0036-T06\nstatus: todo\npriority: medium\n"
"depends_on: [UNKNOWN-WP-0001-T01]")
workplan(tmp_path, "ops-mason",
"id: MASON-WP-0010-T03\nstatus: progress\npriority: high\n"
"blocked_on: message-from:railiance-platform")
result = report(tmp_path)
assert not result["READY"]
assert len(result["DEPENDENT"]) == 2
assert result["DEPENDENT"][0]["blocked_on"] == "message-from:railiance-platform"
def test_human_flag_prevents_ready_even_if_status_has_not_been_requalified(tmp_path):
workplan(tmp_path, "user-engine",
"id: USER-WP-0027-T04\nstatus: progress\npriority: high\n"
"needs_human: true\nintervention_note: Real MFA journey")
result = report(tmp_path)
assert not result["READY"]
assert result["ATTENDED"][0]["id"] == "USER-WP-0027-T04"