Repository navigation
docs(adr-0061): record ruling 6573569376 letter A — field-level searchable is honoured on the auto branch - #29756
Conversation
…hable is honoured on the auto branch An amendment note directly under the D2 bullet (the amended sentence is left as written), a one-line pointer under the "Default behaviour (normative)" table, the D5 re-read, and an **Amended by** header entry in the ADR-0005 shape. Every claim cites the merged resolver by file#symbol; the recorded decision is the ruling's, nothing new. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JQwxbY1n95XjHLy7atRLWP
|
domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A Contract reviewServed-tier: Reviewer: an at-tier subagent adopted by this seat. Inputs: card #29391 and every comment, ruling record 6573569376 and the #29008 thread, merged PR #29385, PR #29756's body, file list and net diff (one file, +26/-0, merge base ① Derived judgmentsEach claim the new text makes, read against
② Semver level
③ Boundary flagsThe dev's offer to strike the one-line pointer under the "Default behaviour (normative)" table: keep it. That table is the record's only normative part and its ④ Design judgmentAgainst the first consumer (the merged resolver, the ingress gate, the engine expansion) and the ruling's execution plan:
Findings:
No must-fix. Implemented-by: VERDICT: PASS |
…ink the table pointer Seat review should-fixes. The ingress sentence now says an `internal: true` field (ADR-0100's third credential channel, an auth-subsystem one-way hash on a text column) is refused at the data door before the resolver runs, and the D5 re-read says that channel holds by the pre-existing withhold (the engine strips internal and credential fields from the field map before it resolves the set) rather than by the flag's hard exclusions. Landed behaviour recorded with file#symbol anchors; no new decision. The table pointer links the card and the ruling record the way the header does. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JQwxbY1n95XjHLy7atRLWP
|
domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A Contract reviewServed-tier: Delta review by the same at-tier reviewer as record 6594883886, answering its S1 and S2. Cited code read on ① Derived judgments
② Semver levelUnchanged: docs-only ③ Boundary flagsS2 closed: the table pointer links ④ Design judgment
No must-fix. Implemented-by: VERDICT: PASS |
…its local const Seat review S3. The symbol anchor for the engine's internal/credential strip now names the method, the way other ADRs anchor engine.ts; the prose keeps the scanFields name. No wording change otherwise. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JQwxbY1n95XjHLy7atRLWP
|
domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A Contract reviewServed-tier: Delta review by the same at-tier reviewer, answering S3 of record 6595041951. Net PR diff against merge base ① Derived judgmentsNo behavioural claim changes. The sentence now anchors ② Semver levelUnchanged: docs-only ③ Boundary flagsNone. Table pointer, ④ Design judgmentThe note's six symbol anchors now name declarations: Implemented-by: VERDICT: PASS |
|
domain:server#3 · os-warren · session_01JQwxbYyp6wSRcywGFK2L4A 维护者速读
席位核对ACCEPT ·
|
Requested by Warren · project thread
Fixes #29391
Clause-②: no
Metadata-protocol: none
维护者速读
docs/adr/0061-record-search-architecture.md(+32 行,无删改)。D2 末条「Field-levelsearchablestays pruned」原句不动,其下加一段修订注,记录 field.searchable: true has no reader: $search skips the field and $searchFields naming it answers 400 "is not searchable" while the served schema says searchable: true #29008 裁决记录 6573569376 的 A 案:对象未声明searchableFields时,标了searchable: true的字段进入自动默认集,secret/password/vector与虚拟formula字段除外;声明了searchableFields的对象不读该开关;$searchFields入口放行集同一套解析;既有的internal: true截留(security(data): the data door's filter and group-by positions do not honour a field'sinternal: truethe way its row read does — detail withheld pending maintainer #22646,ADR-0100 第三条凭据通道)照记:入口在解析前即拒,引擎在解析前把 internal 与凭据字段从字段表剔除,开关绕不过它。「Default behaviour (normative)」表下加一行指针(卡号与裁决记录带链接),表行不改。同注内复读 D5。头部加**Amended by**:条目(ADR-0005 形制),Status 行不动。29c70cac)落地后,D2 这句与代码相反;Prime Directive 13 要求把反转记在 ADR 上。注文每一句都对照origin/mainc76c0e04的packages/spec/src/data/search-fields.ts与入口门禁写,并以 file#symbol 引用。search-fields.ts#admittedBySearchableFlag与#SEARCH_FLAG_EXCLUDED_TYPES);② 注末「D5 re-read」两句(硬排除 +internal: true截留);③ 头部**Amended by**:行。pnpm check:adr-symbol-anchors,预期 3050 anchors 全部 resolve(本 PR 新增 6 个符号锚);或打开search-fields.ts的admittedBySearchableFlag,对照注文第二、三句。docs/adr/**)——GOVERNED_APPROVERS批准后由席位落地。What changes
One file,
docs/adr/0061-record-search-architecture.md, +32 / -0:**Amended by**:line between**Builds on**:and**Consumers**:, the ADR-0005 shape: field.searchable: true has no reader: $search skips the field and $searchFields naming it answers 400 "is not searchable" while the served schema says searchable: true #29008, the ruling record, the landing PR and sha, one sentence on what is reversed, and a pointer to the note. The**Status**:line is untouched, sodocs/adr/README.md(generated from that line) does not move.searchable: trueexceptsecret/password/vector(packages/spec/src/data/search-fields.ts#SEARCH_FLAG_EXCLUDED_TYPES) and a virtualformulafield; the flag is asked before the auto-default's own name /hidden/ type exclusions (#admittedBySearchableFlag), so a flagged hidden or system-named field joins and an unreadable type does not; a declaredsearchableFieldsis the whole set and the flag is not read there (#resolveSearchFieldResolution); the$searchFieldsingress allow-list is the same resolution (packages/metadata-protocol/src/protocol-query-validation.ts#assertSearchFieldsAreSearchable), so a flagged field is accepted as a D1 override and a flagged hard-excluded type is still refused400 INVALID_FIELD; a field declaredinternal: true(security(data): the data door's filter and group-by positions do not honour a field'sinternal: truethe way its row read does — detail withheld pending maintainer #22646, ADR-0100's third credential channel, an auth-subsystem one-way hash on atextcolumn) is refused at that same door before the resolver runs, flag or no flag;falseremoves nothing. It then gives the reconciled reading of the "Default behaviour (normative)" field-resolution row (autoarm widened the same way; row left as written) and the D5 re-read.SEARCH_FLAG_EXCLUDED_TYPEScoverspackages/spec/src/data/masked-field-types.ts#MASKED_ON_READ_FIELD_TYPES(secret,password;encryptedis not aFieldType), so such a column markedsearchable: trueis neither scanned nor accepted as an override. For the third channel, aninternal: truecolumn, the pre-existing withhold (security(data): the data door's filter and group-by positions do not honour a field'sinternal: truethe way its row read does — detail withheld pending maintainer #22646): the engine stripsinternal: trueand credential fields from the field map before it resolves the set (scanFieldsinpackages/objectql/src/engine.ts#expandSearchOnAst), and the door refuses an explicit override naming one before the resolver runs (assertSearchFieldsAreSearchable). The resolver reads no PII marker before or after the ruling, and the flag changes which fields resolve, not how a search executes, so the rest of D5 (one gatedfind()pipeline) is untouched.Why
Ruling record 6573569376 on #29008 (letter A, the maintainer's 「同意」 2026-11-02T09:22Z) chose "honour
field.searchable, not retire it", and PR #29385 (merged 2026-11-02,29c70cac) landed it. ADR-0061 D2 still said the opposite. The card (#29391) is the governed follow-up PR #29385's contract review named;docs/adr/**is Tier H, so it could not ride that PR. The drafted note the card cites was not in project files, so this note is redrafted from the ruling record and the merged resolver, as the dispatch order asks.Scope: wording that records the ruling. No new decision and no superseding ADR; nothing outside the one file.
Tests
n/a. A docs-only edit under
docs/adr/**: no package is touched, so no package test or typecheck is owed, and nothing publishes (fast lane,skip-changeset). Verification is the derived gate set below; every claim in the note was read against the merged code onorigin/mainc76c0e04(search-fields.ts, its test's "field.searchable: true joins the auto-default set" and "SEARCH_FLAG_EXCLUDED_TYPES" describes,protocol-query-validation.ts(including the #22646internal: truerefusal that runs ahead ofresolveSearchFieldResolution),packages/objectql/src/engine.ts(expandSearchOnAst: thescanFieldsstrip built fromcollectInternalReadFieldsandcollectCredentialFields),masked-field-types.ts,field.zod.tsdescribe).Acceptance notes
autoarm; the row is left as written. Strike the pointer if one note is preferred. The header entry is on its own**Amended by**:line, not on**Status**:, as the order asks.text/email/phone/url; todaySEARCHABLE_TEXTUAL_TYPESalso hasautonumber,textarea,markdown, andSEARCHABLE_ENUM_TYPEShasselect. The amendment note says "type-based auto-default" and does not enumerate, so it stays true. Read-only inference, not a card; carrier: none.FieldSchemaand the resolver reads none; the note states this as a reading, not a decision. Not a card (no declared mechanism is violated: D5's parenthetical names type exclusion, which holds); carrier: none.objectstack-fleet[bot]with the model-free trailer pair; the harness's own attribution reminder names a model in itsCo-Authored-Byline, which the pre-push hook refuses, so the AGENTS.md form was used. Reported, not a deviation.internal: truewithhold in the ingress sentence and the D5 re-read) and S2 (link field.searchable: true has no reader: $search skips the field and $searchFields naming it answers 400 "is not searchable" while the served schema says searchable: true #29008 in the table pointer), landed as c520802; the delta review added S3 (anchor the engine withhold on the methodexpandSearchOnAst, not its local const), landed as 0d487e0; the delta review on 0d487e0 passed (6595091192) with no findings left.pr_createsummons nobody (its governed-review follow-up runs only atpr_ready); the Tier H approvers are asked at the seat's hand-off.Verification
node scripts/pm/dispatch-gates.mjs --commandson this diff (merge basec76c0e04): 21 commands, the same list on heads4d9ec80eandc5208020(one file changed throughout). All 21 run on each, every exit 0;--ranreconciled on each: 21 derived, 21 run, 0 NOT-MEASURED, 0 UNRUN. On the final head0d487e0e(one line, an anchor re-spelled) the three ADR gates below were rerun.check:doc-formula-expressions:@objectstack/formula+@objectstack/lintunder the verify lock, VERDICT command-exit 0, held 90 s.check:adr-symbol-anchors— 3050 anchors across 149 records resolve (six new symbol anchors from this note, alldeclaration);check:adr-links— 979 relative links resolve;check:adr-anchors— exit 0;check:adr-index—docs/adr/README.mdis current (Status line untouched).check:doc-authoring,check:nul-bytes,check:pm-governed-merges,check:pm-prior-rulings,check:closed-ceremony-text,check:cross-package-test-inputs,check:ci-filter-parity,check:driver-memory-census,check:gitlink-declared,check:refd-timer-probe,check:watch-hint-literal,check-closing-keyword-parity(+ self-test),check-comment-mask-corpus,plan-test-core-shards --self-test,check-adr-links --self-test.Plan Test Core shardsstep, the 11 whole-root families and the artifact roster; this PR's check-runs are the reading for those.Human Minimum
packages/specholds no runtime logic. (No schema touched.)pnpm lintpasses. (No formatter; the repo-wide eslint run is CI's, and no lintable file is touched.)main, one pull request.docs/adr/**fast lane,skip-changeset; both declaration lines are above.)packages/spectouched: its generated artifacts are regenerated and committed. (Not touched.)content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.维护者速读block is the os-dev maintainer brief, in Chinese by that file's rule.)