Skip to content

Settings read: an env-pinned key does not say whether a value is stored beneath the pin, so Setup cannot offer to clear it #30823

Open

Description

@objectstack-fleet

domain:ui#3 · os-tesla · session_01L9qibxW6qraU2Z3mwupUGp

Filing gate: ③ a maintainer ruling that names this work: #30385 ruling A (maintainer 「同意」 on 2026-11-05), item 5, through #30665, whose body says: "The page needs the server to say whether a stored value sits beneath the pin. If the settings read does not carry that today, the reader states the gap and the server field is filed to domain:server first." ⛔ Not a claim. Triage sets the grade and the lane. Suggested grade: p2 (#30665's grade; it is the half that blocks it).

Business reason. An administrator who pinned a settings key with an OS_* variable to recover (the #30385 case: the allowed-IP list) must clear the value saved beneath the pin before removing the variable, or the old value comes back. PR #30448 made the clear possible through the API; #30665 puts it in Setup. Setup can only show "clear the saved value" on a field that has one, and today nothing tells it.

Reader. The domain:server seat (@objectstack/service-settings, the read path), then the domain:ui seat holding #30665.

Dedupe. stored value beneath pin (59 hits), env override stored beneath (17), settings read env locked stored (92): nearest #30665 (the ui half, blocked on this), #30664 (closed: resetNamespace now clears beneath a pin, PR #30793, no read field), #30385 (closed: the clear itself, PR #30448). None adds a read field. New.

What happens (origin/main 3da9a4c1)

SettingsService answers a key an env override pins from the override branch alone (packages/services/service-settings/src/settings-service.ts ~L1952): { value, source: 'env', locked: true, lockedReason: 'Set via env: …', cascadeChain: [ { scope: 'env', … } ] }. The stored cascade beneath it (resolveStored) is not read on that branch, so neither the value nor the fact that a row exists reaches the caller. The cascade chain carries the env entry only.

Wanted

Unblocks: #30665.

Activity

  1. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p1 · domain:server · pm:blocking · 2026-11-06T05:09Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    domain:serverDomain lane — seat card indexed by label:pm:seat
    enhancementNew feature or request
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    pm:queueReady for the PM dispatch loop
    priority:p1High: required for production / M2
    on Nov 6, 2026
  3. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW

    Claim: PM loop patrol · 2026-11-06T05:27Z
    Session: session_016WV4cytLmJxfAmgPVjUbbW
    Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-30823-settings-stored-beneath-pin (placeholder; the card thread's harness-pinned branch replaces it by a full re-post of this claim before any push)
    Worktree: objectstack-issue-30823
    Domain: domain:server
    Seat: domain:server#1
    File surface: packages/services/service-settings/src/settings-service.ts (the env-override branch of the read) and settings-secret-redaction.ts if a secret key's beneath-pin entry needs redacting, their tests, settings-routes.ts only if the REST answer does not already carry the service's read, content/docs/** (the settings read's description), one root .changeset/ file. ⛔ packages/spec/** (stop and ask: every spec seat is vacant, consent goes to the maintainer), ui/**, docs/adr/**, skills/**, .claude/**. Stop on breach and explain in the report
    Container & model: M, mode:card-thread (p1), model: default, effort: xhigh
    Clause-②: yes (widening), expected: the read of an env-pinned key carries more than it does today. The dev confirms the final shape in the PR body
    Metadata-protocol: none
    Responsibility: the settings read's provenance (@objectstack/service-settings, SettingsService.get and GET /api/settings/:namespace) | none | the Setup page that offers to clear a value saved beneath a pin (#30665, domain:ui)
    Thread-read: 6677477512
    Premise: holds on origin/main c17719dd. SettingsService.get returns from the env-override branch (settings-service.ts about :1953) with a one-entry cascadeChain and never calls resolveStored, so a row stored beneath the pin is invisible to the caller. ResolvedSettingValueSchema.cascadeChain (packages/spec/src/system/settings-manifest.zod.ts about :827) already admits entries for every scope below env, so a shape that fills the chain beneath the pin may need no schema change; the dev decides, and stops before any packages/spec/** edit. ⛔ A secret-typed key's stored value never reaches the caller
    Serial constraints cleared: no open PR names this card. Open PR #30720 (draft) edits settings-routes.ts, and #30783 (draft) adds pin tests beside it; if this card has to touch settings-routes.ts, the dev rebases on whichever lands first

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW

    Claim: PM loop patrol · 2026-11-06T05:30Z (re-post of 6677721533 with the card thread's branch; it supersedes that comment)
    Session: session_016WV4cytLmJxfAmgPVjUbbW (seat); dev session session_016WV4d13xV55y9KgsteqXK9
    Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-56aarf (the card thread's harness-pinned branch, objectstack-ai/objectstack)
    Worktree: objectstack-issue-30823
    Domain: domain:server
    Seat: domain:server#1
    File surface: packages/services/service-settings/src/settings-service.ts (the env-override branch of the read) and settings-secret-redaction.ts if a secret key's beneath-pin entry needs redacting, their tests, settings-routes.ts only if the REST answer does not already carry the service's read, content/docs/** (the settings read's description), one root .changeset/ file. ⛔ packages/spec/** (stop and ask: every spec seat is vacant, consent goes to the maintainer), ui/**, docs/adr/**, skills/**, .claude/**. Stop on breach and explain in the report
    Container & model: M, mode:card-thread (p1), model: default, effort: xhigh
    Clause-②: yes (widening), expected: the read of an env-pinned key carries more than it does today. The dev confirms the final shape in the PR body
    Metadata-protocol: none
    Responsibility: the settings read's provenance (@objectstack/service-settings, SettingsService.get and GET /api/settings/:namespace) | none | the Setup page that offers to clear a value saved beneath a pin (#30665, domain:ui)
    Thread-read: 6677477512
    Premise: holds on origin/main c17719dd. SettingsService.get returns from the env-override branch (settings-service.ts about :1953) with a one-entry cascadeChain and never calls resolveStored, so a row stored beneath the pin is invisible to the caller. ResolvedSettingValueSchema.cascadeChain (packages/spec/src/system/settings-manifest.zod.ts about :827) already admits entries for every scope below env, so a shape that fills the chain beneath the pin may need no schema change; the dev decides, and stops before any packages/spec/** edit. ⛔ A secret-typed key's stored value never reaches the caller
    Serial constraints cleared: no open PR names this card. Open PR #30720 (draft) edits settings-routes.ts, and #30783 (draft) adds pin tests beside it; if this card has to touch settings-routes.ts, the dev rebases on whichever lands first

  6. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW

    席位核对 · Amendment · 2026-11-06T05:37Z · claim 6677761672

    Amended surface: packages/services/service-settings/README.md, one sentence in the "Env override" section. It says that the namespace (inspection) read lists the stored entries beneath a pin's env entry. The README ships in the package tarball, so it is changed with the code, in the same PR.

    Shape noted (dev, no spec edit):

    • getNamespace, the inspection path that GET /api/settings/:namespace already passes through, lists the stored chain beneath the env entry. The env entry stays first and effective, and its effective flag is stripped from the entries below it.
    • get() and getMany() keep answering a pin from env alone, because they are per-request hot paths. The cascadeChain docblock already scopes the chain to the inspection path. The card's "settings REST answer carries it" is met by the namespace read.
    • A secret key's entries beneath the pin carry the mask or null, never the decrypted value.
    • An env value that coerces to null keeps an env-only chain, and the PR names this as a gap.

    Everything else in the claim is unchanged.

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

Metadata

Metadata

Assignees

Labels

domain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions