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. 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

  2. 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

  3. 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": []
    }
  4. 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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions