You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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
The percent row states the storage rule in one cell: a fraction (0–1) unless the field declares max above 1 (e.g. max: 100), then whole percentage points; seed and API values follow the same scale.
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.
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/main1f1a369b; 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 main1f1a369b 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.
{
"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"
]
}
Activity
objectstack-fleet commentedon Oct 31, 2026
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.
objectstack-dataskill says apercentfield takes 0–100, but a field withoutmax > 1stores a fraction. An author who seeds25reads back2500%. A wrong fact in a published skill is a product defect, so the grade is p2.maxis above 1), paid by deletion within the token ceiling, with no re-wrap, plus a patch changeset. Tier H.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
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 threadsession_01L9qibvc9vjAiGhyhnLTp34Account:
os-tesla(the seat's linked user; the card's assignee)Branch:
claude/project-thread-w041mp(restarted fromorigin/main1f1a369b; its earlier PR #28487 merged)Worktree: the card thread's own container checkout
Domain:
domain:skillsSeat:
domain:skills#1File surface:
skills/objectstack-data/rules/field-types.md(thepercentrow), anobjectstack-dataeval 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 bydispatch-gates.mjs --tierfor this surface), efforthigh; contract-review tier before the queue; Tier HClause-②: 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.mdL54 onmain1f1a369bstill readsPercentage values (0-100);percentScaleOfstores a fraction unlessmax > 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 surfaceResume-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 toos-tesla, recorded by this claim.objectstack-fleet commentedon Nov 1, 2026
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" ] }objectstack-fleet commentedon Nov 1, 2026
domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix
Landed · 2026-11-01T04:53Z
35b178bd(enqueued by os-zhuang, Tier H; seat ACCEPT 6553447204, contract review PASS 6553400762)completedby the PR'sFixeslineState:
pm:dispatchedremoved (closed card).