…} filled crosses as its secret reference; a member's env resolves at spawn
SECURITY rulings (2026-10-07):
- a SecretRef only at a credential field;
- url, command, args, cwd and token_url keep load-time interpolation (no 1.5.5 narrowing);
- a credential filled in part is a template reference;
- a member's env resolves at the spawn.
Stacked on P1b (p6-k1-open-strip): every crossing it routes through the deal's one strip is bound
here too.
- busbar-kernel config::filled. The interpolation's structural check walks the real and placeholder
trees in step; it records each scalar `${VAR}` filled. A record holds the path, the variables,
whole or part, the value as written and a per-process keyed digest; it never holds the value.
- plane_bound replaces a value only at a CREDENTIAL position, and only while the value keeps its
digest. A credential position is any of:
- a credential key (api_key, token, client_secret, subject_token, password, secret, private_key,
authorization, bearer, and the other token names);
- an entry of a program's `env` map;
- anything inside the kernel-owned `upstream_credentials` block.
A whole value becomes `{ env: VAR }`. A part becomes a template reference
(`{ module: template, settings: { text: "Bearer ${VAR}" } }`). Every other position crosses as
interpolated. Nothing is refused.
- Bound blobs: the door's validate settings and facing probe, DoorOwned::bytes, the stage-3g
validate blob of a plane's verb sections, and serve.rs `crossed` (open and both refresh paths)
plus the owned sections.
- busbar-contract:
- SecretRef::template / template_text / resolve_template (SECRET_MODULE_TEMPLATE);
- Program::secret_env holds a program's `env` references as references.
- busbar-core-connector: install_spawn_secrets. Connection::spawn resolves `secret_env` there and
nowhere earlier, a template's every `${VAR}` filled in place. A reference that does not resolve is
refused, naming the variable and the source, never a value.
- plugin-loader: member_programs no longer resolves `env` at the declare (MemberSecretFn and
install_member_secrets removed). The root installs the linked secret resolver into the connector
instead.
REDs:
- root planes_tests `an_interpolated_credential_reaches_a_door_plane_as_its_reference_never_its_bytes`;
- kernel filled_tests;
- connector `a_members_secret_environment_resolves_at_the_spawn` and
`a_member_whose_secret_environment_does_not_resolve_is_not_spawned`;
- contract `a_template_reference_resolves_each_variable_in_place` and
`a_programs_secret_environment_is_held_as_its_reference`.
SECURITY: a plane never receives a credential's bytes; a member's env resolves at spawn
Stacked on P1b (#670, merged into this base). It reworks
sec-plane-secret-refs(2393666, predev-based) to the SECURITY rulings of 2026-10-07:url,command,args,cwdandtoken_urlkeep load-time interpolation, so nothing 1.5.5 accepted is narrowed;envresolves at the SPAWN.Why
${VAR}is spliced into the config text before it is parsed, so every door plane was handed interpolated plaintext in its open settings, its refresh settings and its owned blob. P1b measured this (Latchkeycli-d43752e9).What
busbar-kernelconfig::filled:${VAR}filled: the path, the variables, whole or part, the value as written, and a per-process keyed digest. It never records the value.plane_boundreplaces a value only at a CREDENTIAL position, and only while the value keeps its digest. A credential position is any of:api_key,token,access_token,refresh_token,id_token,client_secret,subject_token,secret,password,passphrase,private_key,authorization,bearer;envmap;upstream_credentials.{ env: VAR }. A part becomes{ module: template, settings: { text: "Bearer ${VAR}" } }. Every other position crosses as interpolated, and nothing is refused.DoorOwned::bytes, the stage-3g validate blob of a plane's verb sections, andserve.rscrossed(open and both refresh paths) plus the owned sections.busbar-contract:SecretRef::template/template_text/resolve_template(SECRET_MODULE_TEMPLATE);Program::secret_envholds a program'senvreferences as references.busbar-core-connector:install_spawn_secrets.Connection::spawnresolvessecret_envthere and nowhere earlier, filling each${VAR}of a template in place. A reference that does not resolve refuses the spawn, naming the variable and its source, never a value.plugin-loader:member_programsno longer resolvesenvat the declare (MemberSecretFnandinstall_member_secretsare removed). The root installs the linked secret resolver into the connector instead.SECRET_BEARING_TYPESinventory accounts forProgram.Proof (Latchkey
cli-088f9f23-2f50-48b1-b50f-6528ad04dbca, head 9d3fa66, before the inventory commit)-p busbar-contract -p busbar-core-connector -p busbar-kernel -p busbar-plugin-loader -p busbar --all-targets -D warnings): clean. Examples built.plane_boundhanding every blob as interpolated (the base), FAILED:planes_tests::an_interpolated_credential_reaches_a_door_plane_as_its_reference_never_its_bytes;config::filled(6 cells).a_door_planes_open_and_refresh_carry_no_reserved_key, pass;cargo test -p busbar-contract,-p busbar --bin busbar,-p busbar-plane-mcp -p busbar-plane-llm -p busbar-plane-decisions: 0 failed;cargo test -p busbar-core-connector: lib green, includinga_members_secret_environment_resolves_at_the_spawnanda_member_whose_secret_environment_does_not_resolve_is_not_spawned. The one red is the known environment redtests/universal_needs.rs: the pinned framer cdylib only the hop builds.cargo test -p busbar-kernel, every target green except:secret_ref_coverage::every_secret_bearing_type_is_accounted_for, fixed in 959ef54 (the inventory row forProgram);root_key_spelling, which goes green with DEL.cargo test -p busbar-plugin-loader: 612 passed, 2 failed. The two are the known environment reds atboth_ways.rs: the external pinned secret-env twin is not built.Customer-visible
${VAR}reaches a plane as a reference rather than its bytes. Planes resolve no credential themselves; the kernel and host do.url,command,args,cwdandtoken_urlare unchanged from 1.5.5.