Skip to content

skills(objectstack-api): the public-form passage names the submit context as { permissions: [guest_portal], anonymous: true } and omits publicFormGrant, the thing that authorizes the submit, so an AI author infers it must declare a guest_portal set #24239

Closed

Description

@objectstack-fleet

Filing gate ①, class (b): a published promise that a public door contradicts. reach: measured by #24130's dev on c564b0e45 (os-dev-report 6244037824 on #24130, out-of-scope finding 2), with two throwaway probes:

  • a dogfood bootStack(crmStack) with and without GuestPortalProfile. Clean and forged POST /api/v1/forms/contact-us/submit both answer 201 { id }, the stored rows are identical, and anonymous GET /api/v1/data/crm_lead answers 401 in both runs;
  • an engine run with the route's context verbatim. A beforeInsert hook sees neither permissions nor anonymous, because the engine builds ctx.session / ctx.user without either key.

Filed by the domain:cli seat 2 (#22648) · marchtian · session session_01QyoWKK9RwUNxBxmevy9Neb, from that report. ⛔ Not a claim. The lane and grade are triage's. skills/** is a governed surface, so this does not ride #24130's PR.

What the skill says (skills/objectstack-api/SKILL.md about :87–:93, origin/main 7be3cc728)

These bypass enforceAuth, run under a synthetic { permissions: ['guest_portal'], anonymous: true } execution context, and are intended for Web-to-Lead / Web-to-Case style flows.

What runs

  • The submit's context is { publicFormGrant: { object }, permissions: ['guest_portal'], anonymous: true }. SecurityPlugin admits on publicFormGrant alone: create plus read-back on that object only, decided before any permission set resolves (packages/plugins/plugin-security/src/security-plugin.ts about :2412). ADR-0056 Option A is the record.
  • The guest_portal name admits nothing. Where a deployment registers a set under it, only its field permissions and capabilities feed the grant's result masker. ADR-0138's fate row (about :509) records the name as keep, for that role.

So an AI that reads the skill infers that the guest_portal set authorizes the submit, and declares one (as the CRM example did; #24130 corrects that example's comments). Or it concludes the form falls open without one. Neither is true.

Done when

Dedupe

MCP search_issues on this repository, closed included:

  • objectstack-api skill form submit guest_portal execution context publicFormGrant omitted gave 5 hits;
  • skills SKILL.md public form guest_portal permission set authorizes anonymous submit docs wrong gave 9 hits.

#24130 is the family, without the skill. #21567 (closed) is this skill's public-form opt-in naming two of three sharing keys, a different defect. #21062, #21476, #21331, #21475 and #6920 are other form defects. None is this passage.

Dedupe words: objectstack-api skill guest_portal context; skill omits publicFormGrant; public form submit authorization skill.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: p2 · documentation · area:access · domain:skills · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-18T02:55Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01QBcLjVCmcWbZEk6qhYMib2
    Account: sunhaolin (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-24239-public-form-grant-skill
    Worktree: objectstack-issue-24239
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: skills/objectstack-api/SKILL.md — the public-form passage only (L87–L89 at 8eccf519: 「These bypass enforceAuth, run under a synthetic { permissions: ['guest_portal'], anonymous: true } execution context, and are intended for Web-to-Lead / Web-to-Case style flows.」), 415 lines, 4642 of 6314 tokens; net line budget +2 for the file, whole-package before/after readings in the PR body; plus one @objectstack/skills patch changeset (stop on breach; explain in the report)
    Container & model: S 级机械卡 by size, handled as M (the judgment is in matching the published promise to the running door), mode:subagent, model: CONTRACT_REVIEW_TIER (--tier --repo objectstack-ai/objectstack skills/objectstack-api/SKILL.md at 8eccf519: MANDATORY — skills/objectstack-api/SKILL.md ⇢ 'skills/**' — clause ① (2026-09-10 ruling, verbatim 「必须 fable的还包括对外发布的skills」); no one-line exemption under this root)
    Clause-②: no
    Responsibility: skills/objectstack-api/SKILL.md (this repository's published skill, shipped by npx skills add objectstack-ai/objectstack/skills) produces the risk | the platform already carries the true text since PR #24237 (9975c26a): content/docs/ui/public-data-collection.mdx and the registerFormEndpoints docstring in packages/rest/src/rest-server.ts | every AI author who installs the skill and declares a public form, today (the CRM example did it, corrected by #24130)
    Thread-read: 6244939176
    Serial constraints cleared: none. No open PR touches skills/objectstack-api/** (every open PR's file list read 2026-10-18T04:57Z); the file was last touched on main by 2c9bf943 (2026-10-17, the version script's frontmatter re-stamp, not an author edit); PR #24237, which the triage grade said this card waits for, is MERGED as 9975c26a — the docs page and docstring it leaves are the text to match.

  3. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch order — posted 2026-10-18T04:59Z by the claiming seat (session_01QBcLjVCmcWbZEk6qhYMib2, sunhaolin, domain:skills#1). The same text is the dev's prompt, run mode:subagent at CONTRACT_REVIEW_TIER (the skills/** path mandate, clause ①).

    Dispatch — issue #24239 (objectstack-ai/objectstack) · domain:skills · PM session_01QBcLjVCmcWbZEk6qhYMib2 (sunhaolin)

    You are the os-dev developer for exactly one card: objectstack-ai/objectstack issue #24239.

    • Read first. Read the card's body and EVERY comment yourself: triage's grade 6244939176, the seat's claim (first line Claim:) and this order. Check that the body is complete before you start.
    • Identity. The PM's Claim: comment is your identity: Branch: claude/issue-24239-public-form-grant-skill, worktree objectstack-issue-24239. Before any edit, verify that the newest Claim: on the card names that branch; on a mismatch, stop and report.
    • Assignees. ⛔ Leave no second claim, ⛔ never write the card's assignee. The PR's assignee is sunhaolin (pr_create with assignees: ["sunhaolin"]).
    • Standard duties live in .claude/agents/os-dev.md and AGENTS.md; this order carries only the increments. Where this order and those files conflict, those files win — say so in the report.
    • Checkout. /home/user/objectstack is at origin/main 8eccf519; shared — ⛔ never edit it; your worktree goes beside it (/home/user/objectstack-issue-24239). Scratch under /tmp/claude-0/-home-user/013ae1a9-5ab1-5fba-849c-7925dbce5c15/scratchpad/issue-24239/.
    • Run everything in the foreground. A round ends only with the report (the JSON, or a blocked report naming what only the PM can resolve).

    1. Ruling — none on this card; the governing record is ADR-0056 Option A and the text PR #24237 left on main

    No maintainer ruling on this card. The published promise must match what runs (NORTH-STAR rule 4: a published or governed text that contradicts the running contract is a product defect). The running contract is recorded: ADR-0056 Option A (the submit is authorized by the form's own declaration through publicFormGrant; SecurityPlugin admits on that grant alone, before any permission set resolves) and ADR-0138's fate row for the guest_portal name (kept, for the result masker only). PR #24237 (card 24130, merged 9975c26a) already rewrote the two platform texts to say so: content/docs/ui/public-data-collection.mdx (the paragraph ending 「The submit route derives a narrow publicFormGrant: { object: 'showcase_inquiry' } — create + read-back of the row it just made, and nothing else.」, about L47) and the registerFormEndpoints docstring in packages/rest/src/rest-server.ts (about L7314–L7331: 「The submit is authorized by the form's own declaration (ADR-0056 Option A) … The submit's context also names guest_portal in permissions. That name admits nothing. …」). The skill is the third text and still says the old thing.

    Deliverable: ONE draft PR to main. Body line 1 Fixes #24239, line 2 Clause-②: no. One published file, skills/objectstack-api/SKILL.md, the public-form passage (L87–L89 today: 「These bypass enforceAuth, run under a synthetic { permissions: ['guest_portal'], anonymous: true } execution context, and are intended for Web-to-Lead / Web-to-Case style flows.」), rewritten so that:

    1. it names publicFormGrant (scoped to the form's target object; create plus read-back of the row it made, nothing else; decided before any permission set resolves) as what authorizes the submit;
    2. it says what the guest_portal name does and does not do: it admits nothing; where a deployment registers a permission set under it, only that set's field permissions and capabilities feed the grant's result masker;
    3. it stops implying that an author must declare a guest_portal set, and stops implying that the form falls open without one;
    4. it keeps everything else in the passage that is still true (the field allow-list, the beforeInsert defaults hook, the walled-posture withholding, the contract pointers) — read the docs page and the docstring as main has them and keep the three texts saying the same thing in the skill's own register (an author-facing skill, terse, imperative);
    5. net line budget for the file: +2 lines at most (415 lines today); token ceiling 6314 (4642 today, node scripts/check-skills-token-ratchet.mjs); the PR body reports the two readings os-dev.md requires for skills/** (the file's before/after line and token counts, and the whole package's — every SKILL.md under skills/ summed). ⛔ No new section, no new example, no expansion beyond the sentence the card names: a small correction, not a rewrite. 预期落点是 skills/objectstack-api/SKILL.md。若实测表明真正的生产者在别包,直接按生产者侧修,落点与理由写进报告和 PR 正文。

    Changeset: skills/** publishes through @objectstack/skills (packages/skills): one .changeset/24239-public-form-grant-skill.md, '@objectstack/skills': patch, body shaped like .changeset/23983-previous-null-on-insert.md on f1c0b5784 (a docs(skills): first line naming the file and the corrected claim, then Clause-②: no, then one paragraph of what was wrong and what the text says now — text only, nothing an author writes changes). ⛔ Not skip-changeset.

    Tier H governed (skills/**): the PR body carries ## 维护者速读(草稿) (five fixed parts: 改了什么 / 为什么改 / 风险与代价(含回滚) / 席位意见 left empty / 你要做的), in Chinese, from the business angle. Stay draft: the seat reviews the head in seat at CONTRACT_REVIEW_TIER, then requests review from the two approver accounts; the landing waits for their word. The PR body ends with the session-URL attribution footer (AGENTS.md's form).

    2. PM mechanism assumptions — measure first; falsify and report where wrong

    • (a) The passage is the only place in the published catalog that says it. The seat's grep at 8eccf519: grep -rn "guest_portal\|publicFormGrant" skills/ → one hit, skills/objectstack-api/SKILL.md:88; control grep -rn "enforceAuth" skills/ hits. Re-run both; if another skill file carries the same claim, it is the same defect in the same family — fix it in this PR only if it is the same sentence (a mechanical in-place fix, no new file surface beyond skills/**), otherwise list it for the seat.
    • (b) What runs, measured by card 24130's dev (os-dev-report 6244037824 on that card, out-of-scope finding 2): a clean and a forged submit both answer 201 { id } with and without a GuestPortalProfile; an engine-side beforeInsert hook sees neither permissions nor anonymous. Do not re-measure the runtime; read packages/plugins/plugin-security/src/security-plugin.ts around the publicFormGrant admission (about L2412) only to quote the behaviour correctly.
    • (c) Gates that read this file (the seat's derivation lists 31 commands, among them pnpm --filter @objectstack/spec run check:skill-docs, node scripts/check-skills-token-ratchet.mjs, pnpm check:skill-compatibility, pnpm check:skill-identifier-liveness, pnpm check:corpus-claim-drift, pnpm check:doc-authoring, pnpm check:role-word): check:skill-docs may regenerate skills/objectstack-api/references/_index.md (generator-owned); if it does, commit the regenerated file and say so — it is not an author edit.
    • (d) The file's last main touch, 2c9bf943 (2026-10-17), is the version script's frontmatter re-stamp, not an author edit; the passage itself was last authored earlier. 基于合并后的代码工作,issue 引用的片段可能已变,先核对当前 main。
    • (e) Writes: REST proxy through scripts/pm/ tools only; budget 3 (git push, pr_create with assignee, the os-dev-report comment); report api_writes (count + endpoints) and mcp_calls (count + tool names; a write tool in the list means the report is refused).

    3. PM suggested route — optional; measurement wins

    • Replace the three lines with a sentence pair of the same length class: 「These bypass enforceAuth. The submit is authorized by the form's own declaration: the route hands the engine a publicFormGrant scoped to the form's target object (create plus read-back of the row it made, nothing else, decided before any permission set resolves). The context also names guest_portal; that name admits nothing — a permission set registered under it only feeds the grant's result masker. Intended for Web-to-Lead / Web-to-Case style flows.」 — then keep the rest of the paragraph as is.
    • Keep the two node_modules/@objectstack/spec/... contract pointers; add no third pointer unless the sentence needs one and it costs no line.

    4. Verification you owe

    Derive at 8eccf519: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack skills/objectstack-api/SKILL.md. After the FINAL commit re-derive with no paths, run the local subset, capture each exit code before any pipe, reconcile with --ran, and quote git rev-parse --short HEAD in the report and the PR body. Report line_budget (the file and the package, before/after, lines and tokens).

    5. Report

    Terminal JSON per os-dev.md, first as an os-dev-report issue comment (the plain-text marker on its own first line, ⛔ no HTML comment, ⛔ no angle-bracket fragments anywhere in the comment). Machine-checkable: gates, line_budget, deviations, files_changed. Your final message to the PM is that same JSON and nothing else.

    Four-axis framework (SKILL.md 〈升级与决策〉 lines 241–261 on origin/main 8eccf519, SKILL.md last touched bd4276a91, md5 abff5f852c8fd09b79ec0623439aa4f0) — pasted verbatim; use it for any open_questions

    每个方案必须沿四条固定评估轴分析,这是决策分析的核心原则,不是可选项:

    • 实际业务需求 — 它服务的是真实存在的业务场景,
      还是投机性能力面?判据要求实测(谁在写这个键、谁在读、
      示例应用与真实部署的用法),「读起来像有用」不作数。这条轴会改变结论,不是陪衬。
    • 项目长远合理性 — 哪个方案符合北极星方向与可持续架构(no workarounds、
      contract-first),临时补丁式选项要明说长期代价。
    • 防 AI 写代码犯错,尤其是防 AI 写元数据 app 犯错 — 哪个方案让 AI 在结构上更难写错:
      契约收紧(严格 schema、publish 时响亮拒绝)优于消费端宽容(?? 回退、静默容错)——
      宽容恰是 AI 批量犯错被掩盖的温床;声明即强制,绝不让 AI 声明一个运行时不兑现的能力。
    • 创业阶段不扩散需求 — 创业阶段聚焦原则:创业项目先专注核心能力,能力扩张默认
      从紧,无拉动的声明面按 implementation-first 处置,已发布零消费能力不因沉没成本豁免。
      过渡也从紧 —— 创业阶段不渐进:废弃别名/拼写与能力退役默认立即退休,无分阶段
      窗口、无双拼写宽限;staged 仅凭具名外部用户证据方可荐。新增门禁默认否:门禁是只减
      不增的零件,例外只有维护者点名;荐新增门禁须引其点名原话,否则荐「不加」。

    基本裁决原则:spec 声明 > 实现 > 文档面;声明而未兑现是实现缺口,补实现或退役,
    ⛔ 不在消费端收窄;未声明键随实现,文档随之。「声明即强制」只及 spec 与元数据契约、
    运行时能力,⛔ 不及 AGENTS.md 这类给 agent 读的约定 —— 那些的读者是 agent,不是门禁。
    推荐意见必须基于这四条轴给出理由;四轴冲突时如实呈现权衡,
    交维护者拍板。


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24239,
      "status": "done",
      "branch": "claude/issue-24239-public-form-grant-skill",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24262",
      "session": "session_01QBcLjVCmcWbZEk6qhYMib2 — this run is a mode:subagent dev of that seat; the harness-stamped id is the parent's",
      "premise_still_valid": true,
      "summary": "Premise verified at origin/main 8eccf519: skills/objectstack-api/SKILL.md L87–L89 read exactly as the card quoted (the synthetic guest_portal context, no publicFormGrant), and the catalog grep hit that one line only (control grep enforceAuth: same file, L87). The passage is rewritten in place (3 lines became 5, nothing else moved): the form's own declaration authorizes the submit through a publicFormGrant on its target object (create and read-back of its new row, nothing else), decided before any permission set resolves; the submit context's guest_portal name admits nothing and needs no set; a set so named only feeds the grant's result masker; the enforceAuth bypass, the Web-to-Lead / Web-to-Case framing, the allow-list, the beforeInsert hook, the walled-posture withholding and both contract pointers are kept. One @objectstack/skills patch changeset. Draft PR #24262 (Tier H, skills/**) is open with assignee sunhaolin, body line 1 Fixes #24239, line 2 Clause-②: no, the two skills/** readings, the 维护者速读(草稿) section and the session-URL footer; the PR carries a size/s label set by the Auto Label actor, not by me. Head e551e42f; origin/main moved 3 commits past the base (fb6fb24e), none touching skills/**, .changeset/** or a gate in this card's derived list, so the branch was not merged forward.",
      "tests": "No package test exists: @objectstack/skills declares no test or typecheck script (a filtered run matching no script exits 0 and measures nothing, so none is claimed). Its build ran: `pnpm --filter @objectstack/skills build` exit 0 — sync-catalog self-test 9 cases, then 「65 file(s) across 10 skill(s) copied from skills/** into dist/skills and read back byte-identical」; grep -c publicFormGrant packages/skills/dist/skills/objectstack-api/SKILL.md = 1, so the published tarball carries the corrected text (patch, not skip-changeset). No behaviour changed, so no ablation. Mechanism checks: (a) at 8eccf519 `grep -rn \"guest_portal\\|publicFormGrant\" skills/` = 1 hit (skills/objectstack-api/SKILL.md:88), control `grep -rn enforceAuth skills/` = 1 hit (same file :87); (b) the runtime was not re-measured, the wording follows security-plugin.ts's publicFormGrant branch (about :2412) and the registerFormEndpoints docstring; (c) check:skill-docs regenerated nothing — git status clean after it; (d) the last main touch 2c9bf943 is the version re-stamp. Worktree cleaned up after the PR opened (node_modules removed, git worktree remove without --force).",
      "gates": "Head e551e42f. Derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths; change set from the merge base 8eccf519): 43 commands. Each ran as `eval \"$cmd\" > log 2>&1; status=$?` (exit captured before any pipe) and was recorded as `command :: exit N`. 42 exit 0, among them node scripts/check-skills-token-ratchet.mjs (「54 authored bundle file(s) within their ceilings」, this file 4691/6314), pnpm --filter @objectstack/spec run check:skill-docs (「Skill docs in sync」), check:skill-identifier-liveness, check:skill-compatibility, check:skill-frame-sync, check:corpus-claim-drift, check:doc-authoring, check:role-word, check:nul-bytes, check:pm-skill-id-lint, check:pm-governed-merges, check:published-files, check-adr-0087-registration/check-changeset-no-major/check-empty-changeset --base origin/main, check:changeset-gate-self-tests, check:objectui-changeset, check:pm-changeset-deadline-census, check:cross-package-test-inputs, check:merge-driver, check:refd-timer-probe, check:watch-hint-literal, check:gitlink-declared, check:driver-memory-census, check:agent-test-spelling, check-comment-mask-corpus, check-ci-filter-parity, check-closing-keyword-parity, check-doc-route-spelling, the --self-test rows. Two of those 42 first refused PREREQUISITE NOT MET (exit 3): `pnpm --filter @objectstack/lint run check:doc-formula-expressions` and `pnpm check:lean-entry-closure`; after `pnpm exec turbo run build --filter=@objectstack/objectql --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2` under the verify lock (OS_VERIFY_LOCK_SLOT=issue-24239; 「Tasks: 14 successful, 14 total」; 「VERDICT command-exit 0 · held the lock 95s · waited 0s」) both exit 0 (lean-entry-closure: 「Admitted set held exactly (15 packages); 6 denied names absent」); check:dts-closure and check:sourcemap-no-sources-content re-run over those 15 built packages, exit 0 (「75/75 declared declaration file(s) present」; 「105 map(s), none embed source text」) — their whole-tree reading is CI's. 1 NOT MEASURED locally: `pnpm check:dual-build-cjs-loads` exit 3 PREREQUISITE NOT MET (111 packages without dist/ in the fresh worktree; a full-tree build is out of proportion for a five-line text change — declared narrowing, CI's Lint & Repo Gates is the reading of record). `--ran` reconciliation: 「43 derived famil(ies) accounted for — 42 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)」, 0 UNRUN. Not run locally (CI's): test:repo, repo-wide pnpm lint, the type-check lanes, the artifact-roster and wide-population families. PR check-runs on e551e42f at report time (36): completed/success — The card this PR closes must claim this branch, Part-of PR must not also close its card, No other open PR may claim the same single-writer path, No other open PR may claim the same issue, Check PR Size, Check Documentation Links, filter; in_progress — Lint · repo & tooling gates, Lint · docs & code guards, Lint · PM dispatch-gates, Lint · ESLint, Lint · CI, release & engine gates, Lint · scoped · tooling self-tests, Lint · scoped · slot lookup & corpus, Lint · scoped · query-options erasure, Type Check · workspace / source gates / debt ledger / consumer gates, Governed Surface Queue Guard, Check Changeset; queued — Build Core, Test Core (1–6/6), Dogfood Regression Gate, Auto Label; completed/skipped (path filters) — Temporal Conformance, Packed-tarball smoke, Dogfood Verify CLI, Console Pin Gate, Build Docs. Not waited on; a later red comes back as a patch round. Derivation stale-tree note: the two derived-from files that changed on main across the 3 commits (scripts/check-route-envelope.mjs, one ADR anchor) belong to families this card's paths do not name and are not among the 43.",
      "line_budget": {
        "file": "skills/objectstack-api/SKILL.md: 415 → 417 lines (+2, the order's budget is +2); 4642 → 4691 tokens (+49; ceiling 6314, check:skills-token-ratchet green). Widest new line 82 chars = the file's existing prose maximum (L180). No re-wrap used to pay for lines.",
        "package": "every SKILL.md under skills/ (10 files) summed: 4392 → 4394 lines (+2); 52555 → 52604 tokens (+49). Token convention = the ratchet's (ceil(utf8 bytes / 4), release-stamp version: line unpriced); the before reading reproduces the order's 4642.",
        "tree_before": "8eccf519 (origin/main at dispatch)",
        "tree_after": "e551e42f (the PR head)"
      },
      "mcp_calls": "0 — no MCP GitHub tool was called. Reads: `gh api` GET on the card, its comments, PR #24237, PR #24262 and the head's check-runs (REST reads, no write). Writes: scripts/pm/with-fleet.sh --via dispatch only.",
      "api_writes": "2 relay strokes, 3 REST requests, all as objectstack-fleet[bot] through scripts/pm/with-fleet.sh --via dispatch (fleet-write relay): stroke fw-20261018T052627Z-2302e4 / run 39100554474 = POST /repos/objectstack-ai/objectstack/pulls (pr_create, draft forced, body read back identical 10566 bytes) + POST /repos/objectstack-ai/objectstack/issues/24262/assignees (the create's assignee leg; the pull lists sunhaolin); this os-dev-report = POST /repos/objectstack-ai/objectstack/issues/24239/comments (comment op). No label write (the order named none; not skip-changeset). git pushes: 2 (the empty-branch probe, then the one commit), not REST.",
      "open_questions": [
        {
          "question": "Order item 2 also wanted the passage to say WHICH parts of a registered guest_portal set reach the masker (its field permissions, and the capabilities held against a field's requiredPermissions). That clause did not fit the +2 line budget (it costs a sixth line); the passage says 「a set so named only feeds the grant's result masker」 and the docs page carries the detail. Keep as landed, or spend one more line?",
          "options": [
            "A — keep as landed (+2 lines, +49 tokens); the clause stays on the docs page the passage already sits beside",
            "B — a patch round adding the clause at +3 lines (needs the seat to raise the file budget to +3; token ceiling has room: 4691/6314)"
          ],
          "recommendation": "A, because the author-facing fact is 「the name admits nothing and needs no set」, which is in; the masker detail is a deployment-side nuance the docs page owns, and a published skill pays its lines in every customer context window."
        }
      ],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed (PR Acceptance notes): the skill no longer names `anonymous: true` on the submit context — the key has no reader (card #24130's measurement: zero non-test property reads of `anonymous` in packages/), so the skill stops teaching it; no card.",
        "carrier: none · noted, not filed (PR Acceptance notes): the docs page's clause on which parts of a registered guest_portal set the masker reads is not in the skill (line budget) — see open_questions."
      ],
      "deviations": [
        "check:dual-build-cjs-loads recorded exit 3 (PREREQUISITE NOT MET: 111 packages unbuilt) and was not satisfied locally — declared narrowing; CI's Lint & Repo Gates is the reading of record.",
        "origin/main was not merged into the branch before opening the PR (AGENTS.md §10): the 3 commits past 8eccf519 touch no file of this PR and no gate in its derived list; the derivation's stale-tree warning is quoted in the PR body.",
        "The harness attribution reminder asked for a model-named Co-Authored-By trailer; the commit carries the model-free pair os-dev.md and AGENTS.md require (Claude-Session URL + Co-authored-by: Claude), and the pre-push hook confirmed 「no model identifier in the trailer pair」. The PR body footer is AGENTS.md's session-URL form, not the harness's.",
        "The PR carries a size/s label written by the Auto Label actor after creation; not set by me, not touched.",
        "Order item 2's 「field permissions and capabilities」 clause is not in the passage (line budget) — see open_questions."
      ],
      "files_changed": [
        "skills/objectstack-api/SKILL.md",
        ".changeset/24239-public-form-grant-skill.md"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #24262 comment 6246201211

    Seat domain:skills#1 · session_01QBcLjVCmcWbZEk6qhYMib2 (sunhaolin) · 2026-10-18T05:42Z · head e551e42f · in-seat contract review PASS 6246139662 (CONTRACT_REVIEW_TIER) · Tier H (skills/**): the PR stays draft with needs-user-decision, review requested from os-zhuang and hotlong; the seat lands it on an authorized APPROVED review. The dev's one open question (a third line for the masker's inputs) is answered A, keep as landed.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — PR #24262 merged by the queue at 2026-10-18T06:44Z (squash commit 53ef7524368075a1f64003b9dfb1609d3d206d69, 1 parent; merged_by is os-zhuang, who approved (review 5561747067 on the same head e551e42f), readied and armed it by hand at 06:30Z; the seat cleared needs-user-decision and its relay ready/arm strokes were idempotent repeats). Probe table, read 2026-10-18T06:45Z by the seat (domain:skills#1, session_01QBcLjVCmcWbZEk6qhYMib2):

    probe reading
    queue branch gh-readonly-queue/main/pr-24262-* absent — git ls-remote origin 'refs/heads/gh-readonly-queue/*' lists no ref for it
    origin/main by content tip 53ef7524; skills/objectstack-api/SKILL.md carries publicFormGrant ×1 and is 417 lines; .changeset/24239-public-form-grant-skill.md is on main (its sentence rides the next Version Packages PR)
    card closed completed by the PR's Fixes line at 2026-10-18T06:44Z; the lane's closed-since-06:20Z set is this card only — expected, no stray closing keyword
    harness shared checkout fast-forwarded to 53ef7524; check-harness-current.mjs CURRENT

    State change this act: pm:dispatched removed (read back); domain:skills, priority:p2, area:access, documentation stay (ownership, not state); the subscribe_pr_activity watch on PR #24262 ended at the merge. Tier H landing record: in-seat contract review PASS 6246139662, 席位核对 6246201211, needs-user-decision cleared and the PR readied and armed by the seat after the approval. The published skill text now matches content/docs/ui/public-data-collection.mdx and the registerFormEndpoints docstring.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsdocumentationImprovements or additions to documentationdomain:skillspriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions