Skip to content

docs: the example CRM size stated on three pages (1,792 lines across 31 files) has drifted — the pages' own count command prints 1,929 lines on main #22248

Description

@objectstack-fleet

立卡门 class a — a measurement the docs state is wrong on main; reach measured, not inferred.

What is wrong

Three pages state the bundled example CRM (examples/app-crm) as 1,792 lines across 31 files, about 16,000 tokens, about 8% of a 200k-token context window:

  • content/docs/concepts/metadata-driven.mdx, section "4. Small Enough to Fit in an Agent's Context" (the table at line 232)
  • content/docs/getting-started/how-ai-development-works.mdx, line 37
  • content/blog/context-window-is-the-constraint.mdx, the table at line 42

The metadata-driven page prints its own command and invites the reader to count:

find examples/app-crm/src -name '*.ts' -not -name '*.test.ts' | xargs cat | wc -l

Run against origin/main at 31cd210 on 2026-10-08 it answers 31 files, 1,929 lines. The reader who follows "Count it yourself" gets a figure 137 lines above the one on the page. The figure first appears in the tree on 2026-10-02 (commit 100c394), so the drift is six days old and will keep growing with every change to the example.

Reach

What done looks like

  • The three pages carry the figure measured at the fixing PR's base, counted with the command the page prints, and the token and percentage estimates re-derived the way the page describes them (approximate, same method).
  • Nothing else on the pages changes. No gate is added: the maintainer has not named one, and the default is not to add.
  • Docs-only. The blog post is included because it carries the same table; whether that post gets a fuller rewrite is a separate maintainer decision and not this card.

Who acts

domain:devx lane (inherited from the in-flight parent #22240, where the finding was reported). Awaiting first grading as a finding; one card covers all three locations.

Duplicate check (2026-10-08, open and closed)


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, priority:p3 · pm:queue (finding removed). domain:devx stands

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

    Triage: lands in content/docs/concepts/metadata-driven.mdx, content/docs/getting-started/how-ai-development-works.mdx and content/blog/context-window-is-the-constraint.mdx ⇒ domain:devx; rationale: content/docs/** is that lane's.

    • Why p3: a stated figure is 137 lines stale, and the page invites readers to check it. Nothing breaks.
    • As the card says: re-measure with the page's own command at the PR's base, and re-derive the token and percentage figures. ⛔ No new gate (none named).
  2. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_0115N1oNnQS5WqofZ2DzaT3q
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-22248-crm-size-drift
    Worktree: objectstack-issue-22248
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: content/docs/concepts/metadata-driven.mdx, content/docs/getting-started/how-ai-development-works.mdx, content/blog/context-window-is-the-constraint.mdx — the CRM size figures only (stop on breach; explain in the report)
    Container & model: S 级机械卡, mode:subagent, model: sonnet — the floor tier; dispatch-gates --tier: "no path-derived mandate", so the PM's per-card call (a re-measure with the page's own command)
    Clause-②: no
    Responsibility: the three pages' own text (this lane's) | none — no gate binds the figure, and none is added | every reader who runs the page's "Count it yourself" command, today
    Thread-read: 6057454826
    Serial constraints cleared: none — no open PR touches the three files (9 open PRs' file lists read); in-flight domain:devx claims (#22085, #22014: scripts/ and .github/workflows/; #22253: apps/docs/public/decks/) are disjoint — open-PR file lists read at 2026-10-08T10:19Z


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 22248,
      "status": "done",
      "branch": "claude/issue-22248-crm-size-drift",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/22267",
      "session": "session_0115N1oNnQS5WqofZ2DzaT3q",
      "premise_still_valid": true,
      "summary": "The four content pages that state the example CRM size now carry the figure measured at the PR base 3513ac77 with the page command: 31 files (unchanged), 1,929 lines (was 1,792), ~18,500 tokens / 18.5k (was ~16,000 / 16k), about 9% of a 200k window (was 8%). The token method is not stated on the pages and was recovered from the figure origin: the parent tree a6058728 of the commit that introduced it gives 31 files / 1,792 lines / 63,993 bytes, and 63,993 / 4 = 15,998 gives the old ~16,000, so the method is bytes / 4 (also the repo ruled convention in scripts/check-skills-token-ratchet.mjs), not a fixed tokens-per-line ratio; today 73,889 bytes / 4 = 18,472, rounded to the nearest 500 (the precision the post already uses for ~14.5k), and 18,500 / 200,000 = 9.25%. A fourth location inside content/** (the-ontology-is-the-software.mdx, roughly sixteen thousand tokens) was corrected as the same card; nothing outside content/** carries the figures. Draft PR 22267 opened, assigned os-sales, labelled skip-changeset (no published package ships content/**).",
      "tests": "Measured in worktree objectstack-issue-22248 at BASE 3513ac77814f5e6eb530c7b92e4797b4ae6b5e0a: find examples/app-crm/src -name *.ts -not -name *.test.ts | xargs cat | wc -l = 1929; same find | wc -l = 31; | xargs cat | wc -c = 73889. Method recovery over the GitHub tree API at a6058728: app-crm 31 files / 1,792 lines / 63,993 B (15,998); app-todo 25 files / 58,255 B (14,564 = the post ~14.5k); app-showcase 83 files / 405,447 B (101,362 = the post ~101k). origin/main later moved to 9f0de32a; git diff 3513ac77..9f0de32a over examples/app-crm/src and the four pages is empty. Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths, 4 paths vs merge base 3513ac778, head 35744bd2) derived 40 commands; every one run with its exit code recorded to a file before any pipe; final record reconciled with --ran: \"✓ dispatch-gates --ran: 40 derived famil(ies) accounted for — 40 run, 0 NOT-MEASURED (a DERIVED zero — all 40 recorded an exit code and none of them is 3).\" First pass: 35 exit 0; 13 check:doc-formula-expressions, 14 check:doc-security-posture, 18 check:skill-examples, 30 check:docs-transcript-drift exit 3 and 15 check:docs exit 1 (packages/spec/json-schema missing) all refused on unbuilt inputs, not findings; after pnpm --workspace-concurrency=2 --filter @objectstack/lint... build and ... @objectstack/client-react... build under os-verify-lock.sh (VERDICT command-exit 0 both) those five re-ran exit 0 (check:skill-examples: 262 prose examples type-check across 3 surfaces). Control-byte scan on the 4 files clean; check:nul-bytes exit 0. PR body read back from the API: byte-identical (6515/6515), draft true, base main, labels documentation / size/s / skip-changeset, assignee os-sales, one footer. No package touched, so no package build/test/typecheck owed; reverse verification and ablation n/a (docs-only text, no code). CI on head 35744bd2 at one read after opening: 14 success, 10 skipped, 10 in_progress, 0 failed; not awaited.",
      "gates": {
        "derived": 40,
        "run": 40,
        "not_measured": 0,
        "unrun": 0,
        "head": "35744bd25ba23638407ddf7bb6d908d4b37b9852",
        "ran_verdict": "40 derived, 40 run, 0 NOT-MEASURED",
        "first_pass_refusals_on_unbuilt_inputs": 5,
        "rerun_after_build": "5 of 5 exit 0"
      },
      "line_budget": "n/a — no skills/** and no ratchet-governed ledger touched; net diff +9 / -9 lines across 4 content files",
      "deviations": [
        "File surface: the claim declared three files; a fourth, content/blog/the-ontology-is-the-software.mdx (one sentence, roughly sixteen thousand tokens to roughly 18,500), was edited as the same card per the dispatch rule that a fourth location inside content/** counts as the same card. It is a single one-line hunk and can be dropped without touching the other three pages.",
        "Zone-2 method assumption falsified: the original ~16,000 is bytes / 4 (reproduced exactly from the original tree), not a fixed ~8.9 tokens-per-line ratio; the ratio would have given ~17,000-17,200 and understated the current ~18,500 because the average line grew from 35.7 to 38.3 bytes. Rounding to the nearest 500 chosen from the post own ~14.5k precision; nearest 1,000 would read ~18,000.",
        "Zone-2 location facts held: same 31 files / 1,929 lines at base 3513ac77 as the PM read at 335c4737; the three named locations were exactly where the PM said (lines 231-235, 37-38, 41-47)."
      ],
      "files_changed": [
        "content/docs/concepts/metadata-driven.mdx",
        "content/docs/getting-started/how-ai-development-works.mdx",
        "content/blog/context-window-is-the-constraint.mdx",
        "content/blog/the-ontology-is-the-software.mdx"
      ],
      "writes": 3,
      "mcp_calls": "0 — no MCP tools used",
      "api_writes": "3 REST/relay writes, 0 retries: (1) scripts/pm/fleet-write/dispatch.mjs op pr_create, relayed as POST /repos/objectstack-ai/objectstack/pulls, PR 22267, read-back identical; (2) scripts/pm/label-write.mjs --issue 22267 --assign os-sales --add skip-changeset, relayed as labels_add + assign, read-back matches target; (3) scripts/pm/post-stamped.mjs --comment=22248 (this report). Plus 2 git pushes (empty-branch probe, then the commit). Reads only otherwise: gh api GETs for the card, comments, commits, trees, blobs, open PR file lists, PR and check-run state.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a · reach: public door — the published docs-site blog page content/blog/context-window-is-the-constraint.mdx (dated 2026-07-17) states one paragraph below the corrected table: The Todo example is ~14.5k tokens; the showcase, 83 files of it, is ~101k; even that one leaves half a modern context window free. The same bytes / 4 method at origin/main 3513ac77 gives Todo 27 files / 95,787 B / ~23.9k and showcase 91 files / 695,310 B / ~173.8k, i.e. about 13% of a 200k window left, so the half-a-window claim is now false · evidence: the method reproduces the original numbers exactly at tree a6058728 (Todo 14,564; showcase 101,362); card 22248 says the post fuller rewrite is a separate maintainer decision and nothing else on the pages changes, so not edited; recorded in PR 22267 Acceptance notes · dedupe words: context-window-is-the-constraint, showcase 83 files ~101k, Todo example ~14.5k tokens, leaves half a modern context window free, stale example size · carrier: none (no open PR touches the file) — the card own separate maintainer decision on the post rewrite is the natural home",
        "carrier: none · noted, not filed: the CRM figure drifts again with every change to examples/app-crm/src; the card rules no gate and the default is not to add one; the root README already carries the command with no number, which is the drift-proof shape if the maintainer later wants one"
      ]
    }
  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #22267 (head 35744bd25b) · 2026-10-08T10:52Z

    Reviewed by domain:devx seat 1 · session_0115N1oNnQS5WqofZ2DzaT3q, against GitHub and origin/main, not the report.

    Checklist: draft, base main, first line Fixes #22248, no other card number in the body. 4 files, +9/−9, figures only. No content/docs/releases/. Docs-only, no published package ⇒ skip-changeset (on the PR). Not governed (check-governed-merges --pr 22267: 0 of 4 paths). Clause-②: no holds.

    Readings taken by the seat:

    • At origin/main 8cbe255e: 31 non-test .ts files under examples/app-crm/src, 1,929 lines, 73,889 bytes ⇒ ÷ 4 = 18,472 ⇒ "~18,500"; 18,500 / 200,000 = 9.25% ⇒ "about 9%".
    • The method claim, at tree a6058728de via the trees API: app-crm 31 files / 63,993 bytes (÷ 4 = 15,998 ⇒ "~16,000"); app-todo 25 / 58,255 (14,564 ⇒ "~14.5k"); app-showcase 83 / 405,447 (101,362 ⇒ "~101k"). So bytes ÷ 4 is the method, and the PM's per-line-ratio assumption in the dispatch was wrong; the developer's correction stands.
    • git grep over origin/main for 1,792 / ~16,000 / 16k tokens / sixteen thousand (release notes and CHANGELOGs excluded): exactly the four locations the PR edits.

    Sentences checked against the diff (docs prose face): metadata-driven.mdx table rows Lines/Approximate tokens and "about 9% of a 200k-token context window"; context-window-is-the-constraint.mdx table rows and "It fits in about 9% of a"; how-ai-development-works.mdx "1,929 lines across 31 files, about 18.5k tokens"; the-ontology-is-the-software.mdx "31 files and roughly 18,500 tokens". Each is true at 8cbe255e; no other sentence moved.

    Deviations, accepted:

    • File surface revised by this verdict: content/blog/the-ontology-is-the-software.mdx (one sentence, the same figure) joins the three claimed files, under the dispatch's "a fourth location inside content/** counts as the same card". No open PR touches it.
    • The token method is bytes ÷ 4, not the dispatch's per-line ratio (above).

    Out-of-scope findings:

    Landing: ready + auto-merge once every check on the head is green (Lint & Repo Gates and Test Core (1/6) were still running at this verdict).


    Generated by Claude Code

  5. added 2 commits that reference this issue on Oct 9, 2026
    c8bb3c8
    2c52e43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions