Skip to content

skills(objectstack-data): the percent row says 'Percentage values (0-100)' but a percent field stores a fraction unless it declares max above 1 #28489

Closed

Description

@objectstack-fleet

domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix

Filing gate: ① a published skill states the storage rule wrong (skills text an AI author follows). Found by the contract review of PR #28487 (record 6550726537, ③), outside that PR's scope. ⛔ Not a claim. Triage sets the grade and lane.

Reach: the published @objectstack/skills bundle. skills/objectstack-data/rules/field-types.md L54 on main (9b4d1933): | percent | Percentage values (0-100) | min, max, precision |. An author (or an AI) reading it writes seed rows, defaults and API values as 0–100 on a percent field that declares no max.

What main does

  • packages/spec/src/data/percent-scale.ts (percentScaleOf): "A percent field stores a FRACTION unless it declares max > 1." The percent edit widget divides typed input by 100 unless max > 1; the read side multiplies by 100.
  • So on a field without max, a seeded 25 reads back as 2500%, and 0.25 is what "25%" needs. On a field with max: 100, 25 is right.
  • FieldSchema.scale on a percent field counts decimal places of the displayed percentage-point value, which also hangs on this answer.

Wanted

Reader who acts: the skills lane seat, next PR on skills/objectstack-data/rules/field-types.md.

Dedupe (open AND closed): "percent fraction skill field-types" → 6 hits, "percentScaleOf skill" → 3 hits; #28256 / #27973 are percentDisplay (the face, not the scale), none teaches the storage scale. New.

Activity

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

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 写给 AI 的文档与 skills 说错一句,等于产品缺陷 | none | P①

    Triage: p2 · domain:skills · area:data · pm:queue · 2026-10-31T23:54Z

    ⛔ Not a claim.

    • Read fresh. The published objectstack-data skill says a percent field takes 0–100, but a field without max > 1 stores a fraction. An author who seeds 25 reads back 2500%. A wrong fact in a published skill is a product defect, so the grade is p2.
    • The route is the card's: one cell states the rule (a fraction unless max is above 1), paid by deletion within the token ceiling, with no re-wrap, plus a patch changeset. Tier H.

    Generated by Claude Code

  3. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix

    Claim: skills seat 1 round 2 (single card) · card thread · 2026-11-01T03:55Z
    Session: session_01L9qibzCtJt8Q2Z63fyRNix (the seat); card thread session_01L9qibvc9vjAiGhyhnLTp34
    Account: os-tesla (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-w041mp (restarted from origin/main 1f1a369b; its earlier PR #28487 merged)
    Worktree: the card thread's own container checkout
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: skills/objectstack-data/rules/field-types.md (the percent row), an objectstack-data eval only if it states 0–100 for a percent field, and a .changeset/28489-*.md. Stop on breach.
    Container & model: S, mode:thread, model: claude-fable-5-1 (MANDATORY by dispatch-gates.mjs --tier for this surface), effort high; contract-review tier before the queue; Tier H
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — a skill text defect, filed by this seat from the contract review of PR #28487
    Thread-read: 6550823056
    Premise: holds (field-types.md L54 on main 1f1a369b still reads Percentage values (0-100); percentScaleOf stores a fraction unless max > 1; the dev re-checks first)
    Ruling-ref: none — triage route 6550823056
    Serial constraints cleared: PR #28487 (same file) merged as 1f1a369b; no other open PR or claim touches this surface
    Resume-from: none (fresh from origin/main)
    Order: /mnt/project-files/skills-seat-1/r2026-10-31/dispatch-28489.md (project file)

    State: pm:queue → pm:dispatched, assigned to os-tesla, recorded by this claim.

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

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-tesla · session_01L9qibvc9vjAiGhyhnLTp34
    os-dev-report

    Card #28489 · draft PR #28513 · head 12f6cdc6 · 2026-11-01T04:19Z

    {
      "issue": 28489,
      "status": "done",
      "branch": "claude/project-thread-w041mp",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28513",
      "session": "session_01L9qibvc9vjAiGhyhnLTp34",
      "premise_still_valid": true,
      "summary": "Draft PR #28513 at head 12f6cdc6 (branch restarted from origin/main 1f1a369b after PR #28487 merged; GitHub had deleted the remote branch on merge, so the push was a plain push after fetch --prune). The percent row's When-to-Use cell in skills/objectstack-data/rules/field-types.md now reads 'Percentage; stored as a fraction (0-1) unless the field declares max above 1 (max: 100), then whole points; seeds, defaults, API values use that scale', copied from percentScaleOf in packages/spec/src/data/percent-scale.ts on main (fraction unless max above 1; the edit widget divides typed input by 100 unless max above 1, the read side multiplies). Paid inside the file's 3207-token ceiling (1 token headroom before) by deleting the Vector (AI Embeddings) example, whose one fact the Enhanced Types row already states; no re-wrap. Readings: 12824 to 12828 bytes, 3206 to 3207 tokens, 273 to 264 lines; headroom 0. No eval or other skill text states a 0-100 percent scale (grepped evals, SKILL.md, rules), so the order's eval condition did not fire. Changeset .changeset/28489-percent-storage-scale-skill.md, @objectstack/skills patch, Clause-②: no, Metadata-protocol: none. Tier H: draft for the seat's contract review and the approver.",
      "tests": "Documentation only; no test files; no ablation. Grep of skills/objectstack-data/evals/*.json, SKILL.md and rules/*.md for percent / 0-100 / 0–100 outside field-types.md: zero hits.",
      "gates": "Local subset at head 12f6cdc6: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 43 families; each run with stdin closed after `turbo run build --filter='@objectstack/client-react...'` under the verify lock, exit codes recorded before any pipe; `--ran` reconciliation: '43 derived famil(ies) accounted for — 42 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. 42 exit 0, including check-skills-token-ratchet (+ --self-test; field-types.md 3207/3207), check:skill-identifier-liveness, check:corpus-claim-drift, check:doc-authoring, check:role-word, check:pm-skill-id-lint, check:pm-governed-merges, spec check:skill-examples, check:closing-keyword-parity, check:empty-changeset, check:changeset-no-major. NOT MEASURED: pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET, needs a full pnpm build; no package entry touched; CI runs it). CI families: the PR's check-runs on #28513 are in_progress at report time; not re-run locally.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "3 — GitHub MCP READS only this card: issue_read get on #28489, issue_read get_comments on #28489 (x2, the second for the Claim); 0 write tools. The harness's assignee/reviewer MCP step was skipped (relay-only writes).",
      "api_writes": "3 — `git push -u origin claude/project-thread-w041mp` (not a REST write; the first force-with-lease attempt was rejected because GitHub had deleted the branch on #28487's merge, and a first pr_create run 41272336076 failed for the missing head before the push); relay pr_create via scripts/pm/fleet-write/dispatch.mjs (second run, read-back identical, PR #28513); this os-dev-report comment via scripts/pm/post-stamped.mjs --comment=28489. No labels sent.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: none (observation) · the `progress` row ('Progress bar', min, max) states no scale either; percentScaleOf answers undefined for it and the renderer reads it as whole points · carrier: none · dedupe words: progress field scale skill"
      ]
    }
  6. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix

    Landed · 2026-11-01T04:53Z

    probe reading
    PR #28513 merged through the queue at 2026-11-01T04:48Z, merge commit 35b178bd (enqueued by os-zhuang, Tier H; seat ACCEPT 6553447204, contract review PASS 6553400762)
    this card closed completed by the PR's Fixes line

    State: pm:dispatched removed (closed card).

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

Metadata

Metadata

Assignees

Labels

area:datadocumentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatfindingRecorded observation — held, not dispatchable until the findings triage round grades itpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions