Honor inherited flow dependencies and batch exact rename scope

This commit is contained in:
codex 2026-10-11 23:26:03 +02:00
parent 1e17f1133c
commit 4292a5078a
4 changed files with 56 additions and 1 deletions

View file

@ -59,3 +59,32 @@ to zero does not revoke RBAC: recovery also removes only these newly issued
bindings. Existing reviewers and consumer grants remain available during recovery.
Live execution still requires T03/T04 and the ordered predecessor proof, fresh
image/inventory reconciliation, server dry-run, headroom and the reviewed receipt.
The same exact batch includes the proposed runtime naming table in
`access-engine/decisions/decisions.md` (FLEX-DEC-2026-021): namespace/chart
`access-engine`, the nine `access-engine-<pin>` names, exact DNS origins and
caller audience `access-engine`. This records the intended side-by-side rename;
the accepted binary ruling remains FLEX-DEC-2026-020. No broader-table founder
acceptance is inferred from the binary ruling. Protected consumer bindings and
grants retain their original meanings.
## FLEX-WP-0036-T04 — new public image package
Publish the exact reviewed Access Engine source under
`forgejo.coulomb.social/coulomb/access-engine`, retaining the existing
`coulomb/flex-auth` package through the migration. `tools/publish-runtime-images.sh`
builds once, tags both names, then independently pulls each published immutable
tag and checks equal registry manifest digests, including OCI indexes and
attestations. A local image/config digest alone cannot satisfy the gate.
Normal push CI continues to publish only the already admitted legacy package.
Paired publication is an explicit `workflow_dispatch` with
`publish_runtime_rename: true`, after the batch disposition and binding to the
exact committed source revision. No paired dispatch or new-package publication
has run. Local image build, renamed entrypoint, both policy paths and the
exit-2 legacy stub are verified. The lifecycle Containerfile's stale stub
entrypoint is repaired. Abort owner: access-engine. Stop on a failed push,
pull or digest mismatch; retain the partial publication record and do not
switch any workload. Recovery retains existing workload pins and prior
published digests; no registry deletion is proposed. New reviewer grants and
runtime deployment remain separate verified steps after their exact approval.

View file

@ -25,6 +25,12 @@ def field(block, key):
return m.group(1).strip().strip('"') if m else ""
def dependencies(block):
# Accept the convention's inline lists and YAML's indented multiline lists.
m = re.search(r"^depends_on:[ \t]*(.*(?:\n[ \t]+[^\n]*)*)", block, re.M)
return re.findall(r"[A-Z][A-Z0-9-]+-T\d+|[A-Z][A-Z0-9-]+-WP-\d+", m[1]) if m else []
def load(root, repos):
tasks, wps = {}, {}
for r in repos:
@ -38,7 +44,7 @@ def load(root, repos):
tid = field(b, "id")
if not tid:
continue
deps = re.findall(r"[A-Z][A-Z0-9-]+-T\d+|[A-Z][A-Z0-9-]+-WP-\d+", field(b, "depends_on"))
deps = list(dict.fromkeys(dependencies(fm) + dependencies(b)))
tasks[tid] = {"id": tid, "status": field(b, "status"), "deps": deps,
"human": field(b, "needs_human") == "true",
"blocked_on": field(b, "blocked_on"),

View file

@ -82,3 +82,16 @@ def test_human_flag_prevents_ready_even_if_status_has_not_been_requalified(tmp_p
result = report(tmp_path)
assert not result["READY"]
assert result["ATTENDED"][0]["id"] == "USER-WP-0027-T04"
def test_workplan_and_multiline_task_dependencies_both_gate_successor(tmp_path):
workplan(tmp_path, "railiance-platform",
"id: RPF-WP-0048-T02\nstatus: todo\npriority: high\n"
"depends_on:\n - ACTIVITY-WP-0041-T03\n - ACTIVITY-WP-0041-T04")
source = tmp_path / "railiance-platform/workplans/test.md"
source.write_text(source.read_text().replace(
"flavor: implementation", "flavor: implementation\ndepends_on: [ACTIVITY-WP-0042]"))
result = report(tmp_path)
assert not result["READY"]
assert result["DEPENDENT"][0]["pending_dependencies"] == [
"ACTIVITY-WP-0042", "ACTIVITY-WP-0041-T03", "ACTIVITY-WP-0041-T04"]

View file

@ -133,6 +133,13 @@ also retain their intervention note in the generated report instead of a blank
reason. CLI regression checks cover the actual owner completion transition and
the default Custodian lane.
The report also excludes todo/progress tasks with unresolved explicit task
dependencies, an owner gate or a human flag from READY. They remain visible
under DEPENDENT or ATTENDED, without agent polling of wait bodies. Regression
tests prove that owner completion admits the successor and that an unknown
predecessor or stale progress label cannot produce readiness. This is queue
qualification, not evidence that the corresponding live work has finished.
## Attended window #1
```task