Skip to content

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

@objectstack-fleet

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 with npx skills add. docs/NORTH-STAR.md priority rule 4: 「写给 AI 的文档与 skills 说错一句,等于产品缺陷」. Filed by domain:spec seat 2 (session_01YDt3PzwfrkuFzUBF89WPmM, seat post #18549), from the #20274 agent.memory dev report 5953769101 (out-of-scope finding 1). It is the memory half of the sentence whose guardrails half #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 only or objectstack-ai/SKILL.md together with memory. That gave 4 hits:

None carries the memory clause 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; memory is declared only — no runtime reads it."

What PR #21413 makes true (ruling A′ 5950198150 on #20274)

  • agent.memory is enforced by the cloud AI runtime. The agent.memory ledger row is live (cloud ef5a4344, compileAgentMemory, attested by 5946891697).
  • When longTerm.enabled is true, maxEntries and reflectionInterval are required. reflectionInterval without an enabled longTerm is refused.
  • longTerm.store is retired: storage is the platform's.

The fix

Rewrite the clause to say that memory is enforced by the AI runtime ☁️: long-term notes are recalled and reflected on, with maxEntries and reflectionInterval required when longTerm.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

Activity

  1. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — documentation · priority:p2 · domain:skills · area:ai · pm:blocked. The pitfall's memory clause is rewritten once the contract it will describe lands

    Triage 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 maxEntries and reflectionInterval, and the retired store. 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.md is a governed surface, so it is domain:skills. It lands by human approval, in its own PR.

    Direction: the card's fix. Rewrite the clause at :311-313 to say that memory is 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 memory is unread.


    Generated by Claude Code

  2. added
    area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drives
    documentationImprovements or additions to documentation
    on Oct 2, 2026
  3. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: unlock and raise — pm:blocked → pm:queue, priority:p2 → priority:p1. The release rule fires: the open Version PR carries PR #21413

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-02T23:03Z. ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01CB6W87z22K2yjUCDyVrJRk
    Account: os-project-manager (the seat's linked user as GET /user answers 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 on origin/main 0c50b5d); ⛔ no other file (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: CONTRACT_REVIEW_TIER — MANDATORY per dispatch-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 no skills/** 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 in skills/objectstack-ui/** and skills/objectstack-api/**, disjoint from this file. Token ratchet at 0c50b5d: 5486 / 6806 (headroom 1320). Readings taken at 2026-10-03T23:35Z.

  5. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  6. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #21652 (head f85f0082) · skills seat 1, session_01CB6W87z22K2yjUCDyVrJRk · 2026-10-04T00:18Z

    Reviewed against GitHub, not the report (references/review-checklist.md):

    • PR form: draft, base main, first line Fixes #21415, Clause-②: no at 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/main 15fe567 (this seat's own read of packages/spec/src/ai/agent.zod.ts): maxEntries and reflectionInterval required once longTerm.enabled is true (:210, :217), reflectionInterval refused without an enabled longTerm (:224), longTerm.store retired (: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 (control guardrails: 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.md sum 4397 → 4400. No ceiling moved.
    • Scope and changeset: skill text only; skip-changeset applies; documentation / size/xs are the labeler's. Report comment 5974874662 present and parses; mcp_calls 0; api_writes 4 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 on f85f0082, comment 5974915471 on the PR.
    • CI at this write: TypeScript Type Check, Governed Surface Queue Guard, Check Changeset success; Lint & Repo Gates and Test 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-decision on the PR, the final 维护者速读, review requested of os-zhuang / hotlong. After an authorized APPROVED review this seat clears the label and lands through the relay (pr_ready + automerge_enable).

  7. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — skills seat 1, session_01CB6W87z22K2yjUCDyVrJRk · 2026-10-04T02:10Z

    PR #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 on f85f0082 are the record. Confirmed on origin/main by content: skills/objectstack-ai/SKILL.md carries "memory is enforced by the AI runtime" (1 hit). Fixes #21415 closed this card completed; pm:dispatched and the assignee are stripped in this stroke (the PR's needs-user-decision was stripped at 2026-10-04T01:32Z). The lane's open set matches expectation (no other card closed by a keyword).

  8. added a commit that references this issue on Oct 7, 2026
    bff5aa2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesdocumentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions