Skip to content

Release v1.7.0 - #525

Merged
b-at-neu merged 60 commits into
mainfrom
dev
Aug 20, 2026
Merged

Release v1.7.0#525
b-at-neu merged 60 commits into
mainfrom
dev

Conversation

@b-at-neu

Copy link
Copy Markdown
Collaborator

Release v1.7.0

Changes

Dependabot

Testing plan

  • Edit your display name from the user dropdown → new name appears in the dropdown and across the app
  • Change an application's status using the new quick actions → only valid next steps are offered and the transition graph is enforced
  • Attempt to move an application to an invalid target status (e.g. back to a skipped/withdrawn state) → the app blocks it with the correct messaging
  • Deactivate a user, then try to sign in as them → they land on the account-deactivated explanation screen
  • As an admin, reactivate a deactivated user → they can sign in normally again
  • View the applications page on a wide screen → layout uses the new full-width container correctly
  • Open a PR without the claude label → the approval check is skipped rather than blocking

cielbellerose and others added 30 commits August 19, 2026 16:54
resolveRealUser used to return null after a valid session had already
resolved, silently bouncing a deactivated user back to /login forever.
Distinguishes that case and sends it to /login/deactivated instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Deactivation was previously one-way, with no way to restore access.
Adds Users → Deactivated accounts, listing soft-deleted rows with a
reactivate action scoped by the existing authorization helpers, and
points createUser's duplicate-email error at it.

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>
#387 was rescoped: reactivation stays a database operation, so this
drops the admin-only deactivated-accounts page/table, the
reactivateUser action and its query, the entry point link, and the
now-unused type. Copy that referenced the removed page is updated to
point at contacting an administrator instead. Extends the
authorization test suite to assert deactivated users are excluded
from admin-facing queries.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Points admin-facing deactivation copy at the real remediation
(database change, contact engineering) instead of "an administrator,"
trims an over-length comment, and fixes deactivated-screen text hierarchy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bumps [@hookform/resolvers](https://github.com/react-hook-form/resolvers) from 5.8.0 to 5.9.0.
- [Release notes](https://github.com/react-hook-form/resolvers/releases)
- [Commits](react-hook-form/resolvers@v5.8.0...v5.9.0)

---
updated-dependencies:
- dependency-name: "@hookform/resolvers"
  dependency-version: 5.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Reuses the existing setUserName action and nameSchema; warns that a
rename propagates to every application, submitted and decided alike.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Better Auth's updateUser writes the same public.User row through the
Prisma adapter, so it was a no-op round trip that only failed for
bypass users. setUserName is the single write path now.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Editable profile names mean a display name can drift after a user
applies. Freeze it on Application.applicantName at submit time, same
pattern as GlobalApplicationAnswer.questionLabel, and prefer it over
the live profile name on reviewer-facing read paths.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ticket #443 now documents the applicant-name snapshot as intended
behavior, so update the dialog's warning to match: renaming applies
going forward only, and already-submitted applications keep the
name on file at the time. Also trims an over-length schema comment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Application.applicantName freezes the name at submission time; show
it inline as "Snapshot (Current)" wherever the applicant name appears
so a rename since submission stays visible without losing the snapshot.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Extracts the applicantName/user.name comparison into lib/utils.ts's
getRenamedTo, reused in the application detail page and both table
layouts, and adds the same "(current name)" cue to the activity feed
and recent-applications widget so it's consistent across every surface
that renders a rename-eligible applicant name.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ame-from-the-user-dropdown

#443 Let Users Edit Their Name From The User Dropdown
…d-screen-and-admin-reactivation

#387 Add an Account Deactivated Screen and Admin Reactivation
…okform/resolvers-5.9.0

Bump @hookform/resolvers from 5.8.0 to 5.9.0
Bumps [@prisma/adapter-pg](https://github.com/prisma/prisma/tree/HEAD/packages/adapter-pg) from 7.8.0 to 7.9.1.
- [Release notes](https://github.com/prisma/prisma/releases)
- [Commits](https://github.com/prisma/prisma/commits/7.9.1/packages/adapter-pg)

---
updated-dependencies:
- dependency-name: "@prisma/adapter-pg"
  dependency-version: 7.9.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Single source of truth for the six-status pipeline direction, so the
server guard and the rendered quick actions can't drift apart.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
updateApplicationStatus and updateApplicationStatuses now scope their
writes to the graph's legal source states, so an illegal move fails
even from a forged request or a stale tab. Bulk failures and
concurrent-change misses now return a user-facing error naming the
target instead of throwing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ApplicationStatusActions renders only the legal next moves for the
current status — primary/secondary forward buttons, a destructive
Reject, and explicit move-back controls — as a roomy panel on the
review detail page and a constrained menu in the per-position table.
Accept and Reject route through the shared confirm dialog.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Unit tests assert the graph invariants (totality, no self-loops,
rejected reachability, source/target inversion). DB tests replace the
old "every target reachable from applied" loop with the full 6x6
source x target matrix and add mixed-selection bulk cases.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Scope bulk status updates to forward-only sources so a batch move
can't silently walk an already-decided row backward, matching the
PR's stated bulk behavior. Also closes the confirm dialog on a
failed move and trims two comments to the one/two-line rule.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
getApplicationStatusForwardSources returned [] for 'applied' since no
state's forward list ever contains it, making bulk moves to Applied
always no-op. Fall back to back-sources when a target has no forward
source at all.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds direct unit invariants for getApplicationStatusForwardSources'
back-only fallback, per R3-L1.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ixes

Reword interview_scheduled to a status label, wire the compact quick-
actions menu into the live applications table, and name reachable
source statuses in bulk-move error/toast copy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The bulk "unreachable target" copy computed sources with the full
source set instead of the forward-only set that actually scopes the
updateMany where-clause, so it could list back-only statuses as valid
bulk targets. Match the message to the query and update the stale
test assertion.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
getApplicationStatusForwardSources('reviewing') resolves to
[applied, reached_out, interview_scheduled] now that the action uses
forward-only sources; the test still expected the old two-source text.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The bulk-status toast said skipped rows were "still selected", but
onApplied only retains ids skipped for a non-reviewable status —
rows skipped for a forward-source mismatch (e.g. applied ->
interview_scheduled) are deselected, making the claim false.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The gate exists to stop mid-pipeline PRs merging early, not to enforce
review universally, so PRs outside the pipeline now skip it — which
also unblocks Dependabot with no special case. Skipping at the job
level still reports the required check as `skipped`; filtering the
trigger would leave it pending forever.

Trade-off is fail-open: a pipeline PR missing `claude` loses its gate,
so impl-agent applies the label at `gh pr create` and the cockpit
sweeps for tracked PRs without it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
b-at-neu and others added 25 commits August 19, 2026 18:46
…k-on-the-claude-label

#513 Gate The Approval Check On The Claude Label
…isma/adapter-pg-7.9.1

Bump @prisma/adapter-pg from 7.8.0 to 7.9.1
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…rker

One marker string in the issue plan and the PR description, read from the
body field the cockpit's trigger queries already return. Names the routing
rather than the cause, so future non-.claude categories reuse it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#513 gated approval-check.yml on the claude label, so an operator-run PR
opened without it would merge with no approval gate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reconciles the three-way local/CI/README disagreement so
node-version-file: package.json in CI actually resolves to something.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
target ES2017 -> ES2022; add noUncheckedIndexedAccess, noUnusedLocals,
noUnusedParameters and fix every access site the flags surfaced.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds no-floating-promises, no-misused-promises,
no-unnecessary-type-assertion, no-unnecessary-condition,
switch-exhaustiveness-check, and a no-restricted-imports guard on
@/lib/prisma reaching non-data/action code. lib/prisma.ts gets
import 'server-only' as the guard's runtime twin.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
checkout/setup-node to v7 with node-version-file + npm cache, npm ci
over npm install, concurrency cancel-in-progress on every PR workflow,
and tsc-check's forbidden npx prisma generate swapped for the script.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New non-required-by-default checks: run-build-check (real postgres +
npm run build), run-lockfile-check + run-audit-check, and CodeQL.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds workflow_dispatch (target: dev|production) for a staging dry run,
an environment gate for a required-reviewer approval on production, a
migrate-status preflight that fails on drift before anything applies,
and a rollback runbook in the header comment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Exclude bundled sub-dependencies from the lockfile pinning check, and
fail closed on migrate-db preflight errors instead of treating any
non-"drift detected" exit as safe to apply.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- keep build-check.yml unchanged
- drop run-audit-check and the schedule trigger from lockfile-check.yml
  (formerly dependency-check.yml), renamed to match file/job naming
  convention
- remove .github/CODEOWNERS
- consolidate node version pinning to package.json engines; drop .nvmrc
  and point README at engines instead of restating the version, keeping
  the dependabot @types/node major-bump guardrail

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Drop the dependabot ignore rule for @types/node major bumps and
widen its package.json range to * so tsc/tests catch mismatches
instead of a sync-check.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cut lockfile-check.yml and migrate-db.yml header/inline comments down
to terse, load-bearing notes matching the rest of the repo's
workflows; drop codeql.yml's weekly cron, pull_request only.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…script-and-ci-configuration

#391 Strengthen ESLint, TypeScript, And CI Configuration
Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.3.2 to 4.3.3.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: tailwindcss
  dependency-version: 4.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
buildApplicationWhere/buildApplicationScopeWhere/buildReviewablePositionWhere
replace the file-private buildBaseWhere and the two hand-rolled manager
clauses in actions/applications.ts; the 'listable' | 'reviewable' argument
replaces the per-caller withdrawn patches, and the omitted status key on
the scope builder makes overwriting the manager scope a type error rather
than a "merge, don't overwrite" comment. /applications search params are
now zod-parsed instead of cast.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Step 3 checks the item's body for the SESSION REQUIRED marker but the
gh pr view / gh issue view calls above it didn't request the body
field, so there was nothing to inspect at that point.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ization-scope-copies

#393 Share The Remaining Authorization Scope Copies In Application Actions
…ilwindcss-4.3.3

Bump tailwindcss from 4.3.2 to 4.3.3
Announcing was a caveat buried in the dispatch table, not a tick step, and
nothing said the human must run /implement in a session other than the
cockpit's own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…g-tickets-from-an-operator-session

#503 Implement .claude Config Tickets From an Operator Session
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@b-at-neu b-at-neu self-assigned this Aug 20, 2026
@vercel

vercel Bot commented Aug 20, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
aplio Ready Ready Preview Aug 20, 2026 4:12am

@b-at-neu
b-at-neu merged commit b8a390d into main Aug 20, 2026
11 checks passed
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