Skip to content

a2a push trust: the operator's agent_push.ca through the connector's per-connection trust - #1001

Merged
MattJackson merged 5 commits into
predevfrom
lane-a2a-push-ca
Oct 15, 2026
Merged

MattJackson merged 5 commits into
predevfrom
lane-a2a-push-ca

Conversation

@MattJackson

Copy link
Copy Markdown
Collaborator

Draft (rule 19), stacked on #787 (base lane-p3-flip-a2a) with #966 (lane-llm-responses-webhook 4f31fc8) merged in: #966's prepass lifts a plane-owned section raw, which this uses. Conformance-gaps item 1, ARCHITECT ruling 2026-10-14.

The a2a plane owns agent_push: { ca: <PEM> } beside agents:; its push need's trust_from is owned.agent_push.ca, a namespace of its own (no fallback to settings.). No new connector knob, no a2a key in core or in agents:.

  • Contract: section::OWNED_PATH_PREFIX / owned_path; abi::plane::EXT_OWNED, the refresh extensions key for the owned sections (open already carries PlaneOpenIn::owned; §11, no version bump; busbar_plugin.h updated by hand to the generator's form).
  • Loader: declare_targeted resolves an owned. path against the owned sections only (open: PlaneOpenIn::owned; refresh: EXT_OWNED); refresh_door carries them.
  • Connector: an owned. anchor is optional (absent = public roots alone); written but unparseable is refused, as before. settings. stays required.
  • Root: a written owned anchor the table refused refuses the boot, naming the key; a config apply hands the owned sections from the projection.
  • Plane: agent_push in SECTIONS; NEED_OPEN_WEB.trust_from = owned.agent_push.ca; open/refresh judge the section's shape.
  • REDs: root cells (configured CA delivered; other CA refused; no section = public roots only; malformed PEM refuses the boot), connector trust_from_tests (4), loader conn_services_tests, contract conn_tests, plane push/conformance pins.
  • CHANGELOG Added line; docs/a2a.md.

…lm, switched on by the plane's own webhooks: section, verified by the auth kind, answered ROUTE_LOCAL (ARCHITECT 2026-10-14 option A)
…, stacked on #787: the prepass lifts a plane's owned section raw
… per-connection trust (owned.<section>.<key>)

ARCHITECT ruling 2026-10-14: no new connector knob and no a2a key in core or in agents:. The a2a
plane owns a section beside agents:, `agent_push: { ca: <PEM> }`, lifted raw by #966's prepass, and
its push need's trust_from names it in a namespace of its own, `owned.agent_push.ca`.

- busbar-contract: section::OWNED_PATH_PREFIX / owned_path (the owned namespace, no fallback to
  settings.); abi::plane::EXT_OWNED, the refresh extensions key carrying the owned sections (the
  open already carries them in PlaneOpenIn::owned; §11, no version bump; busbar_plugin.h follows).
- plugin-loader: declare_targeted resolves an owned. trust_from against the plane's owned sections
  (PlaneOpenIn::owned at open, EXT_OWNED at refresh), never the settings; refresh_door carries the
  owned sections under EXT_OWNED.
- busbar-core-connector: an owned. trust_from is optional by definition (absent = the public roots
  alone); a written one that does not parse is refused, as a settings. one is. settings. paths keep
  their required semantics.
- root: an owned trust anchor the operator wrote that the table refused refuses the boot, naming the
  key; a config apply hands a door plane its owned sections from the generation's projection (the
  raw sections join DoorConfig.sections).
- busbar-plane-a2a: SECTIONS states agent_push beside agents:; NEED_OPEN_WEB's trust_from is
  PUSH_TRUST_FROM; open and refresh judge the section's shape (ca alone, non-empty text).
- REDs: root cells (a delivery to a webhook under the operator's agent_push.ca is made; one under
  another CA is refused; without the section a delivery trusts the public roots alone; a malformed
  agent_push.ca refuses the boot), connector trust_from_tests (absent owned anchor declared over the
  public roots; written anchor serves its CA and refuses another; written unparseable anchor refused;
  settings. stays required), loader conn_services_tests (an owned trust_from resolves against the
  owned sections alone), contract conn_tests (the owned namespace), plane push/conformance pins.
- CHANGELOG Added line; docs/a2a.md says which certificates a delivery trusts.
… a malformed anchor is refused and the running anchor kept

ARCHITECT ruling 2026-10-14 on #1001: boot validity and apply validity are one rule.

- busbar-kernel appbuild: set_config_check, the composition root's own check of a resolved
  configuration, run by build_app_from_config before any part of it is built or installed. A
  refusal returns the check's words and leaves the running generation untouched: no swap, so no
  door refresh and no re-declaration.
- root door_steps: owned_anchor_refusal, the one rule (the connector's own reading,
  operator_ca_config), and owned_anchors_refusal over a configuration's sections; boot's compose
  judges a plane's owned anchors by it (replacing the connection-table read) and registers them;
  owned_anchor_check, bound in main, judges every registered anchor as an apply's configuration
  writes it. The same words at boot and apply: "`agent_push.ca` is not a usable trust anchor: ...".
- REDs: kernel a_configuration_the_root_check_refuses_is_refused_by_the_build; root
  an_owned_anchor_the_boot_would_refuse_is_refused_by_the_same_rule; a2a root cell
  an_apply_carrying_a_malformed_agent_push_ca_is_refused_and_deliveries_keep_the_anchor (the apply
  is refused in the boot's words and the running door still delivers under the CA it was composed
  with).
- CHANGELOG and docs/a2a.md say an apply carrying an unusable ca is refused with the same words.
…in place of the process-global check; the retry doc names the three attempts

Coordinator ruling on #1001: no new process-global seam.
- busbar-kernel appbuild: `pub trait RootRules { fn check(&self, cfg) -> Result<(), String> }`
  and `AcceptAll`; build_app_from_config takes `rules: &Arc<dyn RootRules>` and judges the
  configuration by it first. The static CONFIG_CHECK and set_config_check are gone.
- App keeps `root_rules`, the rules it was built under; every admin apply, reset, settings and
  named-map rebuild passes the running App's (core-admin handlers.rs, named_map.rs), and the
  config dry run (service_operations.rs validate_config_blocking) judges by them too. The kernel
  fixture and the busbar build tests pass AcceptAll.
- root door_steps::Rules holds the owned trust anchors of the composed door planes (main holds
  them from Served::need_trust once the planes are composed) and implements RootRules with the
  one rule, owned_anchors_refusal; the static registry is gone. CONFIG_PROJECTION is untouched.
- REDs kept: kernel a_configuration_the_root_rules_refuse_is_refused_by_the_build (refusing rules
  passed to the build; the built App keeps the rules), root
  an_owned_anchor_the_boot_would_refuse_is_refused_by_the_same_rule, a2a cell
  an_apply_carrying_a_malformed_agent_push_ca_is_refused_and_deliveries_keep_the_anchor (the root's
  Rules passed to the apply's build).
- docs/a2a.md: a failed push delivery is retried, at most three attempts (250 ms, then 500 ms, each
  moved by up to 20%), only on a transport error, a 5xx or a 429 (busbar-plane-a2a push.rs:48-52).
Base automatically changed from lane-p3-flip-a2a to predev October 15, 2026 05:33
MattJackson added a commit that referenced this pull request Oct 15, 2026
… from the gates log of 80d5f03

- hooks parity (#989): the v1.5.5 hook corpus moves out of the kernel's source into
  testing/hook-parity/v1.5.5-hook-corpus.tsv, read by the count test; its origins are `proxy`/`core`
  and the constants PROXY_ORIGIN/CORE_ORIGIN (gate hook-parity-count reads them). The listing named
  plane, hook and export instances in a neutral crate: kernel x plane +84, x hooks +18, and the
  instance-noun-neutrality llm census.
- config-schema: a section a plane owns beside its declaring one is the endpoint DOOR only for the
  plane the kernel names its owner (EndpointSection::OWNER); any other is RAW, carried by
  DeployCfg::plane_raw, as the pre-pass lifts it since #966 (a2a's agent_push, #1001). Selftest: two
  doors under the owner stay RED; a non-owner's beside section is carried.
- reachability: serve_datagram.rs is the module `serve_datagram`, named for its file like serve_framed.
- teller-steps / libtest_path: door cells are read off the linked rows on the plane-door axis, the
  rows build.rs mounts since #1006 deleted [package.metadata.busbar.door-cells].
- plane-purity dialect / neutral-no-dialect: LegacyLaneKeys flattens ProviderLaneCaps rather than
  spelling its fields (#957).
- structure-lint: stand_in.rs's inline tests move to tests/stand_in_tests.rs (#1010).
- config-scope: auth/mod.rs's test-idp-module arm is braced like its sibling, so the scanner sees
  the `new` construction in the arm after it.
- instance-noun-neutrality mcp: the a2a client cell's rationale (and its capability-equality row)
  names no other plane.
- hold-escapes: host_disk.rs::start (#864's disk lane job loop) is a reviewed known site.
- hook-parity-count: the TODO's M4 row reads 181.
- design-bindings: PB-50's config.migrate family is 158 cells (#1026 added two).
- kind-isolation law0: busbar auth 24, instance:auth 10, instance:export 25, plane 525, transport 97
  are the merged tree's measure (#1038's figures were T+O-B over a virtual base carrying #993, #1017,
  #1020, which w2 does not carry); busbar-contract export 1 -> 0 and transport 226 -> 225 (slack).
MattJackson added a commit that referenced this pull request Oct 15, 2026
…eld; clippy; the six Law 0 cells the merge grew; config-schema snapshot

- busbar-core-connector dialled.rs (#837 over #893's Piece): the datagram leg's body piece states
  `fault: None` and `declared_len: None` (E0063).
- busbar-kernel appbuild: build_app_from_config takes the root's rules as an eighth input (#1001);
  allowed too_many_arguments with that reason. plugin-loader secret_disk_tests: let-else for the
  refused declare (clippy err_expect).
- Law 0 growth over the merge-base (gates log of 3598829 and the group measures):
  kernel x plane: the failover predicate's docs and test say verdict, not decision (#890);
  kernel x instance:secret: the two new SecretRef literals key on SECRET_MODULE_ENV (#863/#864);
  kernel x auth: the resolved provider's and the token endpoint's docs name the client-credentials
  style without spelling the module (#957, #876);
  connector x transport: spawn_env's doc says program members (#865);
  contract x plane: section.rs's trust_from doc names a plane's push trust (#1001);
  busbar x vendor: the health-probe cell's catalog entry is testing/root-fixtures data (#1039);
  busbar x instance:secret: the pinned-cells selftest builds its fixture citing the pinned file
  rather than re-keying it (#1006).
- config-schema: the RAW carrier records each section as the map's value type; the snapshot gains
  DeployCfg.agent_push (serde_yaml::Value, #1001), ProviderLaneCaps (its Deserialize, round 2) and
  the `type ProviderTable` alias (#957).
- qa/scripts-allowlist.toml: the three twilio conformance legs (#998), oracle-driver like their
  siblings.
@MattJackson
MattJackson merged commit c921f5b into predev Oct 15, 2026
1 check was pending
@MattJackson
MattJackson deleted the lane-a2a-push-ca branch October 15, 2026 13:54
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