F-3 Consolidation Rollback-Only Coverage Dry-Run — 05 Owner/Gap/Conflict/Containment Results
05 — Owner / Gap / Conflict / Containment Results
Live output of Phase D/E. The heart of F-3: one group-level inherited anchor fanning out to 4 child collections through a real containment edge, plus a direct owner, missing owners, and conflict detection — at the broader 10-collection scope. All inside the rolled-back transaction.
5.1 D1/D2 — ownership seeds (two rows)
D1 ('group','GRP-GOVERNANCE','policy','accountable','GOV-COUNCIL', is_inherited_anchor=true, 'active','APR-F3-DRY')
D2 ('collection','workflows','policy','accountable','GOV-DOT', is_inherited_anchor=false, 'active','APR-F3-DRY')
object_type='group' is accepted (the ownership table has no CHECK on object_type — verified in preflight; only owner_kind, lifecycle_status, chk_delegated_ttl CHECKs and the owner/scope FKs exist). This lets an owner anchor on a folder-group node, which is exactly how group-level inheritance is expressed.
5.2 E1 — owner resolution (6 rows: 2 direct + 4 inherited)
object_type | object_ref | scope | owner_gov_code | resolution | depth | source_anchor_ref
-------------+-------------------+--------+----------------+------------+-------+-------------------
group | GRP-GOVERNANCE | policy | GOV-COUNCIL | direct | 0 | GRP-GOVERNANCE
collection | workflows | policy | GOV-DOT | direct | 0 | workflows
collection | approval_requests | policy | GOV-COUNCIL | inherited | 1 | GRP-GOVERNANCE
collection | apr_action_types | policy | GOV-COUNCIL | inherited | 1 | GRP-GOVERNANCE
collection | apr_approvals | policy | GOV-COUNCIL | inherited | 1 | GRP-GOVERNANCE
collection | apr_request_types | policy | GOV-COUNCIL | inherited | 1 | GRP-GOVERNANCE
The recursive v_object_effective_owner:
- resolves the group node
GRP-GOVERNANCE/policydirectly at depth 0; - resolves
workflows/policydirectly at depth 0 (the standalone direct owner); - climbs the real containment edge from each of the 4 GRP-GOVERNANCE child collections to the group node and inherits
GOV-COUNCILat depth 1, because the anchor row hasis_inherited_anchor=true(anti-hiding: inheritance only through flagged anchors).source_anchor_ref=GRP-GOVERNANCEfor all four — the provenance is explicit.
This is the F-3 advance over F-2: one anchor → many inherited children, through a production folder-group, not a single hand-made edge. It is the scaling behavior a ratified F-4 will rely on.
5.3 E2 — resolution landing on inventory objects (5)
object_ref | scope | owner_gov_code | resolution | depth
-------------------+--------+----------------+------------+-------
workflows | policy | GOV-DOT | direct | 0
approval_requests | policy | GOV-COUNCIL | inherited | 1
apr_action_types | policy | GOV-COUNCIL | inherited | 1
apr_approvals | policy | GOV-COUNCIL | inherited | 1
apr_request_types | policy | GOV-COUNCIL | inherited | 1
The group node is an intermediate (not in inventory); the 5 owned inventory rows = 1 direct + 4 inherited. Objective 4 (direct), Objective 5 (inherited) met.
5.4 E3/E4 — gap after ownership (Objective 6, missing owner)
object_ref | gaps gap_after = 55
---------------------+------
approval_requests | 5 (policy covered, inherited)
apr_action_types | 5 (policy covered, inherited)
apr_approvals | 5 (policy covered, inherited)
apr_request_types | 5 (policy covered, inherited)
workflows | 5 (policy covered, direct)
workflow_steps | 6 ── MISSING: in GRP-WORKFLOW which has NO group anchor;
collection_registry | 6 a direct owner on a *sibling* (workflows) does NOT
dot_tools | 6 inherit sideways. Honest gap.
taxonomy | 6
taxonomy_facets | 6
- 60 → 55: the one group anchor + one direct owner reduced the gap set by exactly 5 — the 4 inherited GRP-GOVERNANCE children + the 1 direct
workflows. The gap view honors inheritance (it does not re-flag the 4 children'spolicyscope even though they have no direct owner). workflow_stepsstays 6/6 — a crisp negative-inheritance proof: it shares a group withworkflows, butworkflows's owner is direct on the collection, not anchored onGRP-WORKFLOW, so it does not propagate to the sibling. Objective 4 (missing owner → GAP) met forworkflow_stepsand all 4 GRP-REGISTRY collections.
5.5 E5–E7 — covered proof + conflict detection
E5 approval_requests/policy COVERED(inherited)
apr_action_types/policy COVERED(inherited)
apr_approvals/policy COVERED(inherited)
apr_request_types/policy COVERED(inherited)
workflows/policy COVERED(direct) (5 rows)
E6 conflicts = 0 (v_object_owner_conflict on real store)
E7 double_groups = 1 (index-less _own_probe with 2 active accountables)
- E6=0 — no double accountable owners can exist on the real store because
uq_gov_obj_accountable(partial unique index) prevents them; N1 (doc 06) proves it rejects a second one. - E7=1 — the
GROUP BY … HAVING count(*)>1detector catches two active accountables for the same(object,scope)inserted into an index-less probe table, proving the detection logic works against legacy/out-of-band doubles independent of the preventing index.
5.6 Why governance_relations is not the containment source
governance_relations (8 rows, relations in the census) holds agency→law edges (e.g. GOV-COUNCIL --owner--> NRM-LAW-37), not collection→collection containment. It is correctly untouched (Δ=0) and is not a candidate Seam-B source. The real collection-containment source is collection_registry."group", used here.
5.7 Owner / gap / conflict / containment verdict
PASS. All four behaviors proven live at broader scope over real view objects + the real ownership store + a real acyclic containment source: direct depth-0 (×2), group-anchored inherited depth-1 (×4), honest missing owners (6 collections incl. the negative-inheritance workflow_steps), gap honors inheritance (60→55), conflict prevented by index and still detectable by predicate. Nothing persisted (doc 07).