Repository navigation
[finding] error-catalog.mdx documents VALUE_TOO_LONG / VALUE_TOO_SHORT as live refusals — no producer emits either; length misses arrive as field-level max_length / min_length inside VALIDATION_FAILED #19879
Description
Activity
objectstack-fleet commented
on Sep 23, 2026 ContributorAuthorMore actionsBlocked-by: #19848
定级
pm:blocked·priority:p2·domain:devx(摘finding)—— 与 #19848 同一页、相邻条目,排在在飞的 PR #19878 之后Path: api-backend
Triage: lands in
content/docs/api/error-catalog.mdx(theVALUE_TOO_LONG/VALUE_TOO_SHORTentries) ⇒domain:devx; rationale: the published error catalog tells clients to branch on two codes no producer emits — a length miss actually arrives as a field-levelmax_length/min_lengthentry insideVALIDATION_FAILED— the same class as #19848 (p2); blocked behind #19848 because PR #19878 edits the adjacentINVALID_FORMATentry on the same page.分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ),2026-09-23T15:26Z。本席读完了卡面(本卡尚无评论)。本席的读数(
origin/maindabf8d795e)error-catalog.mdx::199INVALID_FORMAT([finding] error-catalog.mdx tells authors to fix INVALID_FORMAT by matching "the field'sformatconstraint" — the record validator never reads field.format #19848 的条目)、:204VALUE_TOO_LONG、:209VALUE_TOO_SHORT,三个条目紧挨着。- 非测试代码里,这两个码只出现在枚举本身
packages/spec/src/api/errors.zod.ts:58-59,没有任何地方发出它们。 - PR docs(error-catalog): INVALID_FORMAT names what really checks a value (field type or a format rule) #19878 还没有落地(
origin/main上没有它的提交)。
与卡面一致。
判定
- 业务后果:对接 API 的客户照着错误目录,写了「收到
VALUE_TOO_LONG就提示超长」的分支,而这个分支永远不会走到。实际的超长会以VALIDATION_FAILED加fields[]里的max_length出现,客户没有按这个处理,就只剩一个笼统的失败。 p2,与 [finding] error-catalog.mdx tells authors to fix INVALID_FORMAT by matching "the field'sformatconstraint" — the record validator never reads field.format #19848 同级、同一类:已发布的文档在出错路径上给出假的处方。- 修法方向(⛔ 不是裁定):照 [finding] error-catalog.mdx tells authors to fix INVALID_FORMAT by matching "the field's
formatconstraint" — the record validator never reads field.format #19848 的写法,改成「没有路由发出它;按VALIDATION_FAILED+fields[].code分支」。VALUE_OUT_OF_RANGE、MISSING_REQUIRED_FIELD有发出方,⛔ 不在本卡范围(卡面已写)。 Blocked-by: #19848(本条第一行,供解锁扫描):PR docs(error-catalog): INVALID_FORMAT names what really checks a value (field type or a format rule) #19878 正在改相邻的条目,两处一起改必然冲突;⛔ 不并入在飞的 PR,排在其后。
Generated by Claude Code
- addedpriority:p2Medium: important, M3Medium: important, M3and removed
on Sep 23, 2026 objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsUnblocked by the
domain:devxseat (domain:devx#1,session_01VDtqoecgES7ScQYGbFVDRv) at 2026-09-24T16:51Z:pm:blocked→pm:queue.- Blocker closed. [finding] error-catalog.mdx tells authors to fix INVALID_FORMAT by matching "the field's
formatconstraint" — the record validator never reads field.format #19848 is closed. PR docs(error-catalog): INVALID_FORMAT names what really checks a value (field type or a format rule) #19878 is merged;origin/maincarries it as67ebc84a(docs(error-catalog): INVALID_FORMAT names what really checks a value). - Card re-measured on the merged ref.
error-catalog.mdxnow hasINVALID_FORMATat:199,VALUE_TOO_LONGat:217andVALUE_TOO_SHORTat:222. The line numbers moved by +13 from the triage reading; the two entries are otherwise untouched. - Still no producer. Outside tests, the only hits for either code are the enum members
packages/spec/src/api/errors.zod.ts:58-59and thescripts/error-status-unpinned-baseline.json:27-28baseline rows. Positive control:INVALID_FORMAThits the same file at:57.
Grading (
priority:p2) and routing (domain:devx) are unchanged.
Generated by Claude Code
- Blocker closed. [finding] error-catalog.mdx tells authors to fix INVALID_FORMAT by matching "the field's
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsClaim: PM loop round 8
Session:session_01VDtqoecgES7ScQYGbFVDRv
Branch:claude/issue-19879-error-catalog-value-length
Worktree:objectstack-issue-19879
Domain:domain:devx
Seat:domain:devx#1
File surface:content/docs/api/error-catalog.mdx, theVALUE_TOO_LONGandVALUE_TOO_SHORTentries only (:217–:226onorigin/main67ebc84a). Stop on breach and explain in the report. ⛔ Not the page's wire-count sentence at:6or theCONCURRENT_LIMIT_EXCEEDEDentry: open PR #19957 edits both.
Container & model:S(two adjacent docs entries; the shape follows the landed #19878INVALID_FORMATentry),mode:subagent,model: opus. The tier is the PM's call and stays at the default.
Clause-②: no
Thread-read: 5818409445
Serial constraints cleared: board read at 2026-09-24T16:53Z. 16 open PRs, file lists read. One, #19957 (domain:spec), toucheserror-catalog.mdx, at hunks:3-7and:470. Those hunks are disjoint from this card's:217-226, and the surface above excludes both.Premise: re-measured by this seat on the merged ref (
5818409445). Outside tests, both codes appear only as the enum memberserrors.zod.ts:58-59and the baseline rows. Positive control:INVALID_FORMAThitserrors.zod.ts:57.
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 19879, "status": "done", "branch": "claude/issue-19879-error-catalog-value-length", "pr": "https://github.com/objectstack-ai/objectstack/pull/20004", "session": "session_01VDtqoecgES7ScQYGbFVDRv", "premise_still_valid": true, "summary": "Re-checked the premise on origin/main e8f163fc and it holds. Outside tests, no producer emits VALUE_TOO_LONG or VALUE_TOO_SHORT: the only hits are the enum members in errors.zod.ts:58-59, the baseline rows in error-status-unpinned-baseline.json:27-28, generated reference pages and ADR-0114. Positive control: INVALID_FORMAT hits errors.zod.ts:57. A length miss arrives as field-level max_length / min_length inside VALIDATION_FAILED, with the same spelling on all three paths: record-validator.ts:695-699 (a record write, with constraint {maxLength|minLength, actual}), zod-issues-to-fields.ts:74-81 (a Zod-parsed body; only a non-number, non-date, non-array value is a string length miss) and settings-service.ts:397-400 (a settings value). Both catalog entries now follow the landed INVALID_FORMAT shape: the code is reserved, no route emits it today, and clients should branch on VALIDATION_FAILED + fields[].code max_length / min_length. Both entries are kept. Assignee was already set by the PM and was left alone. The newest Claim (5818441081) names this branch.", "files_changed": ["content/docs/api/error-catalog.mdx (VALUE_TOO_LONG and VALUE_TOO_SHORT entries only, lines 217-238 after the edit)"], "line_budget": "+16 / -4 in 1 file, 20 changed lines by the dispatch-gates count. Frontmatter, headings, the count line at :6 and the CONCURRENT_LIMIT_EXCEEDED entry are untouched.", "gates": "Derived with dispatch-gates --repo objectstack-ai/objectstack --commands from the merge-base change set: 1 path, 41 commands. All 41 exited 0 on HEAD ab8b19ea, with exit codes recorded before any pipe. Five first exited 3 (PREREQUISITE NOT MET: lint check:doc-formula-expressions and check:doc-security-posture, spec check:docs and check:skill-examples, and check:docs-transcript-drift). Two builds under os-verify-lock fixed that: turbo build --filter='@objectstack/lint...' --filter='@objectstack/formula...' (VERDICT command-exit 0, 4 tasks) and turbo build --filter='@objectstack/client-react...' (VERDICT command-exit 0, 34 tasks). All five then exited 0 on rerun. Reconciliation: dispatch-gates --ran reports '41 derived, 41 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero)'. No package source was touched, so no package test or typecheck is owed. The 14 changeset-pending families do not apply because this is a docs-only change with no changeset. NOT MEASURED: the CI-only lanes (Build Docs, Test Core shards, type-check lanes), left to CI. git status stayed clean after the builds.", "tests": "No code changed, so no unit tests are owed. Gate evidence is in the gates field. check:doc-authoring :: exit 0, check:doc-anchors :: exit 0, check:nul-bytes :: exit 0, check:error-status-conformance :: exit 0, check:docs-spec-enumerations :: exit 0, spec check:docs :: exit 0, all on HEAD ab8b19ea.", "mcp_calls": "0", "api_writes": "2 REST writes: (1) POST /repos/objectstack-ai/objectstack/dispatches, the fleet-write relay pr_create request fw-20260924T170941Z-dfb970 (run 36032359059, success), which opened draft PR 20004; (2) this os-dev-report comment on issue 19879 through post-stamped.mjs. Plus 2 git pushes (the empty-branch probe and the commit ab8b19ea). The optional PR body edit was not used. No label write, following the dispatch.", "deviations": [ "The harness's commit trailer 'Co-Authored-By: Claude Opus 5.5' was refused by the pre-push check:commit-card-trailers before the commit was published. I amended it to the model-free pair (Claude, noreply) plus the Claude-Session URL. The commit had never been pushed, so no history rewrite was needed.", "The PR body ends with the role-file session-URL footer, not the harness's 'Generated with' line. The role file takes precedence.", "The PM measured on 67ebc84a. I re-measured on e8f163fc (origin/main at worktree creation). Entry line numbers were unchanged at 217/222." ], "open_questions": [], "out_of_scope_findings": [ "not class a/b/c, not filed: the intro sentence at :6 says '52 error codes reachable on the wire', but the page has 53 code headings, and at least four of them (INVALID_FORMAT, INVALID_REFERENCE, VALUE_TOO_LONG, VALUE_TOO_SHORT) are reserved codes with no emitter. Whether the count should include reserved entries is unsettled. carrier: PR 19957, which already edits that line. Recorded in the PR Acceptance notes and not edited here." ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorAuthorMore actionsReview: ACCEPT (content) — PR #20004, after one rework round
domain:devx#1seat,session_01VDtqoecgES7ScQYGbFVDRv, 2026-09-24T17:20Z. Checked against GitHub andorigin/main, ⛔ not against the dev report.check reading shape draft · base main·Fixes #19879+Clause-②: no· 1 filecontent/docs/api/error-catalog.mdx· only theVALUE_TOO_LONG/VALUE_TOO_SHORTentries ·:6count line andCONCURRENT_LIMIT_EXCEEDEDuntouched (open PR #19957 owns both)「No route emits it today」 outside tests: enum members packages/spec/src/api/errors.zod.ts:58-59and baseline rows only ✅record write record-validator.ts:695-699→max_length/min_lengthwith{ maxLength|minLength, actual }✅Zod-parsed body zod-issues-to-fields.ts:74-81mapstoo_big/too_smallon a string tomax_length/min_length;rest-server.ts:8960-8963sendsVALIDATION_FAILED+ top-levelfields✅envelope placement /dataflatfields(error-response.ts:1152-1160); dispatcher underdetails(dispatcher-plugin.ts:645); matches the page's ownVALIDATION_FAILEDcallout (:77onward) ✅settings write settings-service.ts:397-400→max_length/min_length; served as400 SETTINGS_VALIDATIONwithdetails.fields(settings-routes.ts:215,settings-service.types.ts:584) ✅Rework round (1): the first head
ab8b19easaid a settings length miss arrives insideVALIDATION_FAILEDand told clients to branch only onVALIDATION_FAILED+fields[].code. That was a false prescription for settings writes, the defect class this card fixes. It was returned, and37431df1names both envelopes.Out-of-scope reading: the
:6count sentence against the page's headings, several of them reserved codes with no emitter. Carrier: PR #19957, which already edits that line. Not filed.Owed before landing: an at-tier contract review (
content/docs/**, in progress), CI green on37431df1, and theskip-changesetlabel (docs-only; this seat's label write is refused by its session's permission classifier, so it is left to the maintainer).
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026
Filing gate: ① defect. Class (b) — a published, customer-readable page documents refusals the runtime never produces.
Filed by the
domain:devxexecution seat (domain:devx#1,session_01VDtqoecgES7ScQYGbFVDRv) from anout_of_scope_findingsentry of the #19848 round (PR #19878), re-measured by this seat onorigin/mainbefore filing. ⛔ Ungraded and unrouted — triage's.The carrier
content/docs/api/error-catalog.mdx, the### VALUE_TOO_LONGentry (~:204) and theVALUE_TOO_SHORTentry beside it: each gives a live cause and a fix, as if a client should branch on the code.What contradicts it
origin/mainare the enum members themselves,packages/spec/src/api/errors.zod.ts:58-59.max_length/min_lengthentry insideVALIDATION_FAILED(packages/objectql/src/validation/record-validator.ts:695-699); a Zod-parsed body mapstoo_big/too_smallthe same way (packages/spec/src/api/zod-issues-to-fields.ts:78-81).fields[]entry.⇒ A client that follows the page branches on a code it never receives.
Sibling, ⛔ not the same card
#19848 (PR #19878) repairs the
INVALID_FORMATentry on the same page the same way — "no route emits it; branch onVALIDATION_FAILED+fields[].code". That PR's file surface is theINVALID_FORMATentry; these two entries are a separate edit.VALUE_OUT_OF_RANGE(1 producer) andMISSING_REQUIRED_FIELD(3 producers) do have emitters and are ⛔ not claimed here.Dedupe
REST enumeration of open + closed issues updated since 2026-08-15 (⛔
/searchis not reachable from this seat), title + body grepped forVALUE_TOO_LONG|VALUE_TOO_SHORT|error-status-unpinned: 0 hits. Radius: issues touched in that window; an older untouched card would be outside it.Dedupe words:
VALUE_TOO_LONG·VALUE_TOO_SHORT·error-catalog unemitted code·max_length field-levelGenerated by Claude Code