Skip to content

skills: data-hooks.md still teaches the deprecated handler first and an unguarded hook condition; formula SKILL has an unguarded example #31131

Open

Description

@objectstack-fleet

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

Filing gate: the out-of-claim sites the #31113 card thread reported and the contract review of PR #31127 (comment 6707646253, S2 and § other sites) confirmed. ⛔ Not a claim. Triage sets the grade and the lane.
class: c (metadata an AI writes from the skill is refused at publish, or uses a deprecated door) · reach: every agent reading the published objectstack-data and objectstack-formula skills.

What is wrong (on main 5f003744; PR #31127 fixed the same errors elsewhere)

  1. skills/objectstack-data/references/data-hooks.md teaches handler first. Inline handler sites at L97, L161, L170 (string ref) above § Sandboxed Hook Bodies (L309), and L739, L817, L845, L890 (string ref) below it; the comparison table at L319. The same file marks handler deprecated (HookSchema: prefer body). After PR docs(skills): guard nullable validation operands, teach hook body, list mailbox / package-registry, drop os generate agent #31127 the skill index and examples teach body; the reference should too, with handler only as the deprecated form.
  2. data-hooks.md L219: the hook condition record.annual_revenue > 1000000 compares a declared-nullable field bare. Hook conditions are a surface of the publish-time null-guard rule (validate-null-guards.ts). Guard it as objectstack-formula/SKILL.md teaches.
  3. data-hooks.md § Capabilities names "Connector recipes" as the route for outbound calls but links nowhere. Link skills/objectstack-automation/references/integration-recipes.md (a record-before-* flow with connector_action); PR docs(skills): guard nullable validation operands, teach hook body, list mailbox / package-registry, drop os generate agent #31127's validation.md now points here for external-API checks.
  4. skills/objectstack-formula/SKILL.md L268: record.amount > 10000 is unguarded inside an os:check block, against the same skill's own rule (L112–L122).

Owed

One text-only PR: body taught first across data-hooks.md (rewrite each example after reading what body receives and which capabilities it needs; a body has no outbound HTTP), the two guards, the link. Correct or add an eval case per site. Both files are token-ratcheted: pay by same-file deletion or the standing ruling.

Level: '@objectstack/skills': patch, Clause-②: no, Metadata-protocol: none.

Related: #31113, PR #31127.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    documentationImprovements or additions to documentation
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 7, 2026
  2. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:skills · 2026-11-07T13:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

    Claim: PM loop round 19 · 2026-11-07T16:51Z
    Session: session_01J8VVAj7CvjkGXvgXzd6RZ7
    Account: huangyiirene
    Branch: claude/project-thread-midtvb (the card thread's designated branch; dev session session_01J8VVAnzH4vvvJVUf6zdYe9)
    Worktree: objectstack-issue-31131
    Domain: domain:skills
    Seat: domain:skills#3
    File surface: skills/objectstack-data/references/data-hooks.md (body-first rewrite of the handler examples, the L219 condition guard, the Connector recipes link, and same-file deletions that pay its budget); skills/objectstack-formula/SKILL.md (the one unguarded os:check example); skills/objectstack-data/evals/*.json and skills/objectstack-formula/evals/*.json (one case per site group, plus any case still rewarding handler or an unguarded nullable comparison); .changeset/*.md; scripts/check-skills-token-ratchet.mjs only by standing ruling 6513306068 for a measured remainder (stop on breach)
    Container & model: M, mode:thread, project-default model, effort: high. dispatch-gates --tier is run by the thread and reported; any mandate above this thread's is waived by the maintainer's standing order in this project (2026-11-03) and said so in the PR body; this seat runs the contract review.
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (published teaching of a deprecated door and of comparisons the publish gate refuses; PR #31127 fixed the same errors elsewhere)
    Thread-read: 6707819308
    Premise: holds on main 620b6e6d per the card's re-read on 5f003744; PR #31152 since cut one line of data-hooks.md, so the thread re-measures every site and the budget before editing.
    Serial constraints: none open (PR #31127 and PR #31152, which touched these files, are merged). The seat runs serially (one card) by the maintainer's word of 2026-11-07.

    Changeset '@objectstack/skills': patch. Fixes #31131. Tier read by check-governed-merges at the PR.

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 7, 2026
  5. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

    Claim widened (card thread's measurement, confirmed by the seat on main) · 2026-11-07T16:56Z

    Same file, skills/objectstack-data/references/data-hooks.md, adds three corrections. Nothing is added outside that file and the evals already claimed.

    • The ctx.api.object(name) method table and the api.write capability row (≈L390, L392, L442) list upsert, updateMany and deleteMany as callable from a hook body. They are not. The sandbox's ctx.api.object(n) dispatches to the engine's ObjectRepository (packages/objectql/src/engine.ts ≈L10079), whose members are find, findOne, insert, create, update, updateById, delete, deleteById, count and aggregate. Any other name throws ctx.api.object('…').<method> not implemented (packages/runtime/src/sandbox/quickjs-runner.ts ≈L1368). Drop the three names from both tables, and teach the bulk form the repository has (update(data, { where, multi: true }), checked in the engine).
    • Pattern 3's comment that only the sandbox ctx.api adds updateMany goes too, with the rewrite to a body.
    • The schema example's hook condition record.amount > 1000 (≈L105) is guarded with the L219 site, as one site group.

    Seat rulings on the thread's two questions:

    • Pattern 4 (Data Masking on Read, afterFind) stays an inline handler, retitled to say it is the deprecated form and why: a body writes back only ctx.input, and its ctx.result is a snapshot.
    • The Cross-Object API handler snippet (≈L739) is deleted. Its facts live in § ctx.api.object(name) and in Pattern 2, and the body table names those homes.
  6. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

    Claim widened again (contract review 6710673767 on PR #31201, should-fix S3) · 2026-11-07T17:29Z

    This stays in the same file, skills/objectstack-data/references/data-hooks.md. It covers the same defect as the review's must-fix M1, already on main:

    • Pattern 1 (≈L752) and Pattern 2 (≈L775). In a delete-hook body, ctx.input is {} (the sandbox's flat input exposes only the payload's own keys), so ctx.input.id is undefined. Pattern 1 then counts across every account, and Pattern 2 records an empty id. Key both on ctx.previous.id, as perrow-dispatch-signal.integration.test.ts teaches for the bulk path.
    • The prose that says input.id names the row (≈L54, L252, L266). Scope it to the inline handler context, and give ctx.previous.id as the body's key on bulk, by-where and delete paths. One clause each, paid by same-file deletion.

    Nothing is added outside this file and the claimed evals.

    Out of claim, to a follow-up card:

    • the unguarded approval-edge conditions in skills/objectstack-automation/references/state-machines-and-approvals.md (≈L90, L128, L133, L135);
    • the unguarded record.amount > 1000 example in packages/spec/src/data/hook.zod.ts (≈L524-526), published to hook.mdx.
  7. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

    ACCEPT → PR #31201 comment 6711029880, head 9b1e9264. Tier H: pm:awaiting-merge, approval requested from os-zhuang and hotlong. Widened twice (6710259290: the body ctx.api table listed methods that throw; 6710683947: body examples keyed on ctx.input.id). Follow-up: #31206 (unguarded approval-edge conditions in the automation skill and the HookSchema.condition example).

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

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions