Skip to content

Fleet acquisition census: lots, tax standing, and srv1-srv4 assemblies - #11199

Merged
briansrls merged 11 commits into
session/royal-koi-731from
session/stern-owl-22
Sep 12, 2026
Merged

briansrls merged 11 commits into
session/royal-koi-731from
session/stern-owl-22

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 12, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Join every public procurement lot (DIMM, two Spark lots from Record the contains dispatch defect, and repudiate an approval that was never granted #11182, Mt. Collins 20, Q80 62, four ALTRAD8UD boards, and eight peripheral identities) into one fleet_acquisition_ledgers population whose witness fails if the Mt. Collins lot is omitted.
  • Carry per-lot sales-tax standing without amounts: transcribed NJ UEZ, derived NJ statewide, operator-attested NY, unread marketplace tax, and unrecorded treatment. Two lots carry a NYC use-tax residual; two attested NY lots carry none.
  • Model srv1–srv4 as assemblies: four boards bind to the four-board lot; remaining components are dredge obligations, not invented purchases. The census is explicitly a floor. Do not relabel it complete because the join is large.

CI

This PR currently has no GitHub checks and will not get any while it is based on session/royal-koi-731. The witness workflow only triggers on base main. A stacked PR renders as pending, which is silence, not green. Do not infer that CI passed.

When #11182 lands, retarget with gh pr edit 11199 --repo gunb-ai/gunbc --base main. Until then the only execution evidence is local/remote gunbc runs of the three witness modules below — and those runs are incomplete relative to the required floor (a stacked base was required to avoid forking #11182's files).

Census derived

Floor, not closed. Joined acquired/received/owned = 134 across 14 lots.

Lot Qty Tax NYC residual
DIMM 64 GiB 32 unrecorded unread
Spark Micro Center 6 transcribed NJ UEZ 3.3125% owed
Spark eBay pair 2 included, jurisdiction unread unread
Mt. Collins 20 derived NJ 6.625% (corroborates the cited statute; not a statute read) owed
Q80-30 62 attested NY — operator confirmed tax was paid; still not a receipt reading, so the arm stays attested none
ALTRAD8UD-1L2T 4 attested NY — same: confirmation does not become a receipt read none
switch, 2 printers, AMS, PDU, pi, 2 coolers 1 each unrecorded unread

Could not close

  • srv1–srv4 M128 processors, chassis, PSUs, drives, memory, srv3/srv4 cooler purchases: no component receipts; operator says they must be dredged.
  • Peripherals above: identities exist; no acquisition record.
  • eBay Spark tax jurisdiction/rate; DIMM tax line.
  • Mt. Collins SKU (catalog unread); Q80/Mt. Collins unit identities (no serials).
  • Raspberry Pi exact model.

Based on #11182 (session/royal-koi-731) so Spark lots are not restated.

Test plan

  • After retarget to main: required witness lanes actually run
  • test.claim.fleet_acquisition_census_witness derives 134 and drops to 114 without Mt. Collins
  • test.claim.lot_sales_tax_witness distinguishes transcribed vs derived vs attested and refuses a repeated lot
  • test.claim.fleet_host_assembly_witness binds four boards and keeps other components unrecorded
  • No prices, card digits, invoice totals, or receipt numbers in the public diff

gunbai-bot Bot and others added 5 commits September 12, 2026 15:05
…no gate compiles with it (#11100)

* File the class: a change green in one repository breaks another that no gate compiles with it

One row under dag/gunbc/recurring_failure_mode/. INVALID STATE: a merge
admitted on a gate whose compiled closure is a strict subset of the closure
its result governs.

The specimen is gunbc#11057 (a correct public change, green on public CI)
against gunbc-private, whose CI builds against public main: eleven private
witnesses used a bare ExitFailure as their failure arm, so private_roster_main
stopped resolving ENTIRELY -- 0 PASS, not a partial failure -- and every
private PR plus private main went red at once. Repaired by hand in
gunbc-private#82. The totality is part of the class: a zero reads as
infrastructure, not as a semantic break, so the first hypothesis is "our CI is
broken" rather than "an upstream change removed a construction we depend on".

Bounded against three neighbours. NOT the same-repo jointly-incompatible class
(gunbc.plans.ci_merge_freshness, instance 1 recorded by gunbc#10984;
gunbc.plans.joint_incompatibility_claim_join, scoped by gunbc#11044): there the
deficit is FRESHNESS and one gate can compile the union, which is why a merge
queue is the ceiling; here the deficit is COVERAGE and no gate on either side
has both repositories in scope. NOT a published-API break: B pins A's main
branch, so there is no release boundary and no deprecation window. NOT the
stale-merge-base class: both sides were current.

RUNG mitigatable. CEILING argued at mechanically preventable, not asserted: the
question is decidable (compile A+B), but the invalid state stays writable, and
what stands between here and rung 3 is a COST -- doubling A's gate on a fleet
at capacity -- which is not a decidability answer. TRIGGER named as the
capability: a gate whose compiled closure includes every repository that builds
against this one, with the dependent set DISCOVERED rather than hand-listed; a
trigger naming one dependent would retire the class while a third stayed
invisible.

EVIDENCE, executed against a gunbc built from this tree:
 - GREEN: docs_projection_gate regen exits 0, writes
   docs/design-failure-modes.md (1752004 bytes) carrying the row's text.
 - RED: mutating the fifth receipt (the RUNG sentence) from its String to the
   Int 42 -- a consumed element of the List<String> that
   gunbc.recurring_failure_mode::authored folds -- refuses with a typed,
   located diagnostic at :26:5 (expected String, got Int), exits 1, and
   PRODUCES NO ARTIFACT AT ALL: with the projection deleted first, the run
   leaves docs/design-failure-modes.md absent. The text is removed, not stale.
 - RESTORED: the same regen exits 0 and is byte-identical to the first green.

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

* Rewrite the class as a split between closure and merge authority; correct the repair provenance; migrate to the join separator

Three blocking findings from quick-ibex-468, all verified against the tree
before acting on them.

1. THE BOUNDARY CONTRADICTED ITS OWN MECHANISM. The row asserted both "B's
gate compiles A+B, but it only ever runs for changes authored in B" and "no
gate on either side ever had both repositories in scope". Those cannot both
hold, and the second is both false and the weaker claim: B's gate has exactly
the right closure. The invalid state is now stated as NO GATE ELIGIBLE TO
BLOCK A'S MERGE COMPILES BOTH REPOSITORIES -- a split between two properties
a gate normally holds together, (i) compiling the closure a merge governs and
(ii) being able to refuse that merge. In a one-repository lane they are the
same gate and the split is invisible.

That is not a wording fix; it re-derives the ceiling and the trigger. The
ceiling previously argued about the cost of building a second full compile of
B inside A's gate. Under the corrected statement the compile ALREADY EXISTS
AND ALREADY RUNS, so the repair is to BIND it to A's merge admission -- runner
time on an existing job, not a new one. Rung 3 is still not claimed, and now
for the right reason: not cost, but that the binding is ENROLLMENT and the
invalid state stays writable. The trigger gains its missing conjunct and is
now three: refusal authority over this repository's merges, closure covering
every dependent, and a DISCOVERED dependent set -- each separately able to be
satisfied while the class stays live.

2. THE REPAIR PROVENANCE WAS WRONG. The row cited gunbc-private#82 as the
repair; #82 CLOSED UNMERGED at 21:03:18Z. The repair that landed is
gunbc-private#81 (1b7f87e88f), merged 20:55:06Z -- eight minutes earlier. A
failure-mode authority about merges was citing an unmerged branch as the event
that restored main. Corrected with the genealogy kept rather than the number
swapped, because two lanes independently building the same repair is itself a
fact about this class: with no signal naming the origin, every observer starts
from the symptom and duplicated repair effort is the default. The row now says
so, and says that its own mis-citation was produced by the same condition.

3. #11047 CHANGED THE RENDERING CONTRACT AND THIS FILE MISSED IT.
RecurringFailureMode.authored is now join(r.receipts, " "); the trailing-space
convention is deleted. All eleven receipts still carried trailing spaces, which
would have rendered TWO spaces at every boundary. Migrated: 0 trailing-space
receipts, and 0 double-spaces in the rendered row, measured against a
pre-existing row on the same page as control.

Note the shape, because it is this row's own class applied to this row: the
file is additive and imports nothing anyone changed, and was still incompatible
-- the coupling is the RENDERER, not the import graph. Judging it safe because
"a single additive file no module imports" is the same closure error the class
describes.

EVIDENCE RE-RUN ON A TREE CONTAINING #11047 (the prior evidence was real and
proved the row against a producer that no longer exists):
 - GREEN: regen exit 0, writes docs/design-failure-modes.md (1786641 bytes);
   corrected invalid-state text and #81 provenance both render; 0 double-spaces.
 - RED: fifth receipt -> Int 42 refuses at :30:5 (expected String, got Int),
   exit 1, and with the projection deleted first NO ARTIFACT IS PRODUCED.
 - RESTORED: exit 0, byte-identical to the green.

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

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ment-only enrolment gate (#11183)

* File two failure-mode classes: admitted reclaim billed by first touch, and an increment-only enrolment gate.

Both classes were measured today; the rows carry the uncertainties rather than rounding them into coverage.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Close the wrapping parenthesis that spanned receipt bullets in both new failure-mode rows.

The list balanced as data; the combined projection renders one receipt per bullet, so the opener and closer became orphaned across bullets.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Completed purchases now have lots and typed tax arms (transcribed, derived, attested, unread) without publishing amounts, and srv1-srv4 are assemblies with dredge obligations rather than invented component receipts.

Co-authored-by: Cursor <cursoragent@cursor.com>
A product SalesTaxRateMillionthsOfUnity type was a third dimensionless-ratio nickname; coverage by equal list lengths still admitted swapped lots. Rates now inhabit Measure<Dimensionless, Micro, Nat>, and lot_tax_covers_ledgers joins ledger identities to tax rows.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 64736 (dashboard /api/reviews/64736/artifacts/stdout.log) on 03cdbde64bc.

Sales-tax rate carrier. Deleted SalesTaxRateMillionthsOfUnity. Collection and residual rates are now Measure<Dimensionless, Micro, Nat> from std.measure, constructed by sales_tax_rate(count:). Extdeps still publish the cited Nat millionths; the product layer wraps them at use. That is the Micro scale of the existing dimensionless authority, not a third ratio nickname.

Tax coverage join. fleet_tax_join_covers_every_ledger no longer compares list lengths. lot_tax_covers_ledgers walks ledger identities against tax rows and refuses LedgerMissingTax, TaxWithoutLedger, and repeats. w_equal_length_is_not_tax_coverage keeps three rows on both sides, drops the marketplace ledger, and adds an orphan unrecorded lot — lengths match, join does not.

… it.

A product sales_tax_rate constructor and bare Nat millionths rows were a third dimensionless-ratio nickname. The Micro-scale carrier now sits beside Percent/BasisPoint; NJ and NYC rates are that carrier, not a unit-in-the-identifier Nat.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 64757 (dashboard /api/reviews/64757/artifacts/stdout.log) on b37ed339988.

Micro-scaled ratio home. Deleted product.lot_sales_tax sales_tax_rate. std.measure now declares PartsPerMillion = Measure<Dimensionless, Micro, Nat> beside percent/basis_point, with parts_per_million / parts_per_million_count. extdeps.units.dimensionless carries parts_per_million_unity_count (1e6) as the ISO factor. Lot tax fields consume PartsPerMillion; they do not mint a product constructor.

Statute rows. NJ 6.625% / UEZ 3.3125% and NYC 8.875% are PartsPerMillion data (nj_statewide_sales_tax_rate, nj_uez_reduced_sales_tax_rate, nyc_combined_sales_tax_rate), not Nat with millionths in the identifier. The published percent remains in comments; Micro is the Nat encoding Percent cannot carry.

…er acquired.

Census already recorded Dynatron W1 purchases for srv3/srv4; the assembly had marked those components unrecorded, and the shared tax obligation said no acquisition existed. Coolers now bind the census lots, unread tax copy matches the DIMM row, and PartsPerMillion consumes the dimensionless ppm factor.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 64776 (dashboard /api/reviews/64776/artifacts/stdout.log) on the current head.

Cooler meaning fork. cooler_srv3 / cooler_srv4 now use lot_component(..., lot: cooler_srv*_lot_identity) against the census Dynatron W1 lots, same shape as the four-board lot. every_recorded_component_lot_is_admitted admits those lots; cooler_components_bound_to_their_lots requires the two host-specific bindings.

Tax unreadness copy. Replaced no_acquisition_record with tax_treatment_unread: tax/receipt unread, not absence of the ProcurementLot. Switch, printers, AMS, PDU, Pi, and cooler rows keep SalesTaxTreatmentUnrecorded.

ppm factor. std.measure imports parts_per_million_unity_count and exposes parts_per_million_scale_million. The rate witness consumes it as the unity scale the NJ/NYC counts sit under.

… identity.

first_ordinal was the current ledger length, so a duplicate of index 0 reported 5,5. Coverage and assembly checks also used length/count literals; they now join named lots, components, and containments.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 64792 (dashboard /api/reviews/64792/artifacts/stdout.log) on the current head.

Located duplicate. admit_lot_tax_population now scans seen with LotTaxOrdinalScan and reports the hit's next_ordinal as first_ordinal. A duplicate of lot_mt_collins at index 0 in a 5-row fixture is first_ordinal: 0, ledger_ordinal: 5. LotTaxJoinRepeatedLot takes the same pair.

Count oracles. fleet_tax_join_covers_every_ledger joins residual / attested / unread lots against named identity lists, not == 2 / == 10. Census witnesses drop length() == 14 and the transcribed 134/114; quantities sum from the lots, omit uses mt_collins_twenty_lot.quantity_acquired. Assembly witnesses drop length() == 26 / 24 in favor of assembly_covers_component_roster and assembly_containments_join, plus per-identity board and cooler bindings.

Remote compile of fleet_tax_join_covers_every_ledger returned true (host still refuses a bare Bool as ProcessExit).

…s annotations.

Those NonEmptyStr declarations had no fold and were commentary wearing semantic data. The cited effective date and NYC composition stay on the rate rows as //, which is the quarantine §4c requires.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 64813 (dashboard /api/reviews/64813/artifacts/stdout.log) on the current head.

Deleted nj_statewide_rate_effective and nyc_combined_rate_composition. Nothing outside those files read them. The NJ 2018-01-01 / N.J.S.A. 54:32B-3 fact is on the statewide rate as //. NYC's 4 + 4.5 + 0.375 composition was already on nyc_combined_sales_tax_rate; the extra NonEmptyStr row was a second copy. Typed component-rate rows without a consumer would still be dangling.

Tax and assembly each minted contain/cover and six predicate folds that differed only by equality or standing. Those now consume list_any, list_member, list_cover, list_count_by, and list_select_by.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 64823 (dashboard /api/reviews/64823/artifacts/stdout.log) on the current head.

Membership / cover. std.list now owns list_any, list_member, and list_cover under a caller-supplied equality. product.lot_sales_tax identities_contain / lot_identities_cover / tax_covers_lot and gunbc.fleet_host_assembly roster cover consume those; they do not re-fold acc || eq.

Predicate family. list_count_by / list_select_by dissolve the six residual/attested/unread count and lot folds. Assembly list_any also replaces the board/processor presence folds in the host-assembly witness.

Remote compile of fleet_tax_join_covers_every_ledger still returns true.

…n by identity.

list_any/select_by/count_by re-minted substrate methods; keep only caller-eq membership/cover. Omit Mt. Collins by lot identity, and refuse assembly cover when a rostered component is dropped.

Co-authored-by: Cursor <cursoragent@cursor.com>
@briansrls
briansrls merged commit 2320a1b into session/royal-koi-731 Sep 12, 2026
@briansrls
briansrls deleted the session/stern-owl-22 branch September 12, 2026 23:49
@briansrls
briansrls restored the session/stern-owl-22 branch September 12, 2026 23:55
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