Skip to content

[objectos] CLAUDE.md becomes a pointer to AGENTS.md — measure the pair first, then reduce to the pointer #17164

Description

@os-justin

Maintainer direct instruction to the skills seat (session session_01MoTv7pn338AZ71owsp19gQ, GitHub os-justin), given in that PM session's chat on 2026-09-09 at 13:3xZ and 13:4xZ, verbatim, untranslated:

「看一下 hotcrm 的agents.md 写的太乱了。只留下必要的。包括同时同时审核 hotcrm 的skills 任务,合并派发处理。」

「首先要明确 hotcrm 是元数据应用,平台功能应该在 objectstack中开发。 其次 claude.md 是不是直接让他阅读 agents.md 即可,没必要维护两套。所有仓库都有类似的问题」

Program anchor: #17161 (the shape, the four-axis note and the known cost are recorded there once).

This repo: objectstack-ai/objectos

Not readable from the filing session. First step for whoever takes it: attach or clone the repo and measure whether a CLAUDE.md / AGENTS.md pair exists; if only one file exists, the deliverable is to make sure the one Claude Code reads (CLAUDE.md) is a pointer to the one that carries the rules (AGENTS.md), creating the pointer if absent. Same fixed shape as the program: pointer only, no restated rule, gates that read CLAUDE.md adapt in the same PR, governed ⇒ draft PR, human merge. The repo:objectos seat is vacant at filing (objectstack seat posts); this card sits in the skills lane's queue (agent instruction files are that lane's in every repo) until a seat or the maintainer routes it.


Generated by Claude Code

Activity

  1. added theissue type on Sep 9, 2026
  2. self-assigned this
    on Sep 10, 2026
  3. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    Claim: PM loop round 1
    Session: session_01YKEjmbYNvYWJvWGSWx26zK (GitHub os-litant, skills seat), claimed at 2026-09-10T09:03Z
    Branch: claude/issue-17164-claude-md-pointer (in objectstack-ai/objectos)
    Worktree: objectos-issue-17164 (cut from objectos origin/main 6505ac10; the shared shallow clone is /home/user/objectos, attached with push credentials this shift)
    Domain: domain:skills (agent instruction files are this lane's in every repo — program #17161)
    File surface: objectos root CLAUDE.md (new file) only. ⛔ Not AGENTS.md, not content/**, not .github/** — unless a gate reads CLAUDE.md, and none does: grep -rl CLAUDE.md over objectos *.md *.yml *.mjs *.json (node_modules excluded) is empty at 6505ac10, control grep -rl AGENTS.md hits AGENTS.md itself (stop on breach; explain in the report)
    Container & model: S mechanical (a pointer file whose shape the program card fixes; correctness judged by reading), mode:subagent, model: opus (default tier) — dispatch-gates.mjs --tier derives nothing for a card landing in objectos (「A card landing in another repo derives nothing here」); CLAUDE.md is not a clause-① file (SKILL.md / decision-frame copy / os-dev.md / skills/**); no exit taken.
    Clause-②: no — an instruction-file pointer; no accept set or public surface moves.
    Thread-read: none (0 comments on the card at claim time; body and program card #17161 read in full).
    Serial constraints cleared: objectos has no open PR touching CLAUDE.md and no other claim on this lane names objectos; the two sibling program cards objectstack-ai/cloud#2521 (cloud) and #17165 (www) are not dispatchable (repos unattached) and touch other repos; none.


    Generated by Claude Code

  4. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    Dispatched — R1, 2026-09-10T09:09Z, mode:subagent, default build tier (opus; dispatch-gates.mjs --tier derives nothing for a card landing in objectos, and CLAUDE.md is not a clause-① file). Claim 5616018706 is the dev's identity; branch claude/issue-17164-claude-md-pointer in objectstack-ai/objectos (shared shallow clone /home/user/objectos at 6505ac10, attached with push credentials this shift). Terminal: governed ⇒ draft PR in objectos with ## 维护者速读(草稿), seat review, reviews requested from the two authorised approvers, human merge. Disjoint from #17359 and #17346. Patrol timer trig_012AMK9J7RnbBAeY1WNEtrLA fires 09:49Z.


    Generated by Claude Code

  5. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    os-dev-report

    {
      "issue": 17164,
      "status": "done",
      "branch": "claude/issue-17164-claude-md-pointer",
      "pr": "https://github.com/objectstack-ai/objectos/pull/283",
      "premise_still_valid": true,
      "repo": "objectstack-ai/objectos",
      "summary": "objectos had no CLAUDE.md at all, so Claude Code loaded no instructions in that repo until a reader found the 140-line AGENTS.md unaided; the deliverable was therefore creation, not reduction. Added a 5-line root CLAUDE.md in the program's fixed shape: heading, one bold sentence naming AGENTS.md as the source of truth and requiring it be read in full before the first edit, and one sentence saying one instruction set is maintained in one place with no rule restated or added later. Kept objectstack's second sentence rather than objectui's 3-line shape because AGENTS.md:3 already addresses every agent by name ('Claude Code, Codex, Cursor, etc.'), and a file that did not exist until now is exactly where a future session would start appending Claude-specific rules. No gate reads CLAUDE.md, so nothing adapted; AGENTS.md is byte-unchanged. Draft PR objectos#283, never ready, never approved, no model identifier in the file, commit or PR.",
      "tests": "All run in the worktree at tip f5a7cfa; exit codes captured by redirect-then-capture, never across a pipe. CI job node-floor, both steps: 'node .github/scripts/check-node-floor.mjs --self-test' exit 0 (17 rule / 24 satisfies / 18 range cases, every rule shown able to fail); '... check-node-floor.mjs' exit 0. CI job build, every step except the CI-only artifact upload: 'pnpm install --frozen-lockfile' exit 0; 'node scripts/pm/check-half-states.mjs --self-test' exit 0 (1551 cases); 'node apps/docs/scripts/gen-zh-hant.mjs --check' exit 0 (73 files byte-identical); 'turbo run type-check --continue' exit 0; 'turbo run build' exit 0 (56.3s); 'node .github/scripts/check-locale-surface.mjs' exit 0 (409 sitemap URLs, 0 findings); 'turbo run test' exit 0 (7 self-tests); 'pnpm exec opennextjs-cloudflare build --skipNextBuild' in apps/docs exit 0; 'pnpm exec wrangler deploy --dry-run' exit 0, 58544.29 KiB against a 61440 KiB budget and 65536 KiB limit; preview smoke replicated exit 0 (/docs, /zh-Hans/docs, /llms.txt, /sitemap.xml answered 200, / answered 307), preview torn down by process group at kill time, pid confirmed gone and port 8792 unbound, never pkill by name. ABLATION (input-membership, with rebuild-free turbo dry-run): build and type-check hashes identical with CLAUDE.md present (1d6009513037543d / 59aafae9a3d555c8) and with it removed from disk (same two hashes) - mutation proven on disk by 'test ! -e' plus git status showing ' D CLAUDE.md', restored by 'git checkout HEAD -- CLAUDE.md' and proven by the restored blob 6c157f59 matching the HEAD blob and by 'git diff HEAD' being empty, under a trap on EXIT INT TERM with absolute paths. CONTROL, because an unmoving hash is indistinguishable from a probe that cannot move, and AGENTS.md prescribes this control itself: mutating a real input (content/docs/build/agents.mdx) moved both hashes to feff3b9d25464029 / d19d1f1257870c1b and reverting brought both back to baseline; same restore proof. Predicted direction before running was 'identical', and that is what was observed. LOCAL PREREQUISITE, not a red gate: check-locale-surface.mjs exited 1 before the build existed, printing its own 'run pnpm turbo run build first' - re-run after the build and green.",
      "gates": [
        "objectos CI is the authority here; objectstack's dispatch-gates.mjs was not run because it derives nothing for a card landing in objectos, and objectstack's verify lock was not taken.",
        "ci.yml declares NO paths: filter, so a root-level .md addition DOES trigger both PR jobs - the dispatch's 'if the change triggers no job' branch does not apply.",
        "CI / Node floor: green on the pushed head (check-runs API, conclusion success); both steps also run locally, exit 0.",
        "CI / build: GREEN on the pushed head (check-runs API, conclusion success), converged before this report was finalised; all its steps also ran locally at this tip, exit 0, except the Upload the Worker bundle step (actions/upload-artifact, no local equivalent).",
        "CI converged on head f5a7cfa: 3 check runs - Node floor success, build success, Deploy docs skipped. No red, and nothing left NOT MEASURED on the platform side.",
        "Translations workflow: NOT triggered. Path filters are content/docs/**, apps/docs/lib/i18n.ts, .github/scripts/**, .github/workflows/translations.yml - a root CLAUDE.md matches none. Independently, check-translation-ownership.mjs:53 scopes its population to paths that startsWith('content/docs/') AND carry a locale suffix. Confirmed from the platform too: the head carries exactly 2 check runs, no Translations check.",
        "deploy-docs: push-to-main only, not applicable to a PR.",
        "No label gate exists in objectos: the only label usage in any workflow is deploy-docs.yml creating an ISSUE label on deploy failure, so no label was applied to the PR.",
        "No changeset: objectos has no .changeset/ directory and no changeset tooling, so neither a changeset nor a skip-changeset label exists there to add.",
        "Byte discipline: grep -naP over the new file for control characters found none; the PR body was scanned for angle-bracket-shaped fragments, control characters and model identifiers before sending, all clean."
      ],
      "line_budget": 5,
      "files_changed": [
        "objectstack-ai/objectos: CLAUDE.md (new file, 5 lines) - the only file touched; AGENTS.md byte-unchanged"
      ],
      "deviations": [
        "Attribution: the commit trailer pair is model-free ('Co-Authored-By: Claude') and no model identifier appears in the file, commit or PR, per the standing rule and the dispatch's explicit instruction - this departs from the session-injected attribution string, which names a model.",
        "PR body footer, a measured platform reading: on CREATE (REST POST) the session-URL footer block stored verbatim with nothing appended; on the first REST PATCH the platform APPENDED a second, bare footer, leaving two. Corrected with a single further PATCH sending the body with no footer of my own, after which the stored body carries exactly one (bare) footer - one corrective write informed by the read-back, not a re-paste loop. Both the create and both patches were read back in full.",
        "Local coverage narrowed by exactly one step, declared: 'build / Upload the Worker bundle' was not run because it is an actions/upload-artifact step with no local equivalent. Everything else in both PR jobs ran locally.",
        "Branch protection could not be read: GET /repos/objectstack-ai/objectos/branches/main/protection returns 403 'Resource not accessible by integration', so required-check configuration is unmeasured from this seat. The PR is draft regardless, per the program.",
        "Channel: 0 MCP GitHub calls. A repo-scoped REST probe returned HTTP 200, so card reads, comments, PR creation and check-run reads all went over REST; git handled the rest. No dedup search was needed - the dispatch supplied the program's five sub-issues as given."
      ],
      "mcp_calls": "0 - a repo-scoped REST probe returned 200, so every GitHub read and write went over REST; no MCP GitHub tool was called at any point",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: objectos .github/workflows/ci.yml carries no paths: filter, so a root-level documentation-only PR pays the whole build job - install, Next build, Worker packaging, dry-run weigh-in and a preview boot. The turbo-hash measurement in the PR body shows the compile itself is cache-eligible for such a change, but the packaging, weigh-in and preview steps are not turbo tasks and re-run unconditionally. Runner cost only, no correctness consequence, and the absence of filters is also what guarantees no docs change slips past the build - a trade to weigh, not a defect. Successor who meets it: whoever next edits objectos .github/workflows/ci.yml.",
        "noted, not filed: the program's carried re-pointing pass (comment 5603536959 on objectstack-ai/objectstack#17161) has nothing to collect in objectos - no file in this repo cites CLAUDE.md as the place a rule is stated, measured over the whole tracked tree with a positive control. objectos is also not the last sub-issue of the program; objectstack-ai/cloud#2521 (cloud) and objectstack-ai/objectstack#17165 (www) remain."
      ]
    }

    Generated by Claude Code

  6. os-litant commented on Sep 10, 2026

    @os-litant
    Collaborator

    ACCEPT — objectos PR #283 (head f5a7cfa6) reviewed in-seat (skills seat, session session_01YKEjmbYNvYWJvWGSWx26zK, 2026-09-10T09:29Z).

    • Implemented-by: os-dev subagent on branch claude/issue-17164-claude-md-pointer in objectstack-ai/objectos (claim 5616018706; default build tier; mode:subagent). Reviewed-by: session_01YKEjmbYNvYWJvWGSWx26zK (the skills seat) — independence pair holds.
    • PR shape: draft; base main; first line Fixes objectstack-ai/objectstack#17164 (cross-repo closing reference; no other card number sits beside a closing keyword — #17161 appears only after "Program:"). Changed files read from the PR: exactly one, CLAUDE.md added, +5/−0; AGENTS.md untouched.
    • Diff vs the program shape ([program] CLAUDE.md is a pointer to AGENTS.md in every repo — no second instruction set to maintain (maintainer 2026-09-09) #17161): heading + one bold pointer sentence + one "one instruction set, maintained in one place; ⛔ no rule restated or added" sentence — no rule, no hook roster, no digest; wording in AGENTS.md's own voice. The dev's choice to keep the second sentence (objectstack's shape, not objectui's 3-line shape) is accepted with its reason: AGENTS.md :3 already names every agent, and a file that did not exist is where Claude-specific rules would start accreting.
    • Measurements re-verified by the dev at tip and spot-checked by this seat at claim (6505ac10): no prior CLAUDE.md anywhere in the tracked tree; zero readers of CLAUDE.md in the narrow and the broad population, positive control AGENTS.md = 30 files; turbo build / type-check hashes identical with and without the file, and the control mutation moves both hashes and returns — a measurement, not a config reading.
    • CI on f5a7cfa6 at 09:28Z: 3 check runs — build success, Node floor success, Deploy docs skipped (push-to-main only). Translations workflow not triggered (path filters; confirmed from the platform — no such check on the head). Local: every step of both PR jobs exit 0 except the CI-only artifact upload, declared.
    • No changeset and no skip-changeset label owed: objectos has no changeset tooling (.changeset/ absent). No model identifier in the file, the commit or the PR (the dev's "deviation" on the trailer pair is the standing rule, not a deviation).
    • Out of scope, noted, not filed (three-class test: neither a defect, a contract breach nor a metadata trap): objectos ci.yml has no paths: filter, so a docs-only PR pays the whole build job — runner cost, 承接者: the next editor of that workflow; the program's re-pointing pass has nothing to collect in objectos (zero citations of CLAUDE.md).
    • Terminal: governed (an agent instruction file, every repo) ⇒ the PR stays draft; needs-user-decision placed on objectos#283, 速读 终稿 posted there, reviews requested from os-zhuang and hotlong; ⛔ not flipped ready, not enqueued, no auto-merge, no approval from this seat. On MERGED: verify the cross-repo Fixes closed this card (close by hand if it did not), landing record + residue clear, and a status comment on the program card [program] CLAUDE.md is a pointer to AGENTS.md in every repo — no second instruction set to maintain (maintainer 2026-09-09) #17161 (4 of 5).

    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

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions