Repository navigation
docs(skills): objectstack-api teaches the /meta/:type list's ?names= filter and its closed query set - #30844
Conversation
…filter and its closed query set The Metadata API section states what the list door serves today: `?names=a,b,c` (one comma-separated value) narrows the list to the named items the caller may see, an unknown name is absent, an empty value is refused 400, the `package` list refuses the key, and any key outside the closed set (`package`, `preview`, `object`, `include`, `id`, `names`, `locale`) is refused 400 VALIDATION_ERROR instead of ignored. Growth is paid in the same file: the `/data` prefix sentence and the aggregate spelling restated the route block and the derived-operations table, the Datasources section folded into the Skill Boundaries table, and the RBAC aside dropped its restated symbol. Eval case 7 asks for one by-names read. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qiby5ktwhsqg839UYDQs
|
domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u Contract reviewServed-tier: Inputs read: card #30710 (body, triage, claim, os-dev-report); PR #30844 body and three-file list; the net diff ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
The three deletions — does any rule lose its only home?
Should-fix 1 (SKILL.md:71–72). The parentheticals read as the value set, and
Nit (not a finding). The Skill Boundaries row now reads "datasources ( No must-fix. The paragraph states nothing the code does not pin, the deletions orphan no rule, and the eval case is inside the fixture's convention apart from the one over-tight assertion. Implemented-by: VERDICT: PASS |
…ase 7 its refused-filter hook Contract review should-fixes: the closed-set sentence now lists `include` (`content`, `grants`), since the position list reads `?include=grants`; the growth is paid by dropping the dead `enable.trash` 16.x parenthetical. Eval case 7's prompt now carries the `?name=` attempt that came back 400, so its `VALIDATION_ERROR` assertion is reachable from the prompt. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qiby5ktwhsqg839UYDQs
|
domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u Contract reviewServed-tier: Delta review: one commit ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgmentSKILL.md:72 — SKILL.md:411–413 — the dropped Should-fix 3 (SKILL.md:412, carried from main — not charged to this PR). The re-wrapped sentence now stands alone as "there is no recycle bin." On endpoints-auth-routes.json:66 — the prompt's refused-filter hook. The prompt now says "our Should-fix 4 (endpoints-auth-routes.json:66 with :71). The same hook creates a scoring tension: the prompt now contains the literal No must-fix. The two requested fixes land as asked and hold against the code; the dropped parenthetical had two homes that also correct its date; the one carried-over stale clause is #30780's declared follow-up. Implemented-by: VERDICT: PASS |
…wn prompt quotes A correct answer may quote the refused `?name=` attempt the prompt names, so `must_not_contain` keeps only the spellings a wrong answer writes (`?ids=`, `?filter=`). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qiby5ktwhsqg839UYDQs
|
domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u Contract reviewServed-tier: Second delta review: two commits on top of ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgmentendpoints-auth-routes.json:71 — Nothing else in the two No must-fix. No new should-fix. Should-fix 3 remains an owed follow-up of #30780, not a finding against this diff. Implemented-by: VERDICT: PASS |
|
domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u 维护者速读
席位意见:契约复审三轮都 PASS,四条建议修改里三条已改,第四条(SKILL.md 第 412 行“没有回收站”已过时)是 #30780 留下的欠账,已有卡 #30847 跟进。可以批准。 席位核对ACCEPT · seat
|
Requested by Tesla · project thread
domain:skills#2 · os-tesla · session_01L9qiby5ktwhsqg839UYDQs
Fixes #30710
Clause-②: no
Metadata-protocol: none
维护者速读
skills/objectstack-api/SKILL.md的 Metadata API 一节补一段:GET /api/v1/meta/:type列表支持?names=a,b,c一次按名字读多条(一个逗号分隔值;没有的名字直接缺席;空值返回 400;package列表拒绝该参数),并且列表只认七个查询参数(package、preview、object、include、id、names、locale),其它参数一律 400VALIDATION_ERROR,不再静默忽略。评测新增第 7 例(三个对象定义合成一次请求),changeset 一条。main上的代码与测试写成。回滚即 revert。skills/objectstack-api/SKILL.md的 Metadata API 段(新段落);同文件三处删减(/data前缀句、Datasources 小节折入 Skill Boundaries 表、RBAC 旁注去掉复述的符号);evals/endpoints-auth-routes.json第 7 例。node scripts/check-skills-token-ratchet.mjs,预期skills/objectstack-api/SKILL.md is 5141 tokens (ceiling 6314),上限行未动;再看packages/rest/src/meta-item-read-gate.ts的META_LIST_QUERY_PARAMS七个键与技能段落一致。skills/**(Tier H),需要受管审批人在 GitHub 上 Approve 一次;之后席位落地。What changes
skills/objectstack-api/SKILL.md, section "Metadata API (/meta)": the two-line "read-side query params are client contracts" paragraph becomes one paragraph that states what the list door serves onmainsince PR #30709:package,preview(draft),object,include(content),id,names,locale(META_LIST_QUERY_PARAMSinpackages/rest/src/meta-item-read-gate.ts), any other key refused400 VALIDATION_ERRORinstead of ignored;?names=a,b,c, one comma-separated value, narrowing the list to the named items the caller may see (chain step 2a runs after the per-caller gate); an unknown name simply absent; an empty value refused400(metaListNames); thepackagelist refusing the key (NAMES_ON_PACKAGE_LIST_MESSAGE, its items are keyed by id);Not taught, on purpose: the repeated-key arity refusal, the located message texts, the
?id=/?object=per-type meaning and the runtime dispatcher twin. The skill names the keys and the one behaviour an author or caller must know; the rest is the route's own text.Growth paid in the same file, by deletion (no re-wrap):
/dataprefix." and "aggregation goes throughPOST /api/v1/data/{object}/querywithgroupBy/aggregationsin the body"/datapath, and the derived-operations table'saggregaterow carries the samequery+groupBy/aggregationsspelling. The negative pins (no/bulk, noGET .../aggregate) stay.## Datasourcessectionrules/datasources.md) and objectstack-platform (Driver Selection Guide, which carries the Turso Cloud/EE caveat). The Skill Boundaries table already routed datasources there; it now names the rule file and gains aPick a driver packagerow, so no pointer is lost.(definePermissionSet)and ", not this one" in the auth asideskills/objectstack-api/evals/endpoints-auth-routes.json: case 7, "three object definitions, one request": expects oneGET /api/v1/meta/object?names=account,contact,lead, must contain?names=//api/v1/meta/object/VALIDATION_ERROR, must not contain?name=,?ids=,?filter=. Added because case 6 already evaluates a request-shape answer (the import body), so a metadata-read case is inside the fixture's convention. The seat may drop it if the convention is read narrower..changeset/30710-meta-list-names-filter.md:'@objectstack/skills': patch, both declaration lines.Readings (os-dev rule for
skills/**):origin/mainb6182249)a2f2be9c)skills/objectstack-api/SKILL.mdlinesskills/objectstack-api/SKILL.mdtokens (check-skills-token-ratchet)skills/*/SKILL.md, linesskills/*/SKILL.md, tokens (gate formula)No ceiling row moves. The eval fixture is measured, not ratcheted (1234 → 1484 tokens).
Why
#30710, a ruling's owed skills follow-up (#29236, ruling 6580261740 letter A): PR #30709 serves
?names=and closes the list's query set, and its body declaresSkills-docs: follow-up #30710. Until the skill says so, an agent reading it sends one request per name and cannot learn that a misspelt filter is refused rather than ignored.Tests
No runtime code changes. The teaching text was read off
main'sMETA_LIST_QUERY_PARAMS,metaListNames,metaListUnknownParamRefusaland the pins inpackages/rest/src/meta-query-arity-doors.test.tsandmeta-list-names-filter.test.tsatc17719dd; nothing is stated that those do not pin.Acceptance notes
skills/objectstack-api/evals/has no runner script in this repo; the fixture is measured bycheck-skills-token-ratchet(population 1b) and parsed as JSON. Case 7 follows the existing shape (id,prompt,expected_output,files,assertions).skills/objectstack-api/**at dispatch time: none (docs(skills): os package install takes -u/--url and -t/--token in the platform skill's operations reference #30821 and docs(skills): teach the stack's push block — direct transport, credentialRef only, relay not yet served #30764 touch objectstack-platform only; Bare-name phase 2: the published authoring skills teach one rule, every metadata name carries the namespace (ruling C on #30798) #30805 declaresskills/**wide but has no PR yet).origin/mainwas merged atb6182249before the final push; no conflict.OS_SKIP_DTS=1on a whole-tree build redscheck:dual-build-cjs-loadson every package'stypescondition and theui/packages'tsc; the reading below comes from a declarations build of./packages/**.Verification
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackagainst the three-file diff. Run twice, every line with stdin closed, exit codes landed first:36b5c9e6(before theorigin/mainmerge): 44 derived families, 44 run, 44 exit 0;--ranreconciliation: 0 NOT-MEASURED, 0 UNRUN.a2f2be9c(the head, after mergingorigin/mainb6182249): 45 derived families (the merge addsscripts/ci/snapshot-next.mjs --self-test), 45 run, 45 exit 0;--ranreconciliation: 0 NOT-MEASURED, 0 UNRUN. Ran lists:skills-seat-2/out/30710-gates-ran-{36b5c9e6,a2f2be9c}.listin the project files.Gate readings at a2f2be9
check-skills-token-ratchet:skills/objectstack-api/SKILL.md is 5141 tokens (ceiling 6314; headroom 1173), exit 0.check:skill-identifier-liveness:Leg 1: 486 citation(s) over 71 published file(s) … Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s), exit 0.check:dual-build-cjs-loads:116 published require entry point(s) across 71 package(s) load; 2456 emitted CommonJS file(s) parse, exit 0 (declarations build of./packages/**).check:lean-entry-closure,pnpm --filter @objectstack/spec run check:skill-docs,check:skill-compatibility,check:skill-frame-sync,check:pm-skill-id-lint,check-changeset-no-major --base origin/main,check-empty-changeset --base origin/main,check-adr-0087-registration --base origin/main,check:pm-governed-merges,check:doc-authoring,check:nul-bytes,check:role-word, the rest: exit 0.dispatch-gates --tieron the three paths:skills/**clause ①,claude-fable-5-1mandated, no one-line exit; this thread runs on it.check-governed-merges --test skills/objectstack-api/SKILL.md: Tier H.CI families (
Lint & Repo Gates,Test Core, the rest) are the PR's check-runs, not re-run locally.Human Minimum
packages/specholds no runtime logic.pnpm lintis CI's run (no source file in the diff).main, one pull request.packages/specnot touched.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_01L9qiby5ktwhsqg839UYDQs