You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
skills(objectstack-data): teach that a secret or password field is never a filter, sort or search key, only a has-a-value check (Skills-docs follow-up owed by #27477) #27660
Filing gate: ③ a maintainer-directed task. The maintainer, in the PM session session_017xRBcVy4VXmkQjn2MGeaWk on 2026-10-29, said (verbatim): 「你应该使用 pm-dispatch 技能审核和落地 pr」. The pm-dispatch review checklist says that a Skills-docs: follow-up owed line is filed as a card and rewritten to #N before ACCEPT. This card is that follow-up for PR #27477.
Business reason: after #27477, the engine refuses a credential column (type: 'secret' / type: 'password') as a filter key, a { $field } comparand, a sort key, an aggregations[i].filter key, an expand entry's where or orderBy, and an import matchFields lookup. Each refusal is 400 INVALID_FIELD for a non-system caller. "Has a value" checks (null, $null, $exists, $empty) stay allowed. skills/objectstack-data/rules/security.md teaches the credential field types but says nothing about querying them. An AI author following the skill can therefore still write a view filter, sort, report or import mapping that the runtime refuses.
Reader: AI agents authoring ObjectStack metadata through the published objectstack-data skill.
Dedupe: searched the open and closed issues for "skills credential secret password filter sort"; no card covers this.
What to add
In skills/objectstack-data/rules/security.md, near the credential field types, add one rule with a short example:
a credential column is never a filter, sort, group, search or import-match key;
the only query a caller may write against it is whether it has a value;
searchableFields should not list it.
Add one eval prompt in the package's eval set that exercises it: ask for a list view filtered by a secret field, and expect the skill to refuse or redirect.
Out of scope: any runtime change, which has shipped in #27477.
Read fresh. This is the Skills-docs: follow-up of fix(objectql): extend the credential-column guard from aggregates to filter and sort keys #27477, which has landed. skills/objectstack-data/rules/security.md teaches that a credential column is only ever checked for having a value: never a filter, sort, group, search or import-match key, and never in searchableFields. It gets one eval prompt.
Tier H, with the token ratchet per file. No runtime change.
Claim: PM loop round 1 · 2026-10-29T21:59Z
Session: session_016WV4d1QkPVVzNz3FJqb2iS (seat; mode:subagent, the dev shares the seat's session — identity by branch)
Account: os-elon-musk
Branch: claude/project-thread-laa8t4
Worktree: objectstack-issue-27660
Domain: domain:skills
Seat: domain:skills#2
File surface: skills/objectstack-data/rules/security.md (one rule near the credential field types) and one eval in skills/objectstack-data/evals/*.json, plus its row in scripts/check-skills-token-ratchet.mjs (added by seat amendment: the eval file measured +93 tokens over its ceiling after paying down; the raise runs on the standing maintainer ruling 2026-10-27 「A:先削重复,余额按实测提高」, the same authority this file's 1404 -> 1573 raise for card #26834 quotes); ⛔ no runtime path (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: opus (dispatch-gates --tier: MANDATORY ceiling tier via 'skills/**' clause ①; exit taken = the proactive low-headroom downgrade, reason: the maintainer's standing word in this project 「fable 不多,后续尽量认领不需要契约复审的卡」 (2026-10-26); compensating control = a CONTRACT_REVIEW_TIER contract review of the PR before the queue), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card (the Skills-docs: follow-up of #27477, which has landed)
Thread-read: 6503007557
Premise: holds (skills/objectstack-data/rules/security.md on origin/main481ade61 says nothing about filtering, sorting or searching a credential column)
Serial constraints cleared: none — no open PR touches skills/objectstack-data/** at claim time (16 open PRs read). Tier H (governed skills/**), token ratchet per file.
{
"issue": 27660,
"status": "blocked",
"branch": "claude/project-thread-laa8t4",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27772",
"session": "session_016WV4d1QkPVVzNz3FJqb2iS",
"premise_still_valid": true,
"summary": "skills/objectstack-data/rules/security.md gains one rule beside the type: 'secret' example: a secret / password column is never a filter, sort, group-by or import matchFields key (400 INVALID_FIELD; an import row naming it fails); search never scans it, so keep it out of searchableFields; the one allowed condition is has-a-value (example filter: { api_key: { $null: false } }, also null / $exists / $empty). The text is paid for by deleting four sentences the package already holds elsewhere, and the file lands at 3686 tokens against a ceiling of 3687. One eval case (id 9 in hooks-security-seeds-datasources.json) asks for a vendor list view filtered on a secret api_key and expects the redirect. BLOCKED on one thing: that eval file was at zero headroom, and after cutting the only two self-restating clauses (71 bytes) it is 1666 tokens against a ceiling of 1573 (+93), so check-skills-token-ratchet is red. Unblocking needs a seat decision: either raise the row in scripts/check-skills-token-ratchet.mjs from 1573 to 1666 under the standing ruling 「A:先削重复,余额按实测提高」 (that file is outside the declared file surface, so it was not edited), or drop the second commit (1ad33250, eval only) and land the rule alone. Measured mechanism: filter, sort and group are refused; an import match fails per row; search is WITHHELD, not refused (no 400, and an explicit $searchFields is refused only for internal: true), so the text says 'never scans it' and makes no refusal claim.",
"tests": "No tested behaviour changes, so there is no ablation. Token readings ceil(bytes/4) at head 1ad33250: security.md 3681 -> 3686 (ceiling 3687, pass), lines 307 -> 309; eval json 1573 -> 1666 (ceiling 1573, FAIL +93), lines 85 -> 95; objectstack-data/SKILL.md unchanged; ratcheted bundle 208076 / 217598. Outside the derived list, pnpm --filter @objectstack/spec check:skill-examples exits 0 (274 prose examples type-check, including the edited os:check block in security.md).",
"gates": "Head 1ad33250. Derived by dispatch-gates --commands --repo objectstack-ai/objectstack after the commit: 43 commands, plus pnpm check:changeset-fixed (its roster is under .changeset/). Every exit 0 except node scripts/check-skills-token-ratchet.mjs :: exit 1 (the eval row above). Five gates first exited 3 on missing dist: check:doc-formula-expressions, check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content. They were re-run after turbo run build --concurrency=2 under os-verify-lock (VERDICT command-exit 0, 115/115 tasks, held 22m31s) and all five exit 0. --ran reconciliation: 43 derived, 43 run, 0 NOT-MEASURED, 0 UNRUN. Record: /tmp/claude-0/-home-claude/baa7f010-059e-5923-ae57-04c20a386cf1/scratchpad/issue-27660/ran.txt. CI check-runs on #27772: in_progress at report time (not awaited). Expect Lint & Repo Gates red on the token ratchet.",
"line_budget": "security.md net +2 lines (307 -> 309; budget <= +12). Eval: one case, +10 lines.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"files_changed": [
"skills/objectstack-data/rules/security.md",
"skills/objectstack-data/evals/hooks-security-seeds-datasources.json",
".changeset/27660-skills-credential-presence-only.md"
],
"deviations": [
"The token ratchet stays red on the eval file (+93). The ceiling was not raised: scripts/check-skills-token-ratchet.mjs is outside the file surface, and the os-dev rule forbids a self-raise.",
"The eval case is kept as its own commit (1ad33250), so it can be reverted alone.",
"The PR carries assignees ['os-elon-musk'] as the dispatch ordered. os-dev.md rule 2 says a PR carries no assignees. AGENTS.md (Claim paragraph: the PR's assignee mirrors the card's, set by the executor at pr_create) outranks it, so the dispatch and AGENTS.md were followed.",
"Not run on this card: os-dev.md's cleanup step (rm node_modules plus git worktree remove). The worktree is kept because the blocked half comes back to this branch.",
"'search' is taught as withheld, not refused, because that is what the engine measures as."
],
"mcp_calls": "0 — no MCP GitHub tools used",
"api_writes": "2 relay writes (fleet-write dispatch: pr_create -> #27772, read back identical, 9836/9836 bytes, assignee listed; comment os-dev-report on #27660) + 1 git push",
"open_questions": [
{
"question": "How should the +93-token overrun on skills/objectstack-data/evals/hooks-security-seeds-datasources.json be paid?",
"options": [
"A: raise its ratchet row 1573 -> 1666 under the standing ruling 「A:先削重复,余额按实测提高」 (one-line edit in scripts/check-skills-token-ratchet.mjs, after the restatement cuts already made here)",
"B: revert commit 1ad33250 and land the security.md rule without an eval",
"C: trim existing eval model answers further (changes what other cases expect)"
],
"recommendation": "A, because the card orders the eval, restatements were cut first as that ruling requires, and the raise is exactly the measured balance"
}
],
"out_of_scope_findings": [
"carrier: none · noted, not filed — assertSearchFieldsAreSearchable (packages/metadata-protocol/src/protocol-query-validation.ts) refuses an explicit $searchFields naming an internal: true field, but one naming a secret / password column is silently intersected away by the engine, not refused. #27477's PR body treats this as withholding by design, so it is an observation, not a filed class."
]
}
ACCEPT → PR #27772 comment 6511362989 (Tier H; contract review FAIL 6510851915 fixed, delta PASS 6511352146 on head fc27471; CI green; approvers requested). Awaiting a GOVERNED_APPROVERS approval, then the seat lands it.
Note for whoever takes this card · 2026-10-30T00:29Z · ⛔ not a claim
PR #27811 (#27705) makes os validate refuse a searchableFields entry naming a secret / password field (rule searchable-field-unsearchable, error). Its PR body says Skills-docs: follow-up #27660. One more place teaches the same boundary and has no credential row: the boundary table in skills/objectstack-ui/rules/list-views.md (list-view searchableFields). If this card's scope can take that row with the objectstack-data text, both skills say the same thing; otherwise the seat files it separately.
Landed: PR #27772 merged (61c3fdd31, 2026-10-30T01:37Z) after os-zhuang's approval; pm:dispatched stripped with this note. The token-ratchet rows were raised under the standing ruling 「A:先削重复,余额按实测提高」 (eval 1573 → 1674, security.md 3687 → 3698). Nothing further owed on this card.
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 写给 AI 的文档与 skills 说错一句,等于产品缺陷 | none | P①
Triage: p2 ·
domain:skills·area:access· 2026-10-29T16:55Z⛔ Not a claim.
Skills-docs:follow-up of fix(objectql): extend the credential-column guard from aggregates to filter and sort keys #27477, which has landed.skills/objectstack-data/rules/security.mdteaches that a credential column is only ever checked for having a value: never a filter, sort, group, search or import-match key, and never insearchableFields. It gets one eval prompt.documentation,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS
Claim: PM loop round 1 · 2026-10-29T21:59Z
Session:
session_016WV4d1QkPVVzNz3FJqb2iS(seat;mode:subagent, the dev shares the seat's session — identity by branch)Account:
os-elon-muskBranch:
claude/project-thread-laa8t4Worktree:
objectstack-issue-27660Domain:
domain:skillsSeat:
domain:skills#2File surface:
skills/objectstack-data/rules/security.md(one rule near the credential field types) and one eval inskills/objectstack-data/evals/*.json, plus its row inscripts/check-skills-token-ratchet.mjs(added by seat amendment: the eval file measured +93 tokens over its ceiling after paying down; the raise runs on the standing maintainer ruling 2026-10-27 「A:先削重复,余额按实测提高」, the same authority this file's 1404 -> 1573 raise for card #26834 quotes); ⛔ no runtime path (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: opus (dispatch-gates --tier: MANDATORY ceiling tier via 'skills/**' clause ①; exit taken = the proactive low-headroom downgrade, reason: the maintainer's standing word in this project 「fable 不多,后续尽量认领不需要契约复审的卡」 (2026-10-26); compensating control = a CONTRACT_REVIEW_TIER contract review of the PR before the queue),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card (the
Skills-docs:follow-up of #27477, which has landed)Thread-read: 6503007557
Premise: holds (
skills/objectstack-data/rules/security.mdonorigin/main481ade61says nothing about filtering, sorting or searching a credential column)Serial constraints cleared: none — no open PR touches
skills/objectstack-data/**at claim time (16 open PRs read). Tier H (governedskills/**), token ratchet per file.objectstack-fleet commentedon Oct 29, 2026
os-dev-report
{ "issue": 27660, "status": "blocked", "branch": "claude/project-thread-laa8t4", "pr": "https://github.com/objectstack-ai/objectstack/pull/27772", "session": "session_016WV4d1QkPVVzNz3FJqb2iS", "premise_still_valid": true, "summary": "skills/objectstack-data/rules/security.md gains one rule beside the type: 'secret' example: a secret / password column is never a filter, sort, group-by or import matchFields key (400 INVALID_FIELD; an import row naming it fails); search never scans it, so keep it out of searchableFields; the one allowed condition is has-a-value (example filter: { api_key: { $null: false } }, also null / $exists / $empty). The text is paid for by deleting four sentences the package already holds elsewhere, and the file lands at 3686 tokens against a ceiling of 3687. One eval case (id 9 in hooks-security-seeds-datasources.json) asks for a vendor list view filtered on a secret api_key and expects the redirect. BLOCKED on one thing: that eval file was at zero headroom, and after cutting the only two self-restating clauses (71 bytes) it is 1666 tokens against a ceiling of 1573 (+93), so check-skills-token-ratchet is red. Unblocking needs a seat decision: either raise the row in scripts/check-skills-token-ratchet.mjs from 1573 to 1666 under the standing ruling 「A:先削重复,余额按实测提高」 (that file is outside the declared file surface, so it was not edited), or drop the second commit (1ad33250, eval only) and land the rule alone. Measured mechanism: filter, sort and group are refused; an import match fails per row; search is WITHHELD, not refused (no 400, and an explicit $searchFields is refused only for internal: true), so the text says 'never scans it' and makes no refusal claim.", "tests": "No tested behaviour changes, so there is no ablation. Token readings ceil(bytes/4) at head 1ad33250: security.md 3681 -> 3686 (ceiling 3687, pass), lines 307 -> 309; eval json 1573 -> 1666 (ceiling 1573, FAIL +93), lines 85 -> 95; objectstack-data/SKILL.md unchanged; ratcheted bundle 208076 / 217598. Outside the derived list, pnpm --filter @objectstack/spec check:skill-examples exits 0 (274 prose examples type-check, including the edited os:check block in security.md).", "gates": "Head 1ad33250. Derived by dispatch-gates --commands --repo objectstack-ai/objectstack after the commit: 43 commands, plus pnpm check:changeset-fixed (its roster is under .changeset/). Every exit 0 except node scripts/check-skills-token-ratchet.mjs :: exit 1 (the eval row above). Five gates first exited 3 on missing dist: check:doc-formula-expressions, check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content. They were re-run after turbo run build --concurrency=2 under os-verify-lock (VERDICT command-exit 0, 115/115 tasks, held 22m31s) and all five exit 0. --ran reconciliation: 43 derived, 43 run, 0 NOT-MEASURED, 0 UNRUN. Record: /tmp/claude-0/-home-claude/baa7f010-059e-5923-ae57-04c20a386cf1/scratchpad/issue-27660/ran.txt. CI check-runs on #27772: in_progress at report time (not awaited). Expect Lint & Repo Gates red on the token ratchet.", "line_budget": "security.md net +2 lines (307 -> 309; budget <= +12). Eval: one case, +10 lines.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "files_changed": [ "skills/objectstack-data/rules/security.md", "skills/objectstack-data/evals/hooks-security-seeds-datasources.json", ".changeset/27660-skills-credential-presence-only.md" ], "deviations": [ "The token ratchet stays red on the eval file (+93). The ceiling was not raised: scripts/check-skills-token-ratchet.mjs is outside the file surface, and the os-dev rule forbids a self-raise.", "The eval case is kept as its own commit (1ad33250), so it can be reverted alone.", "The PR carries assignees ['os-elon-musk'] as the dispatch ordered. os-dev.md rule 2 says a PR carries no assignees. AGENTS.md (Claim paragraph: the PR's assignee mirrors the card's, set by the executor at pr_create) outranks it, so the dispatch and AGENTS.md were followed.", "Not run on this card: os-dev.md's cleanup step (rm node_modules plus git worktree remove). The worktree is kept because the blocked half comes back to this branch.", "'search' is taught as withheld, not refused, because that is what the engine measures as." ], "mcp_calls": "0 — no MCP GitHub tools used", "api_writes": "2 relay writes (fleet-write dispatch: pr_create -> #27772, read back identical, 9836/9836 bytes, assignee listed; comment os-dev-report on #27660) + 1 git push", "open_questions": [ { "question": "How should the +93-token overrun on skills/objectstack-data/evals/hooks-security-seeds-datasources.json be paid?", "options": [ "A: raise its ratchet row 1573 -> 1666 under the standing ruling 「A:先削重复,余额按实测提高」 (one-line edit in scripts/check-skills-token-ratchet.mjs, after the restatement cuts already made here)", "B: revert commit 1ad33250 and land the security.md rule without an eval", "C: trim existing eval model answers further (changes what other cases expect)" ], "recommendation": "A, because the card orders the eval, restatements were cut first as that ruling requires, and the raise is exactly the measured balance" } ], "out_of_scope_findings": [ "carrier: none · noted, not filed — assertSearchFieldsAreSearchable (packages/metadata-protocol/src/protocol-query-validation.ts) refuses an explicit $searchFields naming an internal: true field, but one naming a secret / password column is silently intersected away by the engine, not refused. #27477's PR body treats this as withholding by design, so it is an observation, not a filed class." ] }objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS
ACCEPT → PR #27772 comment 6511362989 (Tier H; contract review FAIL 6510851915 fixed, delta PASS 6511352146 on head fc27471; CI green; approvers requested). Awaiting a GOVERNED_APPROVERS approval, then the seat lands it.
objectstack-fleet commentedon Oct 30, 2026
domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
Note for whoever takes this card · 2026-10-30T00:29Z · ⛔ not a claim
PR #27811 (#27705) makes
os validaterefuse asearchableFieldsentry naming asecret/passwordfield (rulesearchable-field-unsearchable, error). Its PR body saysSkills-docs: follow-up #27660. One more place teaches the same boundary and has no credential row: the boundary table inskills/objectstack-ui/rules/list-views.md(list-viewsearchableFields). If this card's scope can take that row with theobjectstack-datatext, both skills say the same thing; otherwise the seat files it separately.objectstack-fleet commentedon Oct 30, 2026
domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS
Landed: PR #27772 merged (
61c3fdd31, 2026-10-30T01:37Z) after os-zhuang's approval;pm:dispatchedstripped with this note. The token-ratchet rows were raised under the standing ruling 「A:先削重复,余额按实测提高」 (eval 1573 → 1674,security.md3687 → 3698). Nothing further owed on this card.