refactor(home): let useSessionManagement own six session states
5.4: sessionsCursor / showArchivedSessions / sessionMenuId / pendingSessionDeletion / sessionDetailLoadingId / sessionFullPrompt move into use-session-management.ts, which now also computes visibleSessions from the archived flag it owns. Home reads back only what its own JSX renders. sessions / activeSessionId / creatingSession / pendingSessionId stay in the shell: each is read by the bootstrap effect or the consultation run before the session hook is called. Reasons are listed one by one in the progress record. useSessionManagement params 41 -> 34, useProfileOnboarding 38 -> 26. The growth contract tightens to useState 36 / useRef 37 / lines 1846 and gains an assertion that useSessionManagement still runs before useRectificationSurface, with the opener handed over through rectificationSessionOpenerRef. Zero behavior change, zero copy change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
This commit is contained in:
co-authored by
Claude Opus 5
parent
e6c6839742
commit
bdb81c8c86
@@ -4,16 +4,19 @@ import test from "node:test";
|
||||
|
||||
const pageSource = readFileSync(new URL("../src/app/page.tsx", import.meta.url), "utf8");
|
||||
|
||||
// Measured 2026-09-16 after home-state-lowering on origin/staging @ 3b17c1b2.
|
||||
// Line count: (pageSource.match(/\n/g) ?? []).length, same as `wc -l` = 1931.
|
||||
// Measured 2026-09-16 after home-state-lowering batch 2 on origin/staging @ 37e6c519.
|
||||
// Line count: (pageSource.match(/\n/g) ?? []).length, same as `wc -l` = 1846.
|
||||
// Hook counts use \buseState[<(] / \buseRef[<(] so `useState<Type>(` is not missed.
|
||||
// Former caps were useState 66 / useRef 41 / lines 1951 on freeze-metric @ 51a65d92.
|
||||
// This round moved 14 rectification useStates out of Home (15 → 1 shell object)
|
||||
// and 2 rectification refs into useRectificationSurface.
|
||||
const PAGE_LINE_COUNT_BASELINE = 1931;
|
||||
// Former caps were useState 52 / useRef 39 / lines 1931 after batch 1 @ f8e607c2,
|
||||
// and useState 66 / useRef 41 / lines 1951 on freeze-metric @ 51a65d92.
|
||||
// Batch 2 moved 4 synastry useStates into useSynastry, 6 profile useStates into
|
||||
// useProfileOnboarding and 6 session useStates into useSessionManagement, and
|
||||
// dropped the two guided-birth-time callback refs that the profile hook no longer
|
||||
// needs now that it runs before useBirthTimeGuidedJourney.
|
||||
const PAGE_LINE_COUNT_BASELINE = 1846;
|
||||
const PAGE_LINE_COUNT_CAP = PAGE_LINE_COUNT_BASELINE + 150;
|
||||
const HOME_USE_STATE_CAP = 52;
|
||||
const HOME_USE_REF_CAP = 39;
|
||||
const HOME_USE_STATE_CAP = 36;
|
||||
const HOME_USE_REF_CAP = 37;
|
||||
|
||||
const USE_STATE_RE = /\buseState[<(]/g;
|
||||
const USE_REF_RE = /\buseRef[<(]/g;
|
||||
@@ -52,3 +55,29 @@ test("page.tsx line count stays within the coarse guardrail", () => {
|
||||
`page.tsx has ${n} lines; cap is ${PAGE_LINE_COUNT_CAP} (${PAGE_LINE_COUNT_BASELINE} baseline + 150).`,
|
||||
);
|
||||
});
|
||||
|
||||
test("useSessionManagement still runs before useRectificationSurface", () => {
|
||||
// Batch 1 established the order: useSessionManagement needs an opener for
|
||||
// history rectification sessions, and useRectificationSurface is what supplies
|
||||
// it, so the opener is handed over through rectificationSessionOpenerRef
|
||||
// instead of by calling the surface hook first. Batch 2 moved hook calls
|
||||
// around; this pins the constraint so a later reorder cannot silently break
|
||||
// opening a rectification session from the sidebar.
|
||||
const home = homeSource(pageSource);
|
||||
const sessionCall = home.indexOf("= useSessionManagement({");
|
||||
const surfaceCall = home.indexOf("= useRectificationSurface({");
|
||||
const openerRef = home.indexOf("const rectificationSessionOpenerRef = useRef(");
|
||||
assert.notEqual(sessionCall, -1, "Home must call useSessionManagement");
|
||||
assert.notEqual(surfaceCall, -1, "Home must call useRectificationSurface");
|
||||
assert.notEqual(openerRef, -1, "Home must declare rectificationSessionOpenerRef");
|
||||
assert.ok(openerRef < sessionCall, "the opener ref must exist before useSessionManagement reads it");
|
||||
assert.ok(
|
||||
sessionCall < surfaceCall,
|
||||
"useSessionManagement must run before useRectificationSurface; it receives the opener through rectificationSessionOpenerRef",
|
||||
);
|
||||
assert.match(
|
||||
home.slice(sessionCall, surfaceCall),
|
||||
/openRectificationSession: \(exactSessionId\) => rectificationSessionOpenerRef\.current\(exactSessionId\)/,
|
||||
);
|
||||
assert.match(home.slice(surfaceCall), /rectificationSessionOpenerRef,/);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user