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

  2. 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.

  3. 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"
      ]
    }
  4. 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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions