8000 T2 — Hold the proxy's keys non-exportable in the host keychain and publish their public halves · Issue #2259 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content
10000

T2 — Hold the proxy's keys non-exportable in the host keychain and publish their public halves #2259

Closed

Description

@norrietaylor

Task

slice size difficulty model who estimated lines
Clone, push and gh from a box with no token in it L unknown ground strongest an agent 820 (400 code, 420 tests)

The proxy's keys survive a restart and appear in no file, and replacing the sealing key refuses every member sealed to the old one.

Covers:

  • BEP-014
  • BEP-059
  • BEP-060
  • BEP-072

Layers:

  • keys:
    • crates/bep/src/keys.rs (new): a key-store seam; the macOS Keychain backend holds the sealing, root and signing keys non-exportable
    • crates/bep/src/publish.rs (new): publishes and parses by role the sealing public key, fingerprints and root (BEP-072)
    • crates/bep/src/main.rs (new): the bep binary with --replace-key <role>, which runs without the files a serving proxy reads
    • crates/bep/src/lib.rs: module lines
    • crates/bep/Cargo.toml: security-framework on macOS
    • Cargo.lock: the keychain dependency
    • cargo nextest run -p bep signing_key_is_non_exportable_and_has_no_file
    • cargo nextest run -p bep sealing_and_root_keys_persist_non_exportable
    • cargo nextest run -p bep a_value_sealed_to_the_published_identity_unseals_under_the_keys
    • cargo nextest run -p bep a_published_identity_carrying_no_key_is_refused_by_role
    • cargo nextest run -p bep keys_never_regenerated_on_restart
    • cargo nextest run -p bep key_replacement_kills_outstanding_members
    • cargo nextest run -p bep refused_key_names_the_replacement_command

Waits on:

Plan block
### T2 — Hold the proxy's keys non-exportable in the host keychain and publish their public halves
  slice: S0
  kind: task
  covers: BEP-014, BEP-059, BEP-060, BEP-072
  size: L
  est: 400 code, 420 tests
  executor: agent
  difficulty: unknown ground
  model: strongest
  diagnostics: when the keychain refuses a key, `bep` refuses to start and prints "The keychain refused the proxy its <role> key. Ru
D7A8
n `bep --replace-key <role>` to make a new one; boxes created before then must be re-created." on stderr, pinned by refused_key_names_the_replacement_command
  observability: one info log line at start naming each key role and its fingerprint, and one warn line per replacement naming the role
  layers:
    - keys:
      - crates/bep/src/keys.rs (new): a key-store seam; the macOS Keychain backend holds the sealing, root and signing keys non-exportable
      - crates/bep/src/publish.rs (new): publishes and parses by role the sealing public key, fingerprints and root (BEP-072)
      - crates/bep/src/main.rs (new): the `bep` binary with `--replace-key <role>`, which runs without the files a serving proxy reads
      - crates/bep/src/lib.rs: module lines
      - crates/bep/Cargo.toml: `security-framework` on macOS
      - Cargo.lock: the keychain dependency
      test: cargo nextest run -p bep signing_key_is_non_exportable_and_has_no_file
      test: cargo nextest run -p bep sealing_and_root_keys_persist_non_exportable
      test: cargo nextest run -p bep a_value_sealed_to_the_published_identity_unseals_under_the_keys
      test: cargo nextest run -p bep a_published_identity_carrying_no_key_is_refused_by_role
      test: cargo nextest run -p bep keys_never_regenerated_on_restart
      test: cargo nextest run -p bep key_replacement_kills_outstanding_members
      test: cargo nextest run -p bep refused_key_names_the_replacement_command
  produces:
    - crates/bep/src/keys.rs
    - crates/bep/src/publish.rs
    - crates/bep/src/main.rs (entry point)
  consumes:
    - crates/bep/src/seal.rs
  proof: The proxy's keys survive a restart and appear in no file, and replacing the sealing key refuses every member sealed to the old one.
  depends on:
    - blocked by #2258
    - assumes OQ4 (v1 binds the macOS Keychain behind a key-store seam; the Linux host stays unverified for the signing-key rule until a later backend)

Activity

  1. added
    kind:taskA task the plan skill rendered; the body carries ## Task
    size:L500 to 900 net lines; one PR, and the ceiling
    model:strongestThe strongest model available: unknown ground, or large work that needs care
    on Oct 17, 2026
  2. minimal-foundry commented on Oct 19, 2026

    @minimal-foundry
    Contributor

    Done. #2363 merged.

    branch agent/2259-hold-the-proxy-s-keys-non-exportable-in-the-host · epic #1501 · PR #2363

    round outcome job
    1 pushed c6e8873d
    2 pushed 4e0c0b5d
    3 pushed 8c6c2a80
    4 pushed 39239650
    5 pushed 7e3ee08b
    6 pushed 2493e25e

    Updated 2026-10-20T00:39:00.219Z.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind:taskA task the plan skill rendered; the body carries ## Taskmodel:strongestThe strongest model available: unknown ground, or large work that needs caresize:L500 to 900 net lines; one PR, and the ceiling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      0