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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Claim: PM loop round 3 (epic objectstack-ai/cloud#1841)
Session: session_c5c0ce54-bb9c-478c-9e5b-cf44b80d4569
Branch: claude/issue-7371-usage-indicator-weekly
Worktree: objectui-issue-7371
Domain: domain:ui
File surface: packages/app-shell/src/layout/AiUsageIndicator.tsx + its tests, the usage response type, packages/i18n/** zh/en keys for the new sentence (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: sonnet (PM judgement)
Clause-②: no
Serial constraints cleared: objectui#7273 (merged) touched AiUsageIndicator — base on current main; #7256 (in flight) owns console home/logo, not this file; #7366 (enqueued) touches i18n packs — different keys, rebase before pushing
os-dev-report
{
"issue": 7371,
"status": "done",
"branch": "claude/issue-7371-usage-indicator-weekly",
"pr": "#7374",
"premise_still_valid": true,
"summary": "AiUsageIndicator (packages/app-shell/src/layout/AiUsageIndicator.tsx) now recognizes resetKind: 'weekly' from the free plan's rolling 7-day AI quota window (cloud PR #1852), rendering 'Resets in N days' (or N hours inside the final day) computed from resetsAt via new @object-ui/i18n keys (real plural family, base + _one/_other, all ten locale packs). AiUsageResetKind gained 'weekly'; resetsAt was already string | null on this side and needed no shape change. Contract-first: resetsAt is read verbatim, never guessed client-side, so a weekly meter with resetsAt: null and any unrecognized resetKind both render no reset line (fail-soft, no crash, no stale copy). Tests cover both weekly branches, the resetsAt: null fallback, and the unknown-resetKind fallback.",
"tests": "All from repo root against merge-base 20c04b2 (rebased after #7366/#7367 landed touching i18n), commit 1b7793e: pnpm --filter '@object-ui/app-shell^...' build exit 0; pnpm exec vitest run packages/app-shell/src/layout/ packages/i18n/ --maxWorkers=2 -> 'Test Files 91 passed (91) / Tests 1152 passed (1152)'; pnpm --filter @object-ui/app-shell type-check exit 0; node scripts/check-i18n-call-site-keys.mjs exit 0 -> 'Every in-scope call-site key resolves against the en pack (2959 keys)...'; node scripts/check-i18n-en-drift.mjs exit 0 -> '0 en value(s) changed (6 key(s) added...)'; node scripts/check-i18n-dead-keys.mjs (report-only) exit 0, new keys absent from its dead-key report; node scripts/check-changeset-presence.mjs exit 0 -> '13 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)'; node scripts/check-changeset-no-major.mjs and node scripts/check-control-bytes.mjs exit 0. No ablation applicable to this change.",
"mcp_calls": 0,
"open_questions": [],
"out_of_scope_findings": []
}
Ruling check: resetKind: 'weekly' renders "Resets in N days" (hours inside the final day) computed from resetsAt only — never guessed client-side; weekly with resetsAt: null and any unknown kind render no reset line (fail-soft); no token numbers. Contract matches cloud PR perf(studio): lazy-mount live block previews in the page designer canvas #1852 (UsageResetKind + resetsAt).
Evidence: layout + i18n suites 91 files / 1152 tests green; type-check exit 0; i18n call-site keys (2959) / en-drift (0 changed, 6 added) / dead-keys / changeset / control-bytes gates quoted OK; rebased onto main after fix(studio,chatbot,i18n): workbench labels over internal ids, localized property panel, one tool-card status #7366 landed on the same packs. No ablation — additive rendering branch with direct positive+negative tests; acceptable at S tier.
CI: 20/30 complete, 0 failed at review time. Flipping ready; enqueuing when every check is green.
os-dev-report
{
"issue": 7371,
"status": "done",
"branch": "claude/issue-7371-usage-indicator-weekly",
"pr": "#7374",
"premise_still_valid": true,
"summary": "Patch round on PM's report: CI's package-level pnpm lint (unlike my earlier targeted run) hit react-hooks/purity — weeklyResetLabel called Date.now() directly in AiUsageIndicator's render body. Moved the clock read out of render: a useState<number | null>(null) populated by a mount effect (refreshed every 60s), with the render body only reading that state and doing pure day/hour math from resetsAt/now. now === null (the one frame before the effect fires) renders no reset line, same treatment as any other not-yet-known input. No behavior change otherwise; existing weekly tests pass unmodified since RTL flushes the mount effect before assertions run.",
"tests": "New head 3003f23 (on top of 1b7793e, same branch, fast-forward push, no force). All from repo root: pnpm --filter @object-ui/app-shell lint -> before the fix reproduced CI's exact failure ('133:51 error Cannot call impure function during render' / react-hooks/purity, 1 error + 2876 pre-existing warnings, exit 1); after the fix -> exit 0, '0 errors, 2877 warnings' (warning count pre-existing/unrelated, not gated by --max-warnings). pnpm --filter '@object-ui/app-shell^...' build exit 0. pnpm --filter @object-ui/app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json) exit 0. pnpm exec vitest run packages/app-shell/src/layout/ --maxWorkers=2 -> 'Test Files 33 passed (33) / Tests 225 passed (225)', including the weekly-reset tests added in the prior round, unmodified. Re-ran node scripts/check-i18n-call-site-keys.mjs, node scripts/check-changeset-presence.mjs, node scripts/check-control-bytes.mjs — all exit 0, unaffected (this round touched only AiUsageIndicator.tsx, no i18n/changeset files). Remote CI on 3003f23 was still in_progress at report time (Lint/Type Check/Test shards running, everything else already green) — not polled further per the no-CI-polling rule; local reproduction of the exact CI failure signature going 1 error -> 0 is the evidence.",
"mcp_calls": 0,
"open_questions": [],
"out_of_scope_findings": []
}
Patch round accepted (head 3003f23): the clock read moved out of render into a mount effect refreshed every 60s, render does pure math from resetsAt/state; the CI react-hooks/purity signature reproduced locally (1 error → 0), layout suite 33 files / 225 tests, type-check clean. Enqueuing when every check on the new head is green. Generated by Claude Code
Activity
hotlong commentedon Sep 2, 2026
Claim: PM loop round 3 (epic objectstack-ai/cloud#1841)
Session:
session_c5c0ce54-bb9c-478c-9e5b-cf44b80d4569Branch:
claude/issue-7371-usage-indicator-weeklyWorktree:
objectui-issue-7371Domain: domain:ui
File surface:
packages/app-shell/src/layout/AiUsageIndicator.tsx+ its tests, the usage response type,packages/i18n/**zh/en keys for the new sentence (stop on breach; explain in the report)Container & model: S, mode:subagent, model: sonnet (PM judgement)
Clause-②: no
Serial constraints cleared: objectui#7273 (merged) touched AiUsageIndicator — base on current main; #7256 (in flight) owns console home/logo, not this file; #7366 (enqueued) touches i18n packs — different keys, rebase before pushing
hotlong commentedon Sep 2, 2026
os-dev-report
{
"issue": 7371,
"status": "done",
"branch": "claude/issue-7371-usage-indicator-weekly",
"pr": "#7374",
"premise_still_valid": true,
"summary": "AiUsageIndicator (packages/app-shell/src/layout/AiUsageIndicator.tsx) now recognizes resetKind: 'weekly' from the free plan's rolling 7-day AI quota window (cloud PR #1852), rendering 'Resets in N days' (or N hours inside the final day) computed from resetsAt via new @object-ui/i18n keys (real plural family, base + _one/_other, all ten locale packs). AiUsageResetKind gained 'weekly'; resetsAt was already string | null on this side and needed no shape change. Contract-first: resetsAt is read verbatim, never guessed client-side, so a weekly meter with resetsAt: null and any unrecognized resetKind both render no reset line (fail-soft, no crash, no stale copy). Tests cover both weekly branches, the resetsAt: null fallback, and the unknown-resetKind fallback.",
"tests": "All from repo root against merge-base 20c04b2 (rebased after #7366/#7367 landed touching i18n), commit 1b7793e:
pnpm --filter '@object-ui/app-shell^...' buildexit 0;pnpm exec vitest run packages/app-shell/src/layout/ packages/i18n/ --maxWorkers=2-> 'Test Files 91 passed (91) / Tests 1152 passed (1152)';pnpm --filter @object-ui/app-shell type-checkexit 0;node scripts/check-i18n-call-site-keys.mjsexit 0 -> 'Every in-scope call-site key resolves against the en pack (2959 keys)...';node scripts/check-i18n-en-drift.mjsexit 0 -> '0 en value(s) changed (6 key(s) added...)';node scripts/check-i18n-dead-keys.mjs(report-only) exit 0, new keys absent from its dead-key report;node scripts/check-changeset-presence.mjsexit 0 -> '13 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)';node scripts/check-changeset-no-major.mjsandnode scripts/check-control-bytes.mjsexit 0. No ablation applicable to this change.","mcp_calls": 0,
"open_questions": [],
"out_of_scope_findings": []
}
hotlong commentedon Sep 2, 2026
ACCEPT — reviewer of record: PM (epic objectstack-ai/cloud#1841), verified against GitHub.
Fixes #7371, 14 files:AiUsageIndicator.tsx(+30/−5),useAiUsage.tstype union, test (+64), the 10 i18n packs (a real plural family, en +11 / others +6), changeset — inside the surface.resetKind: 'weekly'renders "Resets in N days" (hours inside the final day) computed fromresetsAtonly — never guessed client-side;weeklywithresetsAt: nulland any unknown kind render no reset line (fail-soft); no token numbers. Contract matches cloud PR perf(studio): lazy-mount live block previews in the page designer canvas #1852 (UsageResetKind+resetsAt).type-checkexit 0; i18n call-site keys (2959) / en-drift (0 changed, 6 added) / dead-keys / changeset / control-bytes gates quoted OK; rebased onto main after fix(studio,chatbot,i18n): workbench labels over internal ids, localized property panel, one tool-card status #7366 landed on the same packs. No ablation — additive rendering branch with direct positive+negative tests; acceptable at S tier.Generated by Claude Code
hotlong commentedon Sep 2, 2026
os-dev-report
{
"issue": 7371,
"status": "done",
"branch": "claude/issue-7371-usage-indicator-weekly",
"pr": "#7374",
"premise_still_valid": true,
"summary": "Patch round on PM's report: CI's package-level
pnpm lint(unlike my earlier targeted run) hit react-hooks/purity —weeklyResetLabelcalledDate.now()directly in AiUsageIndicator's render body. Moved the clock read out of render: auseState<number | null>(null)populated by a mount effect (refreshed every 60s), with the render body only reading that state and doing pure day/hour math from resetsAt/now. now === null (the one frame before the effect fires) renders no reset line, same treatment as any other not-yet-known input. No behavior change otherwise; existing weekly tests pass unmodified since RTL flushes the mount effect before assertions run.","tests": "New head 3003f23 (on top of 1b7793e, same branch, fast-forward push, no force). All from repo root:
pnpm --filter @object-ui/app-shell lint-> before the fix reproduced CI's exact failure ('133:51 error Cannot call impure function during render' / react-hooks/purity, 1 error + 2876 pre-existing warnings, exit 1); after the fix -> exit 0, '0 errors, 2877 warnings' (warning count pre-existing/unrelated, not gated by --max-warnings).pnpm --filter '@object-ui/app-shell^...' buildexit 0.pnpm --filter @object-ui/app-shell type-check(tsc --noEmit && tsc -p tsconfig.test.json) exit 0.pnpm exec vitest run packages/app-shell/src/layout/ --maxWorkers=2-> 'Test Files 33 passed (33) / Tests 225 passed (225)', including the weekly-reset tests added in the prior round, unmodified. Re-rannode scripts/check-i18n-call-site-keys.mjs,node scripts/check-changeset-presence.mjs,node scripts/check-control-bytes.mjs— all exit 0, unaffected (this round touched only AiUsageIndicator.tsx, no i18n/changeset files). Remote CI on 3003f23 was still in_progress at report time (Lint/Type Check/Test shards running, everything else already green) — not polled further per the no-CI-polling rule; local reproduction of the exact CI failure signature going 1 error -> 0 is the evidence.","mcp_calls": 0,
"open_questions": [],
"out_of_scope_findings": []
}
hotlong commentedon Sep 2, 2026
Patch round accepted (head 3003f23): the clock read moved out of render into a mount effect refreshed every 60s, render does pure math from
resetsAt/state; the CIreact-hooks/puritysignature reproduced locally (1 error → 0), layout suite 33 files / 225 tests,type-checkclean. Enqueuing when every check on the new head is green. Generated by Claude Code