82 lines
6.8 KiB
Markdown
82 lines
6.8 KiB
Markdown
# Verifier Report — commit b508583
|
|
|
|
**Verifier:** fresh-context, did not author the code.
|
|
**Commit:** `b50858396a186c0166b5bde6cefdafc0843b79a7` (HEAD of `main` at verification time; parent `d369f6a`).
|
|
**Date:** 2026-06-12.
|
|
|
|
## Verdict: PASS
|
|
|
|
All five claimed code changes are present, traceable to the mission, and covered by new tests.
|
|
All touched test files green; full FE suite 925/925 and server local suite 917/917 green;
|
|
both typechecks clean (0 errors). No scope creep, no new dependencies, no flags/shims found.
|
|
|
|
---
|
|
|
|
## 1. Diff review (claimed changes vs actual)
|
|
|
|
| # | Claim | Verified |
|
|
|---|---|---|
|
|
| 1 | Home briefing 'Up next' dedups global cron schedules across workspaces (`home.ts`) | YES — `seenUpNextLabels` Set hoisted above the per-workspace loop; both the per-workspace and global passes check/populate it. The old per-pass `seenLabels` (built from `upNext.map(label)`) is subsumed; at that point in the flow `upNext` only ever contained schedule items, so semantics are equivalent plus the new cross-workspace dedup. |
|
|
| 2 | `buildUpcomingSchedules` filters past-due `next_run_at` (`workspace-context.ts`) | YES — single added `.filter(s => new Date(s.next_run_at).getTime() > nowTs)` with a comment correctly pointing at cron-store `getDueSchedules`/`markRun` recompute. |
|
|
| 3 | Monthly assessment frame replace-on-update per period (`monthly-assessment.ts`) | YES — `frames.deleteByContentPrefix('# Monthly Agent Assessment — <period>')` before insert. The prefix exactly matches the content header built below it, and includes the period so other months are untouched. `deleteByContentPrefix` **pre-exists** in `packages/hive-mind-core/src/mind/frames.ts:343` (also used by `extract-memory-lanes.ts`) — the commit does NOT touch the OSS substrate. |
|
|
| 4 | Memory Center default status filter Active (`MemoryCenterTab.tsx`) | YES — `useState<'' | MemoryStatus>('active')` with rationale comment; the deep-link filter handler (`setStatus(detail.filter)`) is unchanged, so 'All' and deep-linked views still work. |
|
|
| 5 | Login briefing 30-min dismiss cooldown (`login-briefing.ts` + `useOverlayState.ts` + `AppShell.tsx`) | YES — new `LOGIN_BRIEFING_LAST_DISMISSED_AT_KEY` localStorage timestamp, `LOGIN_BRIEFING_COOLDOWN_MINUTES = 30`, optional `minutesSinceLastDismiss` input to the pure `shouldShowLoginBriefing`, wired in `useOverlayState`. `AppShell` records the timestamp on dismiss AND on open-workspace-from-briefing (both are engagement; correct). Corrupt/missing stored values return null → briefing shows (fail-open to the original behavior). |
|
|
| 6 | +11 regression tests | YES — exact count: 6 in `login-briefing.test.ts` (3 visibility-gate + 3 storage round-trip/corrupt), 1 in `p3-two-mind-memory.test.tsx`, 3 in `home.test.ts` (dedup-across-workspaces, past-due-excluded, `buildUpcomingSchedules` unit incl. workspace scoping), 1 in `monthly-assessment.test.ts` (replace same period / preserve other periods). |
|
|
| 7 | Goal artifacts: PLAN.md, notes/ (5 files, ~10 lines each), judging/screenshots/ (13 PNGs) | YES — non-code mission artifacts; PLAN.md §5 explicitly restates the boundary contract. |
|
|
|
|
**Boundary checks:**
|
|
- **No new dependencies** — no `package.json`/lockfile changes in the commit.
|
|
- **No flags or compat shims** — `LOGIN_BRIEFING_COOLDOWN_MINUTES` is a constant, not a toggle; the optional `minutesSinceLastDismiss?` param has null-means-never semantics, not a compat path.
|
|
- **Backend touched only to surface memory/agent state** — all 3 server changes are briefing/assessment display-correctness fixes.
|
|
- **Validation at system boundaries only** — the only added validation is `Number.isFinite` on a localStorage read (persisted external data = boundary). Correct.
|
|
- **No unrelated refactoring** — every changed line traces to one of the five fixes.
|
|
|
|
## 2. Touched test files
|
|
|
|
```
|
|
npx vitest run packages/server/tests/local/home.test.ts packages/server/tests/local/monthly-assessment.test.ts --root .
|
|
→ 2 files passed, 25/25 tests passed
|
|
|
|
npx vitest run apps/web/src/lib/login-briefing.test.ts apps/web/src/test/p3-two-mind-memory.test.tsx apps/web/src/test/p3-memory-center-app.test.tsx --root apps/web
|
|
→ 3 files passed, 43/43 tests passed
|
|
```
|
|
|
|
(The `briefing: state build failed ... dataDir` stderr lines in home.test.ts are intentional test-fixture noise — `localConfig` deliberately absent per the file header; the route's non-blocking catch handles it.)
|
|
|
|
## 3. Regression sweeps
|
|
|
|
```
|
|
npx vitest run --root apps/web → 89 files, 925/925 passed
|
|
npx vitest run packages/server/tests/local --root . → 76 files, 917/917 passed
|
|
```
|
|
|
|
Zero failures in either suite — no parent-commit comparison needed.
|
|
|
|
## 4. Typecheck
|
|
|
|
```
|
|
npx tsc --noEmit --project packages/server/tsconfig.json → exit 0
|
|
npx tsc -p apps/web/tsconfig.app.json --noEmit → exit 0
|
|
```
|
|
|
|
## 5. Do the new tests assert the new behavior?
|
|
|
|
Yes, all of them assert behavior (not implementation details):
|
|
- **Dedup:** 3 workspaces + 1 global schedule → injects `/api/home/briefing`, asserts exactly ONE "Memory compaction" label. This fails on the parent code (which emitted one per workspace).
|
|
- **Past-due:** past + future schedules → past absent, future present exactly once.
|
|
- **Unit:** `buildUpcomingSchedules` filters past, keeps future, excludes other-workspace schedules.
|
|
- **Assessment upsert:** save → re-save same period with changed data → save different period; asserts 2 total frames, exactly 1 for March, and that it carries the UPDATED value (`Interactions: 120`) — proves replace, not skip.
|
|
- **Memory default:** asserts the adapter is *called* with `status: 'active'` AND the Active button has `aria-pressed=true` — both data and UI contract.
|
|
- **Cooldown:** hides at 2 min, shows at 31 min, null (never dismissed) shows; storage round-trips minutes with injectable `now`, corrupt value → null. Boundary at exactly 30 min resolves to "show" (`< 30`), consistent with "30-min cooldown".
|
|
|
|
## 6. Minor observations (non-blocking, no action required)
|
|
|
|
1. **Label-collision dedup edge:** dedup keys on the display label `"<name> at <Mon D, H:MM>"`. Two *distinct workspace-scoped* schedules sharing the same name and same next-run minute across workspaces would render once. Implausible in practice and arguably desirable display behavior; consistent with "simplest thing that works."
|
|
2. **Clock-skew edge:** if the system clock moves backwards after a dismiss, `minutesSinceLastDismiss` is negative → `< 30` → briefing suppressed for up to 30 min. Harmless.
|
|
3. `writeLoginBriefingLastDismissedAt()` is also called on permanent dismiss — redundant (permanent flag wins) but harmless.
|
|
4. Untracked `judging/screenshots/_crops/` exists in the working tree but is not part of the commit.
|
|
|
|
## Final
|
|
|
|
**PASS** — all 5 fixes verified in-diff and behavior-asserted by 11 new tests; FE 925/925, server-local 917/917, tsc 0+0; zero scope creep, zero new deps, zero regressions.
|