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
⛔ Observation only. This card produces NO code and NO pull request. Its deliverable is a measurement and a report. ⛔ Do not fix anything you find, do not add a field, do not touch DESIGN.md, and ⛔ do not change #31's labels — the seat does that after reading your report.
Why now
Decision #31 is pm:blocked, and it states its own unlock criterion verbatim in its header:
This repository upgraded to @objectstack/* 17.4.0 this session — PR #37, merged as 5d5a254. Nobody has re-run the probe since. A blocked card whose blocker may have cleared is the failure mode that keeps a decision parked forever, because the condition changes silently and no event fires.
The comment block in src/datasets/cycle-time.dataset.ts makes the same gap visible from the other side: it names its measurement's versions honestly — 「Measured on @objectstack/spec 17.3.0 + @objectstack/service-analytics 17.3.0」 — so a 17.4.0 decision is currently resting on a 17.3.0 reading. ⚠️ That the comment names its versions is correct practice and is the only reason this is visible at all; ⛔ it is not a defect and is not to be "fixed".
sqlite> select typeof(submitted_at), submitted_at from clm_contract limit 1;
text|2026-05-19T00:00:00.000Z
sqlite> select avg(submitted_at) from clm_contract;
2025.9166666666667 ← the average YEAR, not the average date
Establish, on 17.4.0, whether that path now errors. Concretely:
Does derived: { op: 'difference', … } over two datetime averages still parse, run and render a number — or does it now refuse, and at which layer (author-time validate, query build, or execution)?
Does AVG() over a Field.datetime still return an average year, or does the analytics layer now refuse the aggregate?
Whichever answer: what exactly does the operator see? An exception, a validation message, an empty widget, or a number. [Decision] §09 要「各段时长」和「超 SLA」,但语义层算不出时间差——两问共用一个补法 #31's whole argument is that the dangerous state is a clean, plausible, wrong number, so "it errors" and "it renders nothing" are different outcomes and both differ from "it still lies".
Use a scratch dataset in your own worktree. ⛔ Do not commit it — restore and prove the tree byte-identical by state (git diff HEAD empty, git hash-object matching git rev-parse HEAD:<path>), the way PR #70, #72, #74 and #79 did.
What the answer means — ⛔ do not decide this yourself
If it still renders a number: the criterion is not met, [Decision] §09 要「各段时长」和「超 SLA」,但语义层算不出时间差——两问共用一个补法 #31 stays pm:blocked, and you have refreshed a stale measurement — which is worth the run on its own, since the current comment cites 17.3.0.
If the answer is neither — a different refusal, a different number, a changed shape — report exactly what you saw. ⛔ Do not force it into one of the two boxes above.
Constraints
⛔ No code, no PR, no DESIGN.md, no label changes. Report as a comment on this issue.
⛔ Do not re-open the 1A/2A vs 1B/2B question. That was adjudicated 1C by the maintainer on 2026-09-09 and §09 already records the outcome (PR Record four maintainer rulings in DESIGN.md §03, §06 and §09 #40, 1127e52). You are measuring one fact, not revisiting a ruling.
⛔ Platform gaps: report, never patch. If you find a new platform defect, say so — the seat routes it upstream.
Name the exact versions you measured on, the way the existing comment does. That practice is why this card exists.
Acceptance
A direct answer to each of the three questions, with the reading that produced it — the request or config that was run, and the raw output. ⛔ Not a summary of what you expect.
The versions installed at measurement time, read from the tree rather than assumed.
Whether the tree is byte-identical afterwards, proved by state.
If the probe cannot be run at all, say why in the same detail — an unrunnable probe is a finding, not a failure.
Provenance
Noticed by the PM seat while reviewing PR #79 (#75), which quotes #31's unlock criterion inside a comment it was reframing. The dev on #75 correctly did not chase it — it was out of that card's scope. ⚠️ The seat should have noticed at the 17.4.0 upgrade (PR #37) that a blocked card's condition might have moved; it did not, and this card is that catch-up.
Related
#31 (pm:blocked, the card this is for) · #37 / 5d5a254 (the 17.4.0 upgrade) · objectstack-ai/objectstack#16737 (the blocker) · objectstack-ai/objectstack#16778 (the in-flight fix that refuses rather than provides) · #75 / PR #79 (where this surfaced) · src/datasets/cycle-time.dataset.ts (the 17.3.0 measurement)
⛔ Observation only. This card produces NO code and NO pull request. Its deliverable is a measurement and a report. ⛔ Do not fix anything you find, do not add a field, do not touch
DESIGN.md, and ⛔ do not change #31's labels — the seat does that after reading your report.Why now
Decision #31 is
pm:blocked, and it states its own unlock criterion verbatim in its header:This repository upgraded to
@objectstack/*17.4.0 this session — PR #37, merged as5d5a254. Nobody has re-run the probe since. A blocked card whose blocker may have cleared is the failure mode that keeps a decision parked forever, because the condition changes silently and no event fires.The comment block in⚠️ That the comment names its versions is correct practice and is the only reason this is visible at all; ⛔ it is not a defect and is not to be "fixed".
src/datasets/cycle-time.dataset.tsmakes the same gap visible from the other side: it names its measurement's versions honestly — 「Measured on@objectstack/spec17.3.0 +@objectstack/service-analytics17.3.0」 — so a 17.4.0 decision is currently resting on a 17.3.0 reading.The probe, which #31 already specifies
#31 records the exact wrong path and what it did on 17.3.0:
and why:
Establish, on 17.4.0, whether that path now errors. Concretely:
derived: { op: 'difference', … }over two datetime averages still parse, run and render a number — or does it now refuse, and at which layer (author-timevalidate, query build, or execution)?AVG()over aField.datetimestill return an average year, or does the analytics layer now refuse the aggregate?Use a scratch dataset in your own worktree. ⛔ Do not commit it — restore and prove the tree byte-identical by state (
git diff HEADempty,git hash-objectmatchinggit rev-parse HEAD:<path>), the way PR #70, #72, #74 and #79 did.What the answer means — ⛔ do not decide this yourself
objectstack-ai/objectstack#16778) chose to refuse rather than to provide, so durations stay uncomputable. What changes is that the trap is closed. Report it; the seat decides what [Decision] §09 要「各段时长」和「超 SLA」,但语义层算不出时间差——两问共用一个补法 #31 becomes.pm:blocked, and you have refreshed a stale measurement — which is worth the run on its own, since the current comment cites 17.3.0.Constraints
DESIGN.md, no label changes. Report as a comment on this issue.1127e52). You are measuring one fact, not revisiting a ruling.Acceptance
Provenance
Noticed by the PM seat while reviewing PR #79 (#75), which quotes #31's unlock criterion inside a comment it was reframing. The dev on #75 correctly did not chase it — it was out of that card's scope.⚠️ The seat should have noticed at the 17.4.0 upgrade (PR #37) that a blocked card's condition might have moved; it did not, and this card is that catch-up.
Related
#31 (
pm:blocked, the card this is for) · #37 /5d5a254(the 17.4.0 upgrade) · objectstack-ai/objectstack#16737 (the blocker) · objectstack-ai/objectstack#16778 (the in-flight fix that refuses rather than provides) · #75 / PR #79 (where this surfaced) ·src/datasets/cycle-time.dataset.ts(the 17.3.0 measurement)