Skip to content

Release v1.14.0 - #779

Merged
b-at-neu merged 44 commits into
mainfrom
dev
Sep 25, 2026
Merged

b-at-neu merged 44 commits into
mainfrom
dev

Conversation

@b-at-neu

@b-at-neu b-at-neu commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

Release v1.14.0

Changes

Testing plan

  • View the users page → a Last sign-in column is shown
  • Open a position as a manager → the activity panel shows activity for when it was opened
  • Open the activity panel from anywhere in the app → recent activity now lives in one global panel
  • Hover over a tooltip trigger → the tooltip animates in, not just out
  • View a draft application past its position's deadline → the continue action is hidden instead of shown disabled
  • Scroll through a page with sidebar section nav → the sidebar highlights the section actually in view
  • As a manager with unresolved work, receive the daily digest email → it summarizes work since your last digest

b-at-neu and others added 30 commits September 23, 2026 19:52
manager_digest shipped in #547 but nothing ever wrote it. Renaming it
now and adding manager_weekly_digest is data-preserving since the
column is still unused.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
previousOrgDay, currentOrgWeekStart and previousOrgWeek do their
arithmetic on the org calendar date, never a resolved instant, so a
DST transition inside the shifted range can't shift the day count.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
getDailyDigestRecipients/getWeeklyDigestRecipients compute recipients
from EmailLog alone (no new column) — a manager already digested
inside the current calendar day/week is dropped and counted as
skipped, so a repeat cron fire is a no-op.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two static routes, not one route with a mode param — each names and
runs exactly the one digest its path names, so it stays a falsifiable
allowlist line rather than a job runner. Both reject any request whose
Authorization header isn't the CRON_SECRET bearer token before
touching the database.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Appends both cron routes to CLAUDE.md's allowlist per #569's shape,
and updates ENGINEERING/PERMISSIONS/WORKFLOWS for the new swallow
site, the machine-authenticated route, and the two digest workflows.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The weekly email no longer tallies "new applications this week" — a
manager gets it only when they have applications still short of a
terminal status, with a status-count box per status (color-coded like
the in-app badges) instead of a text recap. previousOrgWeek has no
remaining caller and is removed along with it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the previous-org-calendar-day window with a gap-safe one
anchored to each manager's own last digest (24h fallback for a
first-ever digest). A missed or delayed cron fire can no longer drop
an application, and in steady daily operation the window is still
always ~24h. The email now names the exact since-instant rather than
a calendar day, since the window can span more than a day after a gap.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
#747 (merged to dev after this branch's last rebase) dropped the
default and made Application.submittedAt nullable — a draft no longer
has a fake submission timestamp. fetchNewApplications already excludes
drafts by status, so the null case can't occur in practice; narrow the
type back with a filter rather than loosening the daily digest's own
types to Date | null everywhere downstream.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the IntersectionObserver-based active section detection with
scroll-position measurements. The old approach let an edge-only overlap
of the previous section win over the section actually being read, and
never let the last section highlight once the user was already at the
bottom of the page.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…iew-in-sidebar-nav

#769 Highlight The Section In View In The Sidebar Section Nav
MyApplicationPrimaryAction now gates draft the same way withdrawn was
already gated, and both degrade to a disabled Continue/Edit & resubmit
with an aria-describedby reason instead of a bare removal or note.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Move the blocked-action reason from visible text into a shared
hover/focus tooltip (with an sr-only fallback for screen readers),
reused by both GatedActionButton and MyApplicationPrimaryAction so
the pattern can't drift between the two surfaces.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
DisabledActionTooltip took a render-prop function as children, which
crashes when a server component (the applications detail page) renders
it. Switched to a plain element the component clones internally; it now
also owns the pointer-events wrapper so hover opens the tooltip when the
inner control has pointer-events:none.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…on-on-past-deadline-drafts

#748 Hide The Continue Action On Past-Deadline Drafts
Radix Tooltip never sets data-state="open" on TooltipContent (its
open states are delayed-open/instant-open), so the gated enter
classes never matched. Make the enter animation unconditional.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…-well-as-out

#772 Animate Tooltips In As Well As Out
Relocates the dashboard "Recent activity" card into a Sheet reachable
from every authenticated page (sidebar on desktop, mobile-nav on
mobile), so activity isn't tied to standing on the dashboard.
getActivityGroups composes the caller's own applications with a
reviewer group scoped to managed/all positions, self-filtered so a
reviewer's own application never appears twice.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Match the activity skeleton to the resolved two-heading layout for
reviewer scopes, and fall back to a muted message instead of the
global error boundary when the feed's fetch throws.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…nto-a-global-activity-panel

#617 Move Recent Activity Into A Global Activity Panel
Records every position status change, mirroring ApplicationStatusEvent,
so the activity panel can later show "position opened" items.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Wraps the status write in a transaction with a compare-and-swap on the
prior status, so a concurrent change surfaces a clear error instead of
silently overwriting, and writes a PositionStatusEvent per real move.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
getRecentPositionOpenings reads PositionStatusEvent rows scoped like
the existing application feed; getActivityGroups merges them in by
time and caps the combined reviewer group at 10.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
A row with an href renders as a Link wrapped in SheetClose so opening
it also closes the panel; plain application rows are unaffected.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Covers scoping (manager, other manager, applicant, admin), reopen vs
close, returning to draft, and merge-and-cap behavior in
getActivityGroups, plus the event write itself in updatePositionStatus.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
cielbellerose and others added 13 commits September 24, 2026 18:22
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Add manual and deadline-close activity rows, and trim three
over-long comments flagged for the same discipline rule.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds the deletion row for the activity panel (R3-M1, second amendment
in #775): a published position deleted while open/closed shows an
unlinked "was deleted" item, derived from deletedAt with no schema
change. Fixes the scope gap where deleting a manager's only position
would drop their reviewer group before the notification could show.
Also compresses the deadline-close comment flagged as R3-L1.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Stored on User because sessions are hard-deleted on sign-out, expiry,
and deactivation, so nothing derived from Session survives long enough
to answer "who has gone quiet". The write moves into the session
create `after` hook so a blocked (deactivated) sign-in never stamps it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Makes the nulls-last sort rule unit-testable independently of the
DataTable component; behavior is unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sorts nulls (never-signed-in users) last in both directions; dash cells
carry an sr-only "No sign-in recorded" label, and a footnote explains
what the dash means since nothing is backfilled.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Deletion no longer erases a position's earlier activity history: opened,
closed and deadline-close rows now survive deletion, rendered unlinked.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Remove the permanent footnote under the users table per operator
request; the "—" cell and its screen-reader text still explain the
missing sign-in.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…-when-position-opened

#775 Show Managers Activity When Their Position Is Opened
…umn-to-the-users-page

#645 Add A Last Sign-In Column To The Users Page
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@b-at-neu b-at-neu self-assigned this Sep 25, 2026
@vercel

vercel Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
aplio Ready Ready Preview Sep 25, 2026 2:05pm UTC

@b-at-neu
b-at-neu merged commit acbb7d9 into main Sep 25, 2026
11 checks passed

This branch was successfully deployed

1 active deployment
Preview — ec155259 Deployed Sep 25, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants