8000 T25 — Read client-owned store rules and refuse rules in the deny set · Issue #2280 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

T25 — Read client-owned store rules and refuse rules in the deny set #2280

Description

@norrietaylor

Task

slice size difficulty model who estimated lines
Keychain secrets by reference L needs care standard an agent 650 (350 code, 300 tests)

A store rule aimed at a GitHub host or the Host header is refused by name when the configuration is read.

Covers:

  • BEP-034
  • BEP-035
  • BEP-036
  • BEP-037

Layers:

  • config:
    • crates/minimal/src/config.rs: reads [secret-store-rules] from the client configuration
    • crates/boxes/src/core/bep.rs: the BEP-034, BEP-035 and BEP-036 refusals
    • crates/mfile/src/lib.rs: ignores a project's [secret-store-rules] with a warning
    • crates/boxes/src/client/config.rs: Config gains the secret-store-rules field, so a client file that holds rules still parses under deny_unknown_fields on every read, the attach path included (arch C1 on feat(minimal): read client-owned store rules and refuse rules in the deny set #2514)
    • cargo nextest run -p boxes store_rule_in_deny_set_is_refused
    • cargo nextest run -p boxes store_rule_naming_sign_in_item_is_refused
    • cargo nextest run -p boxes ask_rule_without_tty_denies
    • cargo nextest run -p boxes prop_store_upstream_outside_egress_is_exit_3
    • cargo nextest run -p boxes project_store_rules_are_ignored_with_warning

Waits on:

Plan block
### T25 — Read client-owned store rules and refuse rules in the deny set
  slice: S3
  kind: task
  covers: BEP-034, BEP-035, BEP-036, BEP-037
  size: L
  est: 350 code, 300 tests
  executor: agent
  difficulty: needs care
  model: standard
  diagnostics: a refused rule prints "The secret-store rule <name> in <file> names <host or header>, which a secret can never be sent to. Remove or change the rule." on stderr when the configuration is read, pinned by store_rule_in_deny_set_is_refused
  observability: one debug log line per configuration read naming each rule refused and why
  layers:
    - config:
      - crates/minimal/src/config.rs: reads `[secret-store-rules]` from the client configuration
      - crates/boxes/src/core/bep.rs: the BEP-034, BEP-035 and BEP-036 refusals
      - crates/mfile/src/lib.rs: ignores a project's `[secret-store-rules]` with a warning
      - crates/boxes/src/client/config.rs: `Config` gains the `secret-store-rules` field, so a client file that holds rules still parses under `deny_unknown_fields` on every read, the attach path included (arch C1 on #2514)
      test: cargo nextest run -p boxes store_rule_in_deny_set_is_refused
      test: cargo nextest run -p boxes store_rule_naming_sign_in_item_is_refused
      test: cargo nextest run -p boxes ask_rule_without_tty_denies
      test: cargo nextest run -p boxes prop_store_upstream_outside_egress_is_exit_3
      test: cargo nextest run -p boxes project_store_rules_are_ignored_with_warning
  produces: none
  consumes: none
  proof: A store rule aimed at a GitHub host or the Host header is refused by name when the configuration is read.
  depends on:
    - blocked by #2276

Generated by Claude Code

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:standardA standard model: work that needs care, or routine work that is large
    on Oct 17, 2026
  2. minimal-foundry commented on Oct 24, 2026

    @minimal-foundry
    Contributor

    Done. #2514 merged.

    branch agent/2280-read-client-owned-store-rules-and-refuse-rules-i · epic #1501 · PR #2514

    round outcome job
    1 pushed 2f30f064
    2 pushed fac313a5
    3 pushed c9c55eb7
    4 changed nothing: Revise round 4. No code change in this round. CI: the cargo-deny failure is a new RUSTSEC advisory (timing variability) in ecdsa/primeorder/rfc6979, pulled in by russh 0.64.1, plus an unused RUSTSEC-2 679ca6cb
    5 pushed 677e0395
    6 pushed 94b34acb
    7 pushed ca7819f6
    8 pushed f0f5112c
    10 pushed 8a6b5401

    Updated 2026-10-24T23:38:43.000Z.

  3. norrietaylor commented on Oct 25, 2026

    @norrietaylor
    MemberAuthor

    The open part of T28 (#2292, delivered in #2574) is two edits that belong here.

    #2574 makes the forwarder inject a stored key in the registered form. bep serve does not inject a store value until both of these land:

    1. crates/bep/src/redeemer.rs: BoxRedeemer overrides Redeemer::redeem_reference and returns Redeemed::Store for an admitted store member (Gatehouse §6.10 line 849, redemption step 4). Keep the header check before redeem runs. Then delete the interim note on redeem_reference in crates/bep/src/forward.rs.
    2. crates/bep/src/proxy.rs: the bep serve path calls Flow::with_store(Arc::new(HostStore)). Then delete the interim note on with_store.

    Until then, the T28 proof holds in the forwarder only. BEP-032 stays open until redemption step 4 runs in bep serve. This is the arch review's C1 on #2574 at 8a505ad (ruling). The epic owner keeps Closes #2292 on the PR, so the condition is recorded here.


    Generated by Claude Code

  4. norrietaylor commented on Oct 25, 2026

    @norrietaylor
    MemberAuthor

    Correction: this issue is closed, so the work above is now tracked in #2586.


    Generated by Claude Code

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:standardA standard model: work that needs care, or routine work that is largesize: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