Skip to content

FLOOR-POPULATION-PROJECTION: exact identity join of every declared witness to one disposition, no new carrier - #9700

Closed
briansrls wants to merge 11 commits into
mainfrom
session/nimble-ibex-902
Closed

briansrls wants to merge 11 commits into
mainfrom
session/nimble-ibex-902

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session nimble-ibex-902.
Pushing to session/nimble-ibex-902 advances this PR.

Worker attestation

Before flipping this PR to ready for review, confirm each item:

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why (replace the TODO below).
  • Tests run: name the command (e.g. npm test, cargo test) and the result.
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.

Test plan

  • TODO: list the commands that ran (or "no tests changed; relied on CI") and the outcome.

Brian Searls and others added 11 commits August 29, 2026 17:40
…ly one disposition

The partition over the site projection was a COUNT equality — offered == routed +
declined_long + declined_fixture + declined_outside_gate + declined_cost_debt — over a
denominator that had itself already narrowed. DESIGN §5 names both halves: completeness is
an identity join, not a count equality; and a population removed before the partition is one
the partition cannot speak for.

Three changes, one seam:

1. THE UNIVERSE IS THE DECLARED POPULATION. Preparation drops modules two ways — the
   exclusion substrings, and (since the 2026-08-29 gate cut) every module the gate closure
   does not reach — and a witness declared in a dropped module was neither planned nor
   declined. It now carries a disposition row, in the authority that already existed:
   DeclinedDiscoveryExcluded { matched_substring } and DeclinedOutsideGateClosure. The
   closure arm is kept distinct from DeclinedOutsideRequiredGate because they are removed by
   different mechanisms, restored by different triggers, and differ by two orders of
   magnitude — the closure population is the subject of the §4b rung drop "Required gate
   reduced to the compiler floor", and one label over both would report it as a rounding
   error on a nearby count.

2. THE CHECK IS AN IDENTITY JOIN. FloorDispositionJoinInexact reconciles the declared
   identities against the rows they produced and names the offending identities in three
   sets, through the SAME function the terminal ledger join uses
   (reconcile_identity_population, generalized from reconcile_terminal_ledger to take
   identities rather than one seam's row type). Duplicate detection moves from the planned
   subset to the whole declared population: a duplicate whose first site declined used to
   pass unnoticed. The four decline counters are derived from the rows instead of
   accumulated beside them.

3. THE ARTIFACT CARRIES TWO AXES, NEVER FOLDED. The disposition TSV gains an outcome column
   joined from the terminal ledger through claim_disposition; an identity that never ran
   reads not_executed, which is a statement rather than a blank.

Evidence: the calibration pair is enrolled beside the terminal-ledger one — a population
that drops one identity and duplicates another, over which every count of the deleted form
is still exactly equal, and the join names both. Rung honesty: that suite is the local Rust
suite, removed from CI 2026-07-11, so the executing evidence on a push is the floor's own
run, whose announcement now carries declared= beside offered=.

Found on the way: gunbc.discovery_census claims twice in prose that a new
RequiredFloorDisposition arm must fail to compile in its wildcard-free matches.
DeclinedOutsideRequiredGate had already been added with neither match acquiring an arm and
nothing refused — its witness sits outside the gate closure, so no executing path typechecks
it. The arms are added and the claim is restated at its honest rung with its trigger.

Not built, and named as this join's next-rung triggers rather than improvised: the semantic
producer axis (no authority maps a witness to its producer) and the Rust #[ignore] roster (a
different universe with no roster authority). → docs/plans/witness-execution-closure.md

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WmatNuCFnqTdE2KoiwEcm4
# Conflicts:
#	src/v1/stage0/src/bin/claim_executor.rs
#	src/v1/stage0/src/cli_run.rs
…ons to match it

The CI auto-heal bot resolved the #9685 conflict by reimplementing the declared-population
enumeration on the producer itself — folded over preparation's FULL module index, with the
prepared closure and exclusion map classifying the returned identities. That is a better §3
answer than the split this branch carried (producer for the prepared subject, naming-hygiene
scan for the removed sources), so it is kept and mine is dropped rather than restored.

What it left describing something the code no longer does, corrected here:

- the receipt line still cited BarrenTestSidecar, a refusal the producer replaced, and said
  'offered' where the guarantee is now over every DECLARED entry;
- the site loop's own comment still said the population is 'the identities preparation
  dropped', which is the deleted design;
- the plan doc's item 1 described preparation emitting the rows.

And one consequence neither the bot nor this branch had stated: folding the producer over the
full index means its per-file refusals — misplaced test decl, barren sidecar, misplaced wire
contract, malformed live_tree_disposition — now stop the REQUIRED floor for any module under
the source roots. That is a real widening of this lane's subject. It is survivable today
(measured: zero misplaced decls, zero barren sidecars tree-wide) and the first violation
authored anywhere will red this lane rather than the one owning the file, so it is written
into the doc rather than left for that run to discover.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WmatNuCFnqTdE2KoiwEcm4
…-growth disposition (review 57430)

TWO FINDINGS, BOTH REAL, ANSWERED IN THE TREE RATHER THAN IN THE PR THREAD.

RETENTION. Folding the discovery authority over the full module index holds every source's
bytes, and the out-of-closure majority is held by nothing else — the prepared graph is the
gate closure. Leaving that on PreparedRepository restored corpus-scale retention across the
longest phase of the program, in the one lane RequiredFloorGrowthBudgetStanding records as
having no measured memory margin, where growth owes a named payment. No payment is claimed
and none is needed: the inventory is now std::mem::take'n into the fold's own local and
dropped with module_for_path the moment the rows are classified. What survives is paths,
module names and function names — never bytes.

SEED GROWTH. Measured at item grain, this change adds no hand Rust declaration: one function
is renamed (reconcile_terminal_ledger -> reconcile_identity_population, generalized so one
join serves two seams) and everything else is fields, coproduct arms and bodies of existing
items. Its disposition in gunbc.seed_growth_admission's vocabulary is ExistingSeedItemModified,
and the doc supplies that arm's payload: dag authority v2.workflow.required_floor
RequiredFloorDisposition (the two new arms land in the model, the seed realizes them), so
capability origin is ModeledCapability, not a capability originated in Rust.

WHAT THE REVIEW ASKED FOR AND THIS DELIBERATELY DOES NOT SUPPLY: authored before/after Rust
census figures. seed_growth_forward_freeze_policy_note records that hand-item and hand-LOC
deltas are functions of the diff, that an authored copy is a second representation of a fact
the diff already owns, and that a prior receipt authored exactly such figures and got them
wrong. The deriving instrument (gunbc.rust_item_host_observation) and the adjudicating join
(seed_growth_admit_change, which no required phase invokes yet) are named instead.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WmatNuCFnqTdE2KoiwEcm4
…e one section

The bot and this branch fixed the retention finding concurrently and identically in effect
(take the full inventory out of the prepared repository, drop it when the fold's rows are
classified). Theirs is kept, with the views CONSUMED into the fold's rows rather than cloned
and the duplicated drop/count pair removed.

Its hand-Rust receipt and mine were two paragraphs about one fact in one document, which is
the duplication this doc's own subject condemns. They are folded into a single section: mine
supplied the disposition vocabulary (ExistingSeedItemModified, ModeledCapability), why no
SeedGrowthJustification row is owed, and why authored census deltas are refused; theirs
supplied the payload halves I had left out — the modified item list, the owning lane
v1-hand-queue-drain, and a concrete deletion trigger. Both are required by
seed_growth_forward_freeze_policy_note; neither alone answered it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WmatNuCFnqTdE2KoiwEcm4
@briansrls
briansrls marked this pull request as ready for review August 29, 2026 23:02
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Aug 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-08-29T23:09:08.888785Z b8199b0 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@gunbai-bot

gunbai-bot Bot commented Aug 29, 2026

Copy link
Copy Markdown
Contributor

Closing: head b8199b0 is an ancestor of ab96850, the exact commit #9684 squash-merged at dd7bca7 — already on main. Auto-opened on a resurrected branch after the session archived; not unmerged work. — sent from neat-swift-219

@gunbai-bot gunbai-bot Bot closed this Aug 29, 2026
@gunbai-bot
gunbai-bot Bot deleted the session/nimble-ibex-902 branch August 29, 2026 23:07

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b8199b0aae

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +3013 to +3014
drop(module_for_path);
drop(discovery_sources);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Drop the discovery frame with the source inventory

With the default GUNBC_EVAL_MEMO enabled, calls made through producer_frame memoize full argument values, including each source's content; therefore dropping only discovery_sources does not release the newly added full-tree corpus. Because producer_frame remains in scope until run_required_floor returns, those bytes stay resident throughout the long claim-execution fold, undermining the memory-margin motivation of this change and potentially pushing the required CI lane into reclaim/OOM. Drop or drain producer_frame after parse_floor_discovery_producer_result once files owns the required strings.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant