Filed by the domain:spec seat 2 PM (session_014EJ1ED8X4MMrT18BhVx4tx). The finding was carried to this lane by domain:engine's notice 5899679264 on the spec seat post, from out_of_scope_findings[0] of the os-dev-report on #20671 (5899533181). This card is that carrier's filing; the measurements below are the engine dev's, cited, not re-run by this seat.
What happens
Since PR #20721 (63bfe69647, on main), the record validator refuses a time value that carries Z or an offset: a time field is a zone-less wall clock (triage 5895825766). The spec's value schema for time did not move with it:
packages/spec/src/data/field-value.zod.ts ClockTimeValueSchema (at origin/main fbec216e2d, about :376) still ends its regex with (Z|[+-]([01]\d|2[0-3]):?[0-5]\d)?, and its docs still say "with optional zone".
- Its readers, all through
valueSchemaFor: checkLiteralDefaultValue (the FieldSchema.defaultValue gate, field.zod.ts, and the action-param defaultValue gate, action.zod.ts) and the runtime's validateActionParams (action-execution.ts).
So the spec admits what the runtime refuses.
Reach (measured by the engine dev, on PR #20721's arm without a spec change)
FieldSchema.safeParse accepts a Field.time with defaultValue: '10:00Z' (and '10:00+08:00').
- Then each insert that falls back to that default is refused
400 VALIDATION_FAILED / invalid_time, on a field the caller never sent (the door POST /api/v1/data/:object calls, engine.insert).
- The action-param door
validateActionParams (strict, ADR-0104 D2) still admits '10:00Z' for a time param (returns []).
- Named producer: any metadata author, human or AI, writing a
time default through FieldSchema / os validate. Repo census: 0 such defaults shipped.
Governing text
Shape of the fix (for the dispatch, not a ruling)
Generated by Claude Code
Filed by the
domain:specseat 2 PM (session_014EJ1ED8X4MMrT18BhVx4tx). The finding was carried to this lane bydomain:engine's notice 5899679264 on the spec seat post, fromout_of_scope_findings[0]of theos-dev-reporton #20671 (5899533181). This card is that carrier's filing; the measurements below are the engine dev's, cited, not re-run by this seat.What happens
Since PR #20721 (
63bfe69647, onmain), the record validator refuses atimevalue that carriesZor an offset: atimefield is a zone-less wall clock (triage 5895825766). The spec's value schema fortimedid not move with it:packages/spec/src/data/field-value.zod.tsClockTimeValueSchema(atorigin/mainfbec216e2d, about:376) still ends its regex with(Z|[+-]([01]\d|2[0-3]):?[0-5]\d)?, and its docs still say "with optional zone".valueSchemaFor:checkLiteralDefaultValue(theFieldSchema.defaultValuegate,field.zod.ts, and the action-paramdefaultValuegate,action.zod.ts) and the runtime'svalidateActionParams(action-execution.ts).So the spec admits what the runtime refuses.
Reach (measured by the engine dev, on PR #20721's arm without a spec change)
FieldSchema.safeParseaccepts aField.timewithdefaultValue: '10:00Z'(and'10:00+08:00').400 VALIDATION_FAILED/invalid_time, on a field the caller never sent (the doorPOST /api/v1/data/:objectcalls,engine.insert).validateActionParams(strict, ADR-0104 D2) still admits'10:00Z'for atimeparam (returns[]).timedefault throughFieldSchema/os validate. Repo census: 0 such defaults shipped.Governing text
timefield written "+010000-01-01T10:00:00Z" is stored verbatim (201 on SQLite, 500 on PostgreSQL), and "10:00Z" reads back differently per backend — the write-side twin of #20480 #20671: atimefield is a zone-less wall clock.Shape of the fix (for the dispatch, not a ruling)
ClockTimeValueSchemadrops the zone group, and its message says "no time zone". This narrows the accepted shape:Clause-②: yes (narrowing), with the BREAKING banner.sys_metadataobject with such a default would then fail to parse on load, so the change owes an ADR-0087 disposition (a conversion or a refusal with guidance) in the same PR. That is the open point the engine seat left for this lane.691bfabd6on PR fix(objectql)!: a time field is a zone-less wall clock — a zone-suffixed time of day and an extended-year instant are refused with VALIDATION_FAILED / invalid_time (#20671) #20721's branch, reverted there as this lane's surface). It may be unreachable now that the branch merged; treat it as a pointer, not a base.Generated by Claude Code