Repository navigation
finding(skills): objectstack-ai's Common Pitfalls says "memory is declared only — no runtime reads it"; once PR #21413 lands, the cloud AI runtime enforces it and the spec refuses its old shapes #21415
Description
Activity
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsTriage: first grade —
documentation·priority:p2·domain:skills·area:ai·pm:blocked. The pitfall'smemoryclause is rewritten once the contract it will describe landsTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-02T13:59Z. ⛔ Not a claim, ⛔ not a dispatch.Blocked-by: #20274
Why p2. It matches its sibling #21392. It is a class (c) teaching error in published
skills/**, which NORTH-STAR rule 4 counts as a product defect.Why blocked, unlike #21392. The rewrite states the contract PR #21413 (#20274, ruling A′) makes true: the required
maxEntriesandreflectionInterval, and the retiredstore. Landed before that PR, the new text would describe a spec that does not yet refuse. So it ships after #20274 closes, in the same release.Routing.
skills/objectstack-ai/SKILL.mdis a governed surface, so it isdomain:skills. It lands by human approval, in its own PR.Direction: the card's fix. Rewrite the clause at
:311-313to say thatmemoryis enforced by the AI runtime ☁️, as described above. Keep the pitfall's point that none of these is a gate. Nothing else changes.Release coupling: when #20274 closes, this card is unlocked and, under the release rule, goes to p1 if a Version Packages PR carrying PR #21413 is open. The skill must not ship telling authors
memoryis unread.
Generated by Claude Code
- addedarea:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesdocumentationImprovements or additions to documentationImprovements or additions to documentationpriority:p2Medium: important, M3Medium: important, M3
on Oct 2, 2026 objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsTriage: unlock and raise —
pm:blocked→pm:queue,priority:p2→priority:p1. The release rule fires: the open Version PR carries PR #21413Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-02T23:03Z. ⛔ Not a claim, ⛔ not a dispatch.- The blocker: ai:
guardrails,memory,structuredOutput,lifecycleandtool.outputSchemaare enforced by the agent runtime (5 keys), starting with the guardrails the built-in agents already declare #20274 closedcompletedat 2026-10-02T22:53Z. Its spec half, PR feat(spec)!: an agent's memory contract states exactly what the runtime honours — maxEntries and reflectionInterval are required once long-term memory is enabled, longTerm.store is retired, and the block is live #21413, merged at 2026-10-02T14:33Z as22c2d6f4d5. Both were read at this write. No newer condition is on this card (5954103066is its only transition). - The raise, as my grade said it would ("goes to p1 if a Version Packages PR carrying PR feat(spec)!: an agent's memory contract states exactly what the runtime honours — maxEntries and reflectionInterval are required once long-term memory is enabled, longTerm.store is retired, and the block is live #21413 is open"): Version PR chore: version packages #21352 (17.7.0) is open at
f872ccf116, built on53fd35e3e3. That base contains22c2d6f4d5, read now by compare: 16 ahead, 0 behind.- So the next release ships the
memorycontract. - This skill clause must ship with it, under the maintainer's 「发版本优先的都p1」.
- So the next release ships the
- Unchanged: the direction in
5954103066. Rewriteskills/objectstack-ai/SKILL.md:311-313; it is governed, with a human merge.
Generated by Claude Code
- The blocker: ai:
- addedpriority:p1High: required for production / M2High: required for production / M2and removedpriority:p2Medium: important, M3Medium: important, M3
on Oct 2, 2026 objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01CB6W87z22K2yjUCDyVrJRk
Account:os-project-manager(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-21415-ai-skill-memory-enforced
Worktree:objectstack-issue-21415
Domain:domain:skills
Seat:domain:skills#1
File surface:skills/objectstack-ai/SKILL.md— the Common Pitfalls 1 clause only (about :311–313 onorigin/main0c50b5d); ⛔ no other file (stop on breach; explain in the report)
Container & model:M,mode:subagent,model: CONTRACT_REVIEW_TIER— MANDATORY perdispatch-gates --tier --repo objectstack-ai/objectstack skills/objectstack-ai/SKILL.md, which prints "skills/objectstack-ai/SKILL.md ⇢ 'skills/**' — clause ①"; Tier H landing (an authorized APPROVED review, then this seat lands)
Clause-②: no
Thread-read: 5962837991
Serial constraints cleared: none — the five open objectstack PRs (read at 2026-10-03T23:20Z) touch noskills/**path; no in-flight claim in the lane; same-day churn none (last touch 125ce9f, PR #21302); the two sibling p1 claims of this round (#21537, #21567) stay inskills/objectstack-ui/**andskills/objectstack-api/**, disjoint from this file. Token ratchet at 0c50b5d: 5486 / 6806 (headroom 1320). Readings taken at 2026-10-03T23:35Z.objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 21415, "status": "done", "branch": "claude/issue-21415-ai-skill-memory-enforced", "pr": "https://github.com/objectstack-ai/objectstack/pull/21652", "session": "session_01CB6W87z22K2yjUCDyVrJRk", "premise_still_valid": true, "summary": "Rewrote the `memory` clause of Common Pitfalls 1 in skills/objectstack-ai/SKILL.md (one commit, f85f0082): it now says `memory` is enforced by the AI runtime ☁️ too — long-term notes are recalled and reflected on, `maxEntries` and `reflectionInterval` are required once `longTerm.enabled` is true, there is no storage backend to choose — and neither is a gate; the following 'For a gate that is **enforced**, use …' sentence and the rest of the pitfall are untouched. Every PM premise held on origin/main: the clause read 'declared only — no runtime reads it' (exactly one hit; control word `guardrails` hit), packages/spec/src/ai/agent.zod.ts carries the three refusals (LONG_TERM_STORE_RETIRED :196, MAX_ENTRIES_REQUIRED :210, REFLECTION_INTERVAL_REQUIRED :217, REFLECTION_INTERVAL_WITHOUT_LONG_TERM :224; refinement checkAgentMemoryContract :242–259), PR #21413's commit 22c2d6f4 is an ancestor of origin/main (is-ancestor exit 0) and of Version PR #21352's base 36ad3210d4 (REST compare ahead 112 / behind 0; that PR's head moved f872ccf116 → 015a5e3815 since the dispatch, untouched by me). One reading moved: origin/main advanced 0c50b5df → 15fe567c (#21642, packages/spec/src only) during my fetch, so the branch is cut at 15fe567c; the skill file is byte-identical between the two commits, so every 0c50b5df reading carries over. Draft PR #21652 opened via the fleet-write relay (body stored 7463/7463 bytes, read back: draft, one session-URL footer, Clause-②: no on its own line), `skip-changeset` + assignee os-project-manager written by label-write.mjs and read back matching. Left draft; Tier H landing is the seat's after an authorized approval.", "tests": "Gate list derived in the worktree at f85f0082 with `node scripts/pm/dispatch-gates.mjs --commands` (no paths; merge base 15fe567c; 1 path, committed): 24 commands, identical to the dispatch's list; all exit 0; `--ran` with exit codes recorded: 'Run reconciliation — 24 derived, 24 run, 0 NOT-MEASURED, 0 UNRUN … a DERIVED zero — all 24 recorded an exit code and none of them is 3'. Verdict lines: check-skills-token-ratchet 'skills/objectstack-ai/SKILL.md is 5539 tokens (ceiling 6806; headroom 1267)' + '--self-test: 65 cases pass'; check:skill-docs '✅ Skill docs in sync', run after `pnpm --filter @objectstack/spec build` under os-verify-lock.sh ('VERDICT command-exit 0 · held the lock 127s · waited 134s'); check:doc-formula-expressions first answered exit 3 PREREQUISITE NOT MET (@objectstack/formula / @objectstack/lint unbuilt — nothing measured, not a failure), then after `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under the lock (VERDICT command-exit 0) '✓ 22 record-scoped formula example(s) across 460 files / 1381 TS blocks judged clean'; check-skill-identifier-liveness 'OK — Leg 1: 457 citation(s) over 53 published file(s) checked against 118371 implementation word tokens (0 ledgered exemption(s)); Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s)'; doc authoring guard '17369 customer-facing string(s) across 1256 spec sources clean — no internal issue-id references'; check-nul-bytes 'OK (scanned 10022 text file(s) … no raw ASCII control bytes)' plus `grep -naP` control-character scan of the edited file: 0 hits; check-skill-compatibility-version '10 SKILL.md file(s) reconciled against 80 workspace packages'; check-closing-keyword-parity 'OK (3 parsers agree on all 9 keywords and both measured separators …)' + self-test '40 assertions, 5 mutations … driven to red'; comment-mask corpus sweep '8119 files, 0 disagree, 0 unparseable'; check-corpus-claim-drift 'OK, no new claim sites beside a pinned spelling'; check-role-word 'OK, no new occurrences of the reserved word'; check-ci-filter-parity, check-doc-route-spelling (--advisory 'population clean' + --self-test), check-agent-test-spelling '0 violations', cross-package-test-inputs 'OK: 30 package(s) read outside themselves, all declared', driver-memory-census 'OK', gitlink-declared, pm-governed-merges, refd-timer-probe 'OK', skill-frame-sync, watch-hint-literal — all exit 0. No ablation: a docs-only clause rewrite has no runtime path to ablate. No package test/typecheck owed: the diff touches no package, so the ① dependency closure is empty. Working tree clean after all builds (`git status --porcelain` empty); local HEAD == remote head f85f0082.", "mcp_calls": "0 — no MCP tool was called. GitHub reads were REST via `gh api` (issue 21415, its comments, PR 21352, compare 22c2d6f4...36ad3210d4, PR 21652 read-back, check-runs on f85f0082); all writes went through scripts/pm/.", "api_writes": "4 REST writes, carried by 3 fleet-write relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches, each executed as objectstack-fleet[bot], conclusion success): ① pr_create → POST /repos/objectstack-ai/objectstack/pulls (#21652, draft forced by the relay; run 37163904629); ② label-write.mjs → labels_add POST /repos/objectstack-ai/objectstack/issues/21652/labels (skip-changeset) + assign POST /repos/objectstack-ai/objectstack/issues/21652/assignees (os-project-manager); run 37163946768; ④ read-back MATCHES; ③ comment → POST /repos/objectstack-ai/objectstack/issues/21415/comments (this report). Plus `git push` ×2 (not REST): the empty-branch probe and f85f0082. No PATCH, no PUT, no MCP.", "open_questions": [], "out_of_scope_findings": [], "gates": { "derivation": "node scripts/pm/dispatch-gates.mjs --commands at f85f0082 (no paths; change set from git vs merge base 15fe567c: 1 path) → 24 commands, same set as the dispatch; --ran reconciliation 24/24 run, 0 NOT-MEASURED, 0 UNRUN with exit codes recorded", "local": "24/24 exit 0 (see tests); check:doc-formula-expressions needed a formula+lint build first (its first run exit 3 = PREREQUISITE NOT MET, recorded as not measured, then rerun exit 0)", "ci": "in_progress at report time (head f85f0082): 33 check runs — 13 success, 11 skipped, 9 in_progress; required contexts seen: Lint & Repo Gates in_progress, Governed Surface Queue Guard success, Dogfood Regression Gate success, Build Core skipped, Temporal Conformance skipped; TypeScript Type Check and Test Core not among the 33 at read time" }, "line_budget": { "file": "skills/objectstack-ai/SKILL.md: 418 → 421 lines (5 insertions, 2 deletions; net +3; budget ≤ +3)", "package": "all skills/**/SKILL.md summed: 4397 → 4400 lines", "tokens": "check-skills-token-ratchet: 5486 → 5539 / ceiling 6806 (headroom 1320 → 1267); no ceiling moved" }, "deviations": [], "files_changed": [ "skills/objectstack-ai/SKILL.md" ] }
Generated by Claude Code
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsACCEPT — PR #21652 (head
f85f0082) · skills seat 1,session_01CB6W87z22K2yjUCDyVrJRk· 2026-10-04T00:18ZReviewed against GitHub, not the report (
references/review-checklist.md):- PR form: draft, base
main, first lineFixes #21415,Clause-②: noat line start; no closing keyword beside another card number; one session-URL footer. Files:skills/objectstack-ai/SKILL.md+5/−2, the claimed surface and nothing else. - Text vs
origin/main15fe567 (this seat's own read ofpackages/spec/src/ai/agent.zod.ts):maxEntriesandreflectionIntervalrequired oncelongTerm.enabledis true (:210, :217),reflectionIntervalrefused without an enabledlongTerm(:224),longTerm.storeretired (:196), the refinement at :242 wired at :550. The clause states exactly those facts, keeps "neither is a gate", and the following sentence is untouched.git grep "declared only"on the head: 0 hits in the skill (controlguardrails: 2 hits). - Readings off the PR head blob (this seat's own): 418 → 421 lines (+3, the budget); 5486 → 5539 tokens (ceiling 6806); catalog
SKILL.mdsum 4397 → 4400. No ceiling moved. - Scope and changeset: skill text only;
skip-changesetapplies;documentation/size/xsare the labeler's. Report comment 5974874662 present and parses;mcp_calls0;api_writes4 as listed; deviations none; out-of-scope findings none. - Release coupling (the p1): the open Version Packages PR chore: version packages #21352 carries PR feat(spec)!: an agent's memory contract states exactly what the runtime honours — maxEntries and reflectionInterval are required once long-term memory is enabled, longTerm.store is retired, and the block is live #21413's contract; this PR touches neither it nor any changeset file.
- Value density (read from the customer-agent seat): one clause, three facts an author must get right, no restatement of the gate's internals. Accepted.
- Contract review record (
skills/**, governed rule text): PASS onf85f0082, comment 5974915471 on the PR. - CI at this write:
TypeScript Type Check,Governed Surface Queue Guard,Check Changesetsuccess;Lint & Repo GatesandTest Core (1/6)in progress — read again before the four-piece and at landing.
Landing: Tier H (
skills/**). The PR stays draft. Once the required jobs are green:needs-user-decisionon the PR, the final 维护者速读, review requested ofos-zhuang/hotlong. After an authorized APPROVED review this seat clears the label and lands through the relay (pr_ready+automerge_enable).- PR form: draft, base
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsLanded — skills seat 1,
session_01CB6W87z22K2yjUCDyVrJRk· 2026-10-04T02:10ZPR #21652 MERGED through the queue at 2026-10-04T01:50Z as
bff5aa2d(one parent: squash), approved, readied, auto-merged and enqueued by os-zhuang himself (2026-10-04T01:24Z to 2026-10-04T01:25Z), so the seat's landing stroke was not needed; in-seat contract review PASS 5974915471 and ACCEPT 5974931875 onf85f0082are the record. Confirmed onorigin/mainby content:skills/objectstack-ai/SKILL.mdcarries "memoryis enforced by the AI runtime" (1 hit).Fixes #21415closed this cardcompleted;pm:dispatchedand the assignee are stripped in this stroke (the PR'sneeds-user-decisionwas stripped at 2026-10-04T01:32Z). The lane's open set matches expectation (no other card closed by a keyword).- added a commit that references this issue
on Oct 7, 2026
Filing gate: ① a defect, class (c), a teaching error in published text an AI author reads.
reach:the exception for wrong text that ships:skills/**goes out withnpx skills add.docs/NORTH-STAR.mdpriority rule 4: 「写给 AI 的文档与 skills 说错一句,等于产品缺陷」. Filed bydomain:specseat 2 (session_01YDt3PzwfrkuFzUBF89WPmM, seat post #18549), from the #20274agent.memorydev report5953769101(out-of-scope finding 1). It is thememoryhalf of the sentence whoseguardrailshalf #21288 fixed through PR #21302. ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.Who acts on it: the
skills/**lane. It is a Tier H surface and lands by human approval in its own PR. It should ship in the same release as PR #21413. Neither publishes on merge: the release is the Version Packages PR.Dedupe: the ~1,000 most recently updated issues and PRs here, open and closed, were listed by REST and grepped for
declared onlyorobjectstack-ai/SKILL.mdtogether withmemory. That gave 4 hits:guardrailsflip);guardrailsas unenforced andoutputSchemaas never validated; the cloud AI runtime now enforces both (objectstack-ai SKILL.md, actions.mdx) #21288 (closedcompleted; theguardrails/outputSchematext);memoryclause becausememorywas then unenforced);None carries the
memoryclause after the change.The position (read at
main)skills/objectstack-ai/SKILL.md:311-313, Common Pitfalls 1: "… but it is a limit, not an approval;memoryis declared only — no runtime reads it."What PR #21413 makes true (ruling A′
5950198150on #20274)agent.memoryis enforced by the cloud AI runtime. Theagent.memoryledger row islive(cloudef5a4344,compileAgentMemory, attested by5946891697).longTerm.enabledis true,maxEntriesandreflectionIntervalare required.reflectionIntervalwithout an enabledlongTermis refused.longTerm.storeis retired: storage is the platform's.The fix
Rewrite the clause to say that
memoryis enforced by the AI runtime ☁️: long-term notes are recalled and reflected on, withmaxEntriesandreflectionIntervalrequired whenlongTerm.enabled, and no storage backend to choose. Keep the sentence's point that none of these is a gate. Nothing else in the pitfall changes.Generated by Claude Code