Skip to content

Q1: cold auth verify and login deleted; 1.5.5's 401/4003-4009 parity; kernel-identity CredentialCache deleted (Q134 closed) - #532

Merged
MattJackson merged 71 commits into
predevfrom
p2-cold-auth
Oct 13, 2026
Merged

MattJackson merged 71 commits into
predevfrom
p2-cold-auth

Conversation

@MattJackson

@MattJackson MattJackson commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

Q1 (ARCHITECT rulings: cold auth verify AND login deleted right after p4-oidc-repin; Q134; the 2026-10-06 cold-auth rulings 1–6). #486 (p4-oidc-repin) is merged; this branch carries predev 70776f1 (merge 47ea84c, every conflicted hunk checked against both parents).

What goes

  • Loader: DynAuth and auth.rs, ColdAuth, PluginRegistry::{open_auth, open_login, auth_row_is_cold, image}, the linked Boundary entry, the raw JSON-lane load (RawPlugin, Image, wire_up*, free_guarded, reclaim_failed_open), hostlog.rs, login_tests.rs. A dropped-in auth library stating no door is refused naming the rebuild: "it speaks the 1.5.5 JSON auth contract, which this host does not load — rebuild the plugin against the 1.6.0 SDK" (kind_refusal, one mechanism for every kind).
  • Contract: the cold auth wire (abi/cold/auth.rs) and its SDK glue (export_login_plugin!, dispatch_auth*, AuthHandle). abi/cold 1138 -> 272 lines (abi-freeze lowered). LoginCall::faulted / Verifying::faulted (provided methods) let the host tell a plugin FAULT from a decline.
  • Kernel: LoginPlugin::Cold and the core-run login hop loop (execute_hop, vet_hop_url, sanitize_hop_header, MAX_HOPS, the offload), the cold-row branches in the data and admin chains, the kernel verdict cache and cold offload (auth_cache.rs). The inbound flush sums the doors' refresh().
  • kernel-identity: CredentialCache (production passed None) with its digest types, the cache parameter of the chain walk and Auth::resolve, the root's AuthBindings::cache (ruling 6).

What answers now (1.5.5 parity)

  • BUSBAR-4003 on a door login FAULT, in 1.5.5's words (ruling 1); 4005/4006/4008/4009 on the door path's admission budgets and faults, 1.5.5's format strings, warn-once-then-debug; each with a RED arm.
  • Admin and operator doors answer 1.5.5's 401 under verify overload or no verdict; the admin 503 path and AdminUnavailable are gone; Q134 closed in docs/design/1.6.0-QUESTIONS.md (ruling 4).
  • No auth axis at all: a hosted-login method is refused in 1.5.5's words, "no kind: auth plugin answers to ''"; the registry's refusal stays internal. RED arm a_login_method_with_no_auth_axis_is_refused_in_1_5_5_words (ruling 2).
  • The client secret is lent to the plugin at open and rides nothing the host makes (the_client_secret_is_lent_at_open_and_rides_nothing_the_host_makes).

Deleted tests and their new homes (rule 15.3, ruling 5)

Plugin repos at the revs pinned in Cargo.toml: export-otlp b10cd35, auth-oidc 0a7b7a5, export-file c0a2d69. "PORTED" tests are new in this PR.

Deleted test Property New home
test_validate_otlp_endpoint_error_masks_userinfo a refused endpoint's error never carries the URL's userinfo PORTED only_an_http_or_https_url_names_a_collector (crates/busbar-core-connector/src/tests/collector_class_tests.rs:287); otlp export-otlp/src/tests.rs:264, :175
test_validate_otlp_endpoint_accepts_none_and_external no endpoint is valid; https external collector accepted PORTED a_collector_is_reached_in_plaintext_on_loopback_and_over_a_secure_connection_elsewhere (collector_class_tests.rs:135); the None half: no url, no instance (otlp tests.rs:150)
test_validate_otlp_endpoint_allows_loopback_collectors http/https to localhost, 127.0.0.1, [::1], *.localhost accepted PORTED collector_class_tests.rs:135
otlp_resolve_check_allows_a_name_resolving_to_loopback a name resolving to loopback is a collector PORTED collector_class_tests.rs:135
otlp_resolve_check_skips_ip_literals a literal is judged on its text, never resolved every_egress_class_is_judged_by_the_one_guard (crates/busbar-core-connector/src/tests/process_tests.rs:92), the_name_arm_decides_before_resolution (guard_tests.rs:160)
otlp_resolved_and_literal_verdicts_agree one address, one verdict, named or written PORTED an_address_is_judged_the_same_named_or_written (collector_class_tests.rs:247)
otlp_resolve_check_allows_a_name_that_does_not_resolve a DNS failure is not a refusal PORTED in #517 (A1): a_name_that_does_not_resolve_fails_the_exchange_and_is_never_a_refusal (crates/busbar-core-connector/src/tests/name_dial_tests.rs)
test_validate_otlp_endpoint_rejects_cloud_metadata_and_internal metadata and internal targets refused for a collector metadata PORTED cloud_metadata_never_reaches_a_collector_in_any_spelling (collector_class_tests.rs:185); private https collectors are allowed by the loopback-allowed class (ruling CRATES-14, guard_tests.rs:365) — ruled (A2): refused by the guard by default, reached when allowlisted, a_private_collector_is_refused_by_default_and_reached_when_allowlisted (#517); plaintext to them refused (collector_class_tests.rs:135, connector_tests.rs:749)
test_validate_otlp_endpoint_rejects_alternate_encoded_internal alternate IPv4 spellings of internal targets refused; loopback spellings allowed PORTED an_alternate_ipv4_spelling_never_reaches_a_collector (collector_class_tests.rs:223); alternate loopback spellings reach a collector as in 1.5.5, an_alternate_ipv4_spelling_of_loopback_reaches_a_collector_as_in_1_5_5 (#517, A3)
test_validate_otlp_endpoint_accepts_uppercase_scheme HTTP:///HTTPS:// accepted; case never bypasses the guard no-bypass half PORTED collector_class_tests.rs:185; acceptance half: only_an_http_or_https_url_names_a_collector accepts HTTP:///HTTPS:// as 1.5.5 did (#517, A3)
test_validate_otlp_endpoint_rejects_bad_scheme only http/https PORTED collector_class_tests.rs:287
test_validate_otlp_endpoint_requires_https_for_remote_collector plaintext only to loopback PORTED collector_class_tests.rs:135; loopback_allowed_refuses_plaintext_off_loopback (connector_tests.rs:749)
test_validate_otlp_endpoint_rejects_trailing_dot_internal_hosts trailing-dot metadata refused; trailing-dot loopback allowed PORTED collector_class_tests.rs:185, :135
the_egress_carrier_refuses_what_the_host_policy_refuses open web refuses plaintext, loopback, metadata before any dial http_to_a_public_host_under_open_web_is_refused (connector_tests.rs:717), a_private_address_is_refused_for_providers_and_request_data_unless_allowlisted (process_tests.rs:108), a_metadata_target_is_refused_before_any_dial (connector_tests.rs:136, :271); also PORTED in collector_class_tests.rs:135
the_collector_policy_carries_octets_to_a_loopback_collector_and_nothing_else binary body reaches a loopback collector exactly; plaintext-remote and metadata refused delivery: the_shipped_binary_posts_its_spans_to_an_otlp_collector (crates/busbar/tests/export_otlp_delivers_spans.rs:136, bytes at :223–230); refusals PORTED collector_class_tests.rs:135, :185; connector_tests.rs:749, :717
a_carrier_that_implements_no_policy_but_the_open_web_refuses_the_rest a carrier lacking a policy refuses it mechanism deleted (one connector serves every class): unknown class refused dest_judge_tests.rs:226; bytes exact compose_tests.rs:76, wire_tests.rs:46; verdict without carrying process_tests.rs:190; refused target never on the wire crates/plugin-loader/src/tests/export_conformance_tests.rs:1462 (RED arm)
a_destination_is_a_declared_key_the_operator_set only a declared key the operator set is a destination disk_append_writes_only_to_a_granted_bound_destination (crates/plugin-loader/src/tests/host_services_tests.rs:1387), export_conformance_tests.rs:1377 (RED arm)
a_write_appends_and_rotates_first_at_its_limit_keeping_its_archives append; rotate by rename at the limit; keep N archives crates/busbar-kernel/src/tests/host_disk_tests.rs:33, :72, :91; crates/plugin-loader/src/tests/host_tests.rs:19; export_conformance_tests.rs:1377
an_unopenable_destination_is_a_reported_failure an unopenable path is a reported open failure an_unopenable_path_fails_the_open_step (host_disk_tests.rs:58)
execute_hop_refuses_non_allowlisted_host the core never sends the client secret to an unconfigured host the core sends no secret: lent at open (crates/busbar-kernel/src/auth/tests/token_tests.rs:1656), no core exchange (token_tests.rs:1462); token need is open-web (connector_tests.rs:717, process_tests.rs:108); the token need is loopback-allowed in GetBusbar/busbar-auth-oidc#25 (A4); its busbar re-pin is held for an ARCHITECT call (a loopback-allowed need is granted to first-party plugins only, so a third-party oidc build would be refused at scan)
execute_hop_refuses_a_crlf_injected_header CR/LF header fails the exchange before sending a_pseudo_field_in_a_request_is_refused (crates/busbar-contract/src/abi/sdk/tests/exchange_tests.rs:397)
sanitize_hop_header_rejects_crlf_and_hop_control CR/LF/NUL and Host/Content-Length/Transfer-Encoding refused CR/LF as above; Host cannot move the dial (dest_judge_tests.rs:238); NUL and Content-Length/Transfer-Encoding: a_head_carrying_nul_or_its_own_framing_is_refused_before_any_dial (#517, A5)
execute_hop_does_not_follow_redirect a 302 is the answer, never followed PORTED an_answer_naming_another_place_is_handed_up_and_never_dialled (connector_tests.rs:575)
execute_hop_times_out_on_a_hanging_endpoint a hanging endpoint fails at its timeout a_silent_far_end_is_held_to_the_framers_deadline (compose_tests.rs:162), :196; framer_tests.rs:65; oidc fetch_tests.rs:103
vet_hop_url_enforces_https_allowlist_and_blocks_metadata https for public hosts; metadata refused even if allowlisted oidc fetch_tests.rs:145; connector_tests.rs:717; endpoint_tests.rs:17, :85, :103; guard_tests.rs:125
hop_loop_runs_at_most_max_hops_times bounded host work per callback the host runs no exchange: one complete_login per callback (token_tests.rs:1462, :1492)
client_secret_is_core_injected_only secret fills the placeholder; never in cookie or page oidc fetch_tests.rs:95, :103, conformance.rs:274; the_client_secret_is_lent_at_open_and_rides_nothing_the_host_makes (token_tests.rs:1656)
the_secret_placeholder_is_dropped_for_a_public_client_and_filled_for_a_confidential_one public client sends no secret; confidential once oidc fetch_tests.rs:95, :103
a_door_less_json_contract_library_is_refused_naming_the_rebuild (new on predev with #486), its kind-gate leg only the JSON lane's load_image kind gate refuses a door-less 1.5.5 library, naming the rebuild that gate is deleted with the JSON lane: a library now loads only through its door. The property is still proven by (1) the same test's vet and inventory legs (crates/plugin-loader/src/tests/lib_tests.rs:249): the door-less json_contract_auth library is refused, naming the missing busbar_plugin_door and the rebuild; (2) the boot path, a_1_5_5_json_contract_plugin_is_refused_at_boot_naming_the_rebuild (crates/plugin-loader/src/tests/registry_tests.rs:44): a signed 1.5.5 artifact of each kind (store, auth, hook, export) is refused at the scan, naming file, kind, version and the rebuild; (3) the one load path, red_both_origins_refuse_the_same_way (crates/plugin-loader/src/tests/dispatch_tests.rs:1012): a door-less library under a current manifest is LoadError::NoDoor, whose text names the 1.5.5 JSON contract and the rebuild (crates/plugin-loader/src/dispatch/load.rs:299)

Other deleted tests had the deleted mechanism as their only subject (the cold auth wire codec and SDK login dispatch, the raw JSON-lane loader's buffer/handle guards, the kernel and kernel-identity verdict caches); tests that only passed a cache keep every assertion.

A1–A5 were ruled by the ARCHITECT and are fixed in #517 (connector parity: a DNS failure is a failed exchange, private collectors under the guard, 1.5.5's loopback spellings and scheme case, head hygiene) and GetBusbar/busbar-auth-oidc#25 (the token need is loopback-allowed; its busbar re-pin is held, see above). The "PORTED" connector tests above (collector_class_tests.rs, an_answer_naming_another_place_is_handed_up_and_never_dialled) live in #517, corrected there to 1.5.5's verdicts.

design-bindings PB-35: predev's #484 cited four kernel verdict-cache tests in PB-35. This PR deletes those tests along with the cache they test, so the regenerated ledger drops the citations: verdict_rules_and_expiry, bounded_eviction, module_partitions_and_flush and an_unauthenticated_chain_admits_nothing_to_the_cache.

PB-35 still has live proofs:

  • the oracle cell http.crosscut|bearer-and-x-api-key;
  • the chain tests in crates/busbar-kernel/src/auth/tests/tests.rs: test_empty_chain_is_open_front_door :308, test_nonempty_chain_fails_closed_on_all_pass :221, test_keys_in_chain_sets_flag_not_module :327, test_chain_identifies_with_module_and_principal :201;
  • the carrier tests in the same file at :545, :597 and :625;
  • test_admin_v1_credential_cache_and_flush_endpoint (crates/busbar-core-admin/src/tests/tests.rs:1522): the plugins' caches are flushed through the admin endpoint;
  • NEW every_request_is_verified_by_the_door_and_the_kernel_caches_no_verdict (crates/busbar-kernel/src/auth/tests/tests.rs). It covers the behaviour after Q1: a door that states FACT_CACHEABLE is verified once per request, and its second answer (a revocation) decides the second request. No kernel cache answers for it.
    • RED run on Latchkey, job cli-9ce5e66d-bc6d-4402-a918-30806c266df7. A local-only mutation, never committed, makes external_admin_module cache a FACT_CACHEABLE door's verdict per credential. On that mutation the test fails: assertion left == right failed: the second request is the door's second answer, never a cached Identified (left Identified { module: "ext-door", .. }, right (Denied, None)). Without the mutation it passes.

Proof

Latchkey (large, debug) on the exact tree 47ea84c (a git bundle with the tags and origin/predev):

  • fmt is clean. Workspace clippy with -D warnings is clean; busbar-auth-oauth is excluded because Latchkey strips its key fixture.
  • Every touched crate's tests pass, unfiltered: busbar-contract, busbar-kernel-identity, busbar-plugin-loader and busbar-core-admin with no feature flags, busbar-kernel under test-support.
  • cargo test -p busbar --no-fail-fast passes 59 test binaries. The only failure is ledger_identity's shipped-binary test: bin/oracle cannot clone its pinned checkout on the runner. It fails the same way on the pre-merge Q1 base.
  • These gates are green: design-bindings, plane-purity, plane-purity-strict, config-schema, abi-freeze, one-memory-abi, blocking-ffi and secret-hygiene. cargo xtask selftest passes for each gate whose source or ledger this PR changes.
  • kind-isolation and kind-isolation-ship were measured locally with git history, against predev 70776f1. No figure rose. :deps is 3 and :test-deps is 5, both equal to predev. The runner's extra no-base finding comes from the bundle, not from this PR.

# Conflicts:
#	Cargo.toml
#	crates/plugin-loader/Cargo.toml
#	crates/plugin-loader/src/lib.rs
#	crates/plugin-loader/src/tests/auth_conformance_tests.rs
…ynAuth, ColdAuth, the registry's cold openers and Boundary rows, the raw JSON-lane load, the cold auth wire and its SDK glue); the kernel half in progress
…ore-run hop loop, the cold-row branches); the hosted login and chain open every auth row on its door
# Conflicts:
#	crates/plugin-loader/src/lib.rs
#	crates/plugin-loader/src/tests/lib_tests.rs
…p tests deleted with the cold login loop (the plugin makes its own exchange on the door), ledger regenerated
…d method, false by default); the loader's begin and complete steps set it from the dispatcher's outcome, the short re-call included
…ges the oidc library once per call (the scenarios raced on one file)
…declining plugin says nothing); the client secret is lent at open and rides nothing the host makes; the kernel's verdict cache and cold offload deleted with the cold lane (inbound flush sums the doors' refresh)
…thod, false by default); the loader's submitted verify sets it from the dispatcher's outcome, the short re-call included
…5's words (warn once, then debug) and deny; an unjudged admin verify is 1.5.5's 401
…e and AdminUnavailable retired; the operator door and every admin door answer 1.5.5's 401 under verify overload); the QUESTIONS row records the close
…h` plugin answers to '<module>'); the registry's refusal stays internal; RED arm pins the text
…ache.rs and its tests, the cache parameter of the chain walk and Auth::resolve, the root's AuthBindings::cache, the sha256 feature; tests that only passed a cache keep every assertion
…oot OTLP policy and the cold carrier (loopback plaintext, secure elsewhere, metadata in every spelling, alternate IPv4, one verdict named or written, http/https only) and the deleted login hop's no-redirect rule
# Conflicts:
#	crates/busbar/tests/mcp_stdio_serve.rs
#	crates/plugin-loader/src/tests/both_ways.rs
# Conflicts:
#	crates/busbar-kernel/src/appbuild.rs
#	crates/busbar-kernel/src/auth/mod.rs
#	crates/busbar-kernel/src/auth/tests/tests.rs
#	crates/busbar-kernel/src/preflight.rs
#	crates/busbar-kernel/src/router.rs
#	crates/plugin-loader/build.rs
#	crates/plugin-loader/src/lib.rs
#	crates/plugin-loader/src/registry.rs
#	crates/plugin-loader/src/tests/lib_tests.rs
#	docs/design/1.6.0-QUESTIONS.md
@MattJackson
MattJackson enabled auto-merge October 7, 2026 09:00
@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

promote into predev: DENY @5d120324d: 16 failing test row(s), 0 DENY row(s)

Failing tests (16)

crate test step first panic
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:root-test-harness
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:timing
`` test rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:timing
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:core-duplex-ws
`` test rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:core-duplex-ws
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:oauth2-test-support
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs build:clippy
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:admin-test-support
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:no-default-features
`` test rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:no-default-features
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:openapi-schema
`` test rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:openapi-schema
`` nextest rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:workspace
`` check rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs build:workspace-compile
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:loader-pack
`` clippy rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs test:contract-test-seal
Denied because (12)
  • shard 1/4: gate:test:core-duplex-ws: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs, test: rustc error[E0061]: this function takes 6 arguments but 5 arguments were suppl
  • shard 1/4: gate:test:oauth2-test-support: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs)
  • shard 1/4: gate:test:root-test-harness: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs)
  • shard 1/4: gate:test:timing: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs, test: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ cr
  • shard 2/4: gate:build:clippy: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs)
  • shard 2/4: gate:test:admin-test-support: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs)
  • shard 2/4: gate:test:no-default-features: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs, test: rustc error[E0061]: this function takes 6 arguments but 5 arguments were
  • shard 2/4: gate:test:openapi-schema: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs, test: rustc error[E0061]: this function takes 6 arguments but 5 arguments were suppl
  • shard 3/4: gate:test:workspace: green at base, red now (nextest: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs)
  • shard 4/4: gate:build:workspace-compile: green at base, red now (check: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs)
  • shard 4/4: gate:test:contract-test-seal: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs)
  • shard 4/4: gate:test:loader-pack: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs)

Judged against base 350e107c6: 12 new red, 0 worse, 6 standing (excused).

New reds: gate:test:core-duplex-ws: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs, test: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:test:oauth2-test-support: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:test:root-test-harness: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:test:timing: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs, test: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:build:clippy: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:test:admin-test-support: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:test:no-default-features: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs, test: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:test:openapi-schema: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs, test: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:test:workspace: green at base, red now (nextest: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:build:workspace-compile: green at base, red now (check: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:test:contract-test-seal: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs), gate:test:loader-pack: green at base, red now (clippy: rustc error[E0061]: this function takes 6 arguments but 5 arguments were supplied @ crates/busbar-kernel/src/auth/tests/acceptance_1_5_5_tests.rs)

Already red on predev, not this PR's: 14
gate row detail
test:xtask-selftest ::xtask selftest kind-isolation
test:xtask-selftest ::xtask selftest no-deferral-strict-done
test:xtask-selftest ::xtask selftest plane-purity-strict
test:xtask-selftest ::xtask selftest unconstructed
test:xtask-selftest ::xtask selftest structure-lint
test:xtask-selftest ::xtask selftest plane-transport-neutrality
construction one-pick-site 3 production call site(s) of 'pick_among(' (ceiling 2): crates/busbar-kernel-egress/src/walk.rs:358; crates/busbar-llm/src/engine/exhaustion/fallback.rs:120; crates/busbar-llm/src/engine/pipeline.rs:8
kind-isolation kind-isolation:deps 3 finding(s), 92 shipped edge instance(s) over 29 class(es), 92 declaration(s); 55 '[[dep]]' row(s), 0 question(s): unlisted-dep-edge legacy -> plane busbar-llm -> busbar-plane-llm is a shipped edge w
kind-isolation-ship kind-isolation:deps 8 finding(s) over 92 shipped edge(s): ship-edge kernel -> store busbar-kernel -> busbar-store-memory is 'not-allowed': the architecture grants no kernel -> store edge, and the ship criterion is the ar
kind-isolation-ship kind-isolation:test-deps 5 finding(s) over 31 test edge(s): ship-edge cleanliness -> export busbar-core-admin -> busbar-export-prometheus is 'not-allowed': the architecture grants no cleanliness -> export edge, and the ship c
kind-isolation-ship kind-isolation:faces 2 finding(s) over 40 crate(s): foreign-entry crates/busbar busbar is kind 'root' and implements 'Transport' 1 time(s) in shipped source — the entry face of kind 'transport'. A trait implementation is
kind-isolation-ship kind-isolation:legacy-drain 3 finding(s): transitional-live qa/kind-isolation.toml 'busbar-a2a -> busbar-core-admin' (legacy drain: the retiring A2A engine's tests drive the admin surface that drained into the cleanliness tier)
ship-ready ship-ready:ship-twin 'kind-isolation-ship' is not green: kind-isolation:deps (a dependency the architecture does not grant is still in the graph); kind-isolation:test-deps (a dependency the architecture does not grant is
structure-lint structure-lint:plane-dup:unledgered 22 finding(s): PLANE-DUPLICATE (module): 'config.rs' — a2a:crates/busbar-a2a/src/a2a/config.rs decisions:crates/busbar-plane-decisions/src/config.rs voice:crates/busbar-voice/src/config.rs (the ledger

tests passed: 28630, failed: 0. Run: https://github.com/GetBusbar/busbar/actions/runs/38349969892 . Artifact verdict-5d120324d142c965d15e45eb714a1baa15c71da6 (failures.json, junit.xml, raw.log; 90 days).

@MattJackson
MattJackson added this pull request to the merge queue Oct 7, 2026
@MattJackson
MattJackson removed this pull request from the merge queue due to a manual request Oct 7, 2026
…ledger regenerated (cargo xtask gate design-bindings --write) over both sides
@MattJackson
MattJackson enabled auto-merge October 7, 2026 11:59
@MattJackson
MattJackson added this pull request to the merge queue Oct 7, 2026
…ed zero law0 rows

The cold auth lane's deletion (contract abi/cold/auth.rs, plugin-loader auth.rs and hostlog.rs)
takes three non-test files out of crates/: the population floor 941 -> 938 (blocking-ffi,
response-header, settings-leak), the tracing walk 971 -> 968, and no-deferral discovery
932 -> 931. Each floor is a ratchet pinned at the measured count, and these are reviewed
removals, not a scan that went blind.

The two new [[law0]] rows for busbar-kernel-identity (auth, instance:secret) at count 0 armed
the kind-isolation:law0 row on this candidate, which is red on predev by design (standing
busbar / plugin-loader rises). A neutral cell at 0 with no row is already held at 0 (any hit
is law0-new), so the rows judged nothing; dropping them leaves the gate's verdict unchanged and
the ledger edits to lowerings only.
@MattJackson MattJackson added fixing and removed fixing labels Oct 11, 2026
@MattJackson

Copy link
Copy Markdown
Collaborator Author

Claim released by busbar-release: the fixing label had no live agent behind it: no push and no new claim for 18h18m (the longest agent's hard timeout is 2h00m), so it is off and the PR is back in the pipeline.

- plugin-loader lib.rs: the raw JSON lane stays deleted. predev's #745 worker asserts are kept in
  dlopen_on_worker, dlclose_on_worker and ffi_guard_confined; its set_log_sink assert went with
  wire_up and hostlog.
- xtask population FLOOR: 938, re-measured on the merged tree (predev 941 less the three cold-auth
  files), with predev's one_file_short plant note.
@MattJackson
MattJackson added this pull request to the merge queue Oct 12, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 12, 2026
MattJackson added a commit that referenced this pull request Oct 12, 2026
…-auth-replay-strip; the data-plane walk carries this branch's replay claim and strips beside #532's overloaded verifier handed back apart (Q134 503)
MattJackson added a commit that referenced this pull request Oct 12, 2026
…, and every line an auth names is struck before a plane sees the request

THE DESIGN §6, Inbound verify: "a verified identity may carry a replay_key and replay_ttl_secs, and
the verify caller claims the record ... already TAKEN is 401". §6.4: the auth names its credential
lines and query keys, and they are stripped so the plane never sees a credential.

Root cause: every reader of a verify answer reduced it to a bare verdict. The data-plane walk's
chain_verdict_of and the operator credential's judgement kept Verified::Identity's principal and
dropped its replay claim and VerifyAnswer.strips, so nothing in the kernel ever claimed an
auth-replay record (a signed message replayed inside its ttl was admitted again) and a header or
query key a plugin auth named crossed to the plane.

- busbar-kernel-identity operator::Judgement is a struct: the outcome (a verdict, or the admin
  503's AdminUnavailable), the identity's replay claim and the named lines, whatever the verdict.
- busbar-kernel auth:
  - the data-plane walk reads each position as a Position (verdict, an overloaded verifier still
    handed back apart for Q134's 503, the claim, the lines); it collects every position's lines;
  - an identity with a replay claim is admitted only once the walk wins <provider>/<key> in
    governance's record store (kind auth-replay, standing ttl_secs). Fail-closed: a claim already
    taken, a store that cannot answer, and no governance each deny;
  - the signed pre-step's verifier claims its identity's replay the same way, under its module;
  - the admin chain carries the identifying module's claim and every module's lines out; the
    admin door (the middleware and the sync probe the root's admin loop uses) wins the claim
    before it admits; the dry run claims nothing;
  - the middleware joins named field lines to the consumed credentials (stripped at every
    handoff) and strikes named query keys from the URI and OriginalUri, once.

Based on predev: the defect and the fix are independent of #532's cold-auth deletion; predev's
admin 503 (AdminUnavailable) and Q134's data-plane 503 are kept as they are.

REDs (claim and strike disabled, the judgement dropping both):
the_replay_claim_and_the_named_lines_ride_the_judgement,
a_replayed_signed_message_inside_its_ttl_is_denied,
a_replayed_signed_delivery_is_answered_401_the_second_time,
an_auth_named_header_and_query_key_never_reach_the_plane,
an_admin_identity_replayed_is_denied_and_its_named_lines_ride_out.
Brings predev 561c69a (FLIP-LLM, #464). Conflicts: the population and tracing floors, re-measured on the merged tree at 946 and 976 (predev's 949/979 less the cold auth lane's three non-test files), each note keeping FLIP-LLM's raise and this branch's deletion.
Brings predev 872b6ae, with #681 (sec-auth-replay-strip). Conflicts:
- kernel-identity operator.rs and its tests, kernel auth/mod.rs and its tests: #681 named its own resolution over this branch, lane-sec-auth-replay-strip-on-532 (a8c2772), whose versions of these four files are #532 and #681 merged; #681 landed with those files unchanged and this branch's are unchanged since, so they are taken whole.
- population 945 and tracing 975: predev's lines, re-pinned by this branch's three deleted non-test files.
Brings predev 86771f6. Conflict: qa/kind-isolation.toml, busbar-plugin-loader x instance:secret: predev's row (111 -> 110, #671) kept, with this PR's own drain re-applied (the raw JSON-lane loader and the cold auth lane deleted, 2 hits): 108.
Brings predev 75f438b (#810: the scan floors are deleted and the gates reconcile against git ls-files). The population, tracing, seal-witness and no-deferral gate files are predev's; this branch's edits there were floor re-pins only, so none is kept.
Brings predev 350e107 (#727). Conflict: qa/kind-isolation.toml, busbar-plugin-loader x instance:secret: predev's row (109) kept, with this PR's own delta applied: the raw JSON-lane loader and cold auth lane deleted, -2, so 107.
#681 (a1e5870, on predev) added run_admin_chain's sixth parameter, carried: &mut AdminCarried. This branch's acceptance_1_5_5_tests.rs:314, new on this branch, still passed five; it now passes &mut Default::default(), as every other call site in the merged tree does.
Brings predev c89729d (#798). Conflict: qa/kind-isolation.toml, busbar-kernel x transport, by the ledger merge rule: base 285, predev 284 (row 157), this branch 284 (the cold auth path's "http" scheme check in auth/token.rs, a different hit): 284 + 284 - 285 = 283; predev's cite kept, this branch's clause appended.
Brings predev 235e1a3 (#795, #783). Conflicts: qa/DESIGN-BINDINGS.md and qa/design-bindings.json, the generated design-bindings ledger: predev's files taken, then only this branch's own rows re-applied in the generator's format: PB-35 cites every_request_is_verified_by_the_door_and_the_kernel_caches_no_verdict; PB-100 drops the three deleted hop tests (execute_hop_refuses_non_allowlisted_host, vet_hop_url_enforces_https_allowlist_and_blocks_metadata, execute_hop_does_not_follow_redirect); mapped test checks 430 -> 428 (+1 -3). The .md and .json agree row for row (104 bindings, 428 test checks).
qa/kind-isolation.toml busbar-kernel x transport: base 284, predev 267 (#710's REBALANCE -17), this branch 283 (-1, #532 Q1 cold auth path) -> 267 + 283 - 284 = 266 (ledger merge rule). Predev's cite kept whole; this branch's clause appended as LOWERED 267 -> 266. The clause's quoted scheme is now escaped inside the TOML string (this branch's head wrote it unescaped, which no TOML reader parses).
@MattJackson
MattJackson merged commit 40a4080 into predev Oct 13, 2026
1 check passed
@MattJackson
MattJackson deleted the p2-cold-auth branch October 13, 2026 17:50
MattJackson added a commit that referenced this pull request Oct 13, 2026
qa/kind-isolation.toml busbar-kernel x transport: base 267, ours 261 (E5a: -5 drained, -1 ruled MOVE to
busbar-core-connector), theirs 266 (#532: auth/token.rs's "http" check deleted, a different hit):
theirs + ours - base = 260, predev's cite kept with E5a's clause renumbered 266 -> 260.
MattJackson added a commit that referenced this pull request Oct 13, 2026
qa/kind-isolation.toml, by the ledger merge rule (result = T + O - B; predev's cite kept whole, this
branch's clause appended with its numbers rewritten):
- busbar x transport: B 207, predev 224 (#710 REBALANCE +17), ours 183 (FLIP-A2A -24) -> 200
- busbar-kernel x instance:secret: B 115, predev 114 (K2-H3 -1), ours 112 (extern ABI strings -3) -> 111
- busbar-kernel x plane: B 1141, predev 1128 (row 156 -9, K2-H3 -4), ours 1118 (FLIP-A2A -23) -> 1105
- busbar-plugin-loader x instance:secret: B 109, predev 107 (#532 -2), ours 23 (-85 extern ABI
  strings, -1 durable_tests rename) -> 21
- dep rows: predev's deleted busbar-kernel -> busbar-store-memory and this branch's deleted
  busbar-a2a edges both stay deleted.

Cargo.toml: predev's deleted fixture-store pin and this branch's deleted a2a-lf/a2a-pb block both
stay deleted; the busbar-transport-http pin stays a6e29e36da.
crates/busbar-kernel/src/tls.rs: predev's (the listener moved to root::listener).
crates/busbar-kernel/src/test_support/engine_kit/mod.rs: predev's, with this branch's removal of the
card-issuer pass-throughs re-applied (TestAppSeam states neither).
crates/busbar-a2a/src/a2a/tests/adminverbs_tests.rs: deleted with the crate.
MattJackson added a commit that referenced this pull request Oct 14, 2026
…erged with predev (460be4d77d)

Drains: busbar x instance:secret 25 -> 22, busbar x plane 772 -> 770, busbar-kernel x plane 1100 -> 1099, busbar-kernel x transport 266 -> 220, busbar-kernel-breaker x plane 2 -> 0, busbar-kernel-breaker x transport 134 -> 1 (the #561/#778 breaker work this branch stacks on, row 66, and FLIP-A2A).

busbar-plugin-loader x instance:secret 21 -> 23 is a correction of the merge figure, not a rise: predev's -2 (#532, 40a4080) removed two `extern "C"` ABI strings (host_log_sink and its doc line) that this branch's scanner fix had already stopped counting, so the two drains overlap by those two; 23 is this branch's own pre-merge measure, and no hit was added.
MattJackson added a commit that referenced this pull request Oct 14, 2026
…hat read as the c secret plugin are named for what they are

Ruling on 60dd171: no raise. The 23 ModernCI measured is no hit #787 added (#787 adds no secret-instance literal to the loader; it removes one, the durable_tests rename): the merge figure 21 counted predev's -2 (#532, two extern "C" ABI strings) that the scanner fix behind #787's -85 had already stopped counting. The ceiling returns to 21 by draining two real hits: store_money_acceptance.rs the_floor_makes_arrival_order_matter's .expect("c") messages (the charge), now "the charge", and their refund pair "the refund".
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