Repository navigation
Releases: redcloud-nz/avut
Release list
0.12 - Dunedin
v0.12 (Dunedin)
D4H and D4H I3 are reorganised: D4H is now the one place to browse teams, members and equipment, and D4H I3 gains Return, issued-equipment views, notifications and templates that check they fit the recipient's team. Skill Track gets session times, a Skills page and a Packages catalogue, and the whole app gets a fresh look.
Highlights
- A fresh look — a tinted page with a white sidebar and navbar, one hover and selected style across every control, and recorded check results shown circled rather than filled.
- D4H, reorganised — D4H Views and I3 are now D4H and D4H I3, and D4H I3 needs D4H turned on. D4H has a team picker, team-scoped Members and member pages, Equipment Categories and Brands, Tasks, and an item page showing its parents and contents. Every D4H team, member, item, category, type, brand and model links to its page, and D4H's "kind" is called a Type throughout.
- Return items in D4H I3 — a Return Items form that queues a D4H task for each item, an Issued Types view for each team, and Return in the item page's Actions menu. Owners, Admins and the I3 roles can edit items in D4H and work its tasks.
- Issue and Return notifications — each organisation and team can list people to notify. Issue and Return now email them, and send the member a receipt at their D4H email address.
- Templates that fit the team — template pickers group D4H records by owner, and Issue Items offers only the templates that fit the recipient's team. An "Organisation-owned records only" setting flags templates that use team-owned records.
- Session times — sessions have a start and an optional end time, or run all day across several days, in a new organisation time zone setting. An approved session can't be edited until it's reopened.
- Packages and Skills — Skill Track's Catalogue is now Packages, split into Subscribed and Available. A new Skills page lists every subscribed skill, with a page for each skill and skill group.
- Withdrawn packages — unpublishing, archiving or deleting a package withdraws its skills from subscribers' sessions and reports. Subscribers still see the package and can unsubscribe.
- Session review and recording — a Show filter for conflicts or excluded checks on the review page, Include all and Exclude all in its checks dialog, and a Date checked field for recording a check from an earlier day.
- History for package authors — skill groups and skills have History pages, and a package's History covers its groups and skills.
- Safer D4H team sync — the sync dialog previews each change, lets you untick changes before applying, waits while another sync runs, and reports what it did. Linking a team opens the preview instead of importing straight away.
- Smaller things —
Mod+.opens a page's actions menu, the impersonation banner is back, screen-reader names for icon buttons, consistent menu widths, and Organisation Groups for system admins. - Security — Next.js 16.4.3 fixes two unauthenticated remote code execution advisories and a Server Actions denial of service, alongside Zod and other dependency patches.
The name
HMS Dunedin was a Danae-class light cruiser that served with the New Zealand Division from 1924 to 1937. Launched on the Tyne in 1918, she was the only Royal Navy ship to carry the name, and she relieved HMS Chatham as the division's flagship. She spent those years cruising New Zealand and the Pacific Islands, and brought relief to Napier after the 1931 Hawke's Bay earthquake. HMS Leander relieved her in 1937. In the Second World War she intercepted German merchant ships, among them the Hannover, which became the escort carrier HMS Audacity, and in June 1941 she took the tanker Lothringen with cipher material aboard. She was torpedoed by U-124 in the central Atlantic on 24 November 1941, and only 67 of her crew of 486 survived.
What's Changed
Other changes
- fix(deps): patch Next.js, Zod, Vitest and toml advisories; clear lint warnings by @alexwestphal in #485
- docs: v0.12 guides, screenshots and What's new by @alexwestphal in #484
- fix(d4h-i3): stop the Issue draft's delete button submitting the form by @alexwestphal in #483
- feat(i3): notification personnel and receipts for Issue and Return by @alexwestphal in #481
- feat(ui): a size scale for dropdown menu widths (#467) by @alexwestphal in #479
- fix: reopen forced-open pickers each time the page is reached (#470) by @alexwestphal in #478
- fix: give each form instance its own id with useId() by @alexwestphal in #477
- feat(i3): show D4H record owners on I3 templates and check them against the recipient's team by @alexwestphal in #469
- feat(d4h): say "Type" and cross-link D4H records (#455) by @alexwestphal in #466
- feat(d4h): one D4H browser for teams and the equipment catalogue; I3 gains Issued Types (#453) by @alexwestphal in #464
- feat(permissions): D4H permission family out of i3Item:update (#457) by @alexwestphal in #462
- feat(modules): rename D4H Views and I3 to D4H and D4H I3 by @alexwestphal in #460
- fix(d4h): make the team visible in D4HTeamMemberSelect by @alexwestphal in #458
- feat(i3): Return Items, D4H task queue and equipment item page by @alexwestphal in #451
- feat(ui): bring i3, notes, history and dialogs onto the tinted shell by @alexwestphal in #444
- feat(skill-track): rename the Catalogue to Packages, split subscribed/available, move Unsubscribe into a menu by @alexwestphal in #441
- fix(forms): log onInvalid validation errors with console.warn by @alexwestphal in #440
- fix(skill-track): handle group and package deletes for subscribers by @alexwestphal in #438
- fix: v0.12 small fixes (wave 4) by @alexwestphal in #436
- refactor(ui): headings outside cards on org settings and the skill catalogue by @alexwestphal in #435
- fix(a11y): give every Button an accessible name by @alexwestphal in #433
- fix(d4h): persisted, skippable team sync plans (#120, #144, #164) by @alexwestphal in #430
- feat: one type scale for form fields by @alexwestphal in #431
- feat: plain-English form validation messages instead of Zod defaults by @alexwestphal in #426
- feat(skill-track): add skill and skill group detail pages by @alexwestphal in #424
- feat(skill-track): add Skills list page of all subscribed skills by @alexwestphal in #414
- feat(skill-package-builder): history for skill groups and skills, and package history that covers them by @alexwestphal in #413
- feat(docs): docs layout with header search, "On this page" and mobile nav; hide flag-hidden glossary terms by @alexwestphal in #411
- feat(skill-track): session start/end times in the org's time zone; approved sessions read-only by @alexwestphal in #410
- feat(organization-groups): organization groups v1 — groups and memberships managed from system admin by @alexwestphal in #407
- feat(skill-track): Show filter and include/exclude all on the session review page by @alexwestphal in #405
- fix(skill-track): withdraw unpublished and archived skill packages from subscribers by @alexwestphal in #404
- feat(skill-track): back-date standalone skill checks (#386) by @alexwestphal in #401
- docs: record route access control, drop UX-only page guards (#138) by @alexwestphal in #400
- refactor: system-admin and user UI into src/modules (#385, 5/5) by @alexwestphal in #399
- refactor: skill-track UI into src/modules (#385, 4/5) by @alexwestphal in #398
- refactor: org-admin UI into src/modules (#385, 3/5) by @alexwestphal in #397
- refactor: skill-package-builder, i3, d4h-views and notes into src/modules (#385, 2/5) by @alexwestphal in #396
- refactor: src/modules boundary and shared org UI (#385, 1/5) by @alexwestphal in #395
- docs: v0.12 work plan by @alexwestphal in #394
- fix: v0.12 wave 1 — module gating, D4H link checks, impersonation banner, Mod+. actions menu by @alexwestphal in #393
- style(ui): tinted page shell with white chrome and one hover/selected rule (#381) by @alexwestphal in #391
- chore: move brainstorms to redcloud-nz/avut-ideas by @alexwestphal in #377
- chore: release-process fixes for v0.12 by @alexwestphal in #376
Full Changelog: v0.11.1...8585cd0
0.11.1 - Laburnum
v0.11.1 (Laburnum)
Patch fixing standalone skill checks and tightening session configuration.
Highlights
- Checks added on the Checks page count in reports —
createSkillCheck
left standalone checks at theDraftdefault, and nothing ever moves a
standalone check on, so they never reached the reports. They're now created
asInclude. The Add Skill Check dialog no longer suggests it's for
historical results (back-dating is #386), and the help cards and guides say
these checks count. Because they now skip review, the server also checks
each one: the assessor must be the person recording it, the assessee a
person in the organisation, and the skill one it can assess. Reports refetch
after a check is added. (#368) - Session configuration only accepts the organisation's own personnel and
skills — adding assessees or skills to a session now rejects a person from
another organisation or one that's deleted, and a skill from a package the
organisation doesn't subscribe to or one that's deleted. All three
configuration changes (personnel, skills, assessors) also take the session
lock, so they can't race an approval. (#383)
After deploying
Checks added on the Checks page before this release stay Draft. #368 has the
SQL to find and fix them by hand.
What's Changed
Full Changelog: v0.11...fbb6693
0.11 - Laburnum
v0.11 (Laburnum)
Skill check sessions get a proper finish, with review, conflict resolution and approval, and several assessors can now record in one session at once. Alongside that come the Notes module, a Rubbish bin for deleted records, per-record history, clearer roles, and in-app help and "What's new".
Highlights
- Session review and approval — a review page with summary tiles, Personnel and Skills coverage cards, and a Conflicts card. A Skills Admin excludes checks, resolves conflicts and approves. Approval locks the session, a Skills Admin can reopen it, and only approved checks count in reports.
- Several assessors per session — assessors are chosen per session, and each recording row shows Also checked by for other assessors' checks, polled live while the page is open.
- Quicker recording — one-tap Fail and Pass on every row, a More dialog for the other results, a note and the skill description, and a Recording Options sheet for the recording mode, skill order and the session's personnel, skills and assessors.
- Notes — a shared notebook for each organisation and personal notes for each account, on a new master-detail layout, with edit history.
- Rubbish bin — deleted personnel, teams, memberships, I3 templates and skill packages are recoverable until purged, after a retention period the organisation sets (30 days by default). Accounts can be closed and restored the same way.
- History — people, teams, skill packages, skill check sessions and D4H tokens have a page listing every change, who made it and when.
- Clearer roles — roles combine freely, with new Skills Admin, Skills Reporter and I3 Admin roles. Ownership is granted with Make owner, and Skills Admins can hand out the Skills Assessor role.
- Help and What's new — the help button opens a short card for the current screen linking to the full guide, the end-user guides are rewritten for this release, and a "What's new" note appears once per release.
- Settings — Organisation Settings has its own page with in-place editing. Account, Organisations, D4H and Preferences moved into the user menu, and every date follows the viewer's date format, time format and time zone.
- Developer workflow — a fixed dev-server port per checkout,
/avut-explore,/avut-ship,/avut-docsand/avut-status, and scripted milestone and docs-issue handling.
The name
HMS Laburnum was an Acacia-class sloop that served with the New Zealand Division from 1922 to 1935. Built in Glasgow in 1915, she spent the First World War on anti-submarine work, and went to the aid of the torpedoed liner Hesperian in September 1915. In New Zealand she toured the country's ports and made an annual cruise of the Pacific Islands, carrying the Administrator of Western Samoa to the Tokelau Islands on one of them. She left Auckland in 1935 to become a drill ship for the Straits Settlements naval volunteer reserve at Singapore, and was scuttled there when Singapore fell in 1942.
What's Changed
Other changes
- docs: v0.11 guides and what's new by @alexwestphal in #374
- feat(whats-new): one entry per release, with a version cursor by @alexwestphal in #373
- fix: dependency advisories, unauthenticated tRPC noise, and an open redirect by @alexwestphal in #372
- docs(skills): post-merge cleanup step for /avut-ship by @alexwestphal in #371
- feat(docs): in-app help cards separate from the full guides by @alexwestphal in #370
- feat(workflow): group reviews, sonnet for mechanical tasks, per-milestone docs, and scripted milestone/docs steps by @alexwestphal in #365
- feat(skill-track): Recording Options sheet on the entry pages by @alexwestphal in #364
- fix(dates): render every date in the viewer's preferred format (#352) by @alexwestphal in #360
- feat(ui): detail cards on DataItem, with short values inline on mobile by @alexwestphal in #359
- feat(admin): organisation settings page with in-place editing by @alexwestphal in #358
- feat(breadcrumbs): show only the nearest linked ancestor on mobile by @alexwestphal in #357
- feat(user): move user settings into the user menu and retire the profile module by @alexwestphal in #356
- fix: clear SSR warnings and tidy the skill check session menu by @alexwestphal in #355
- feat(skill-track): live cross-assessor progress on session entry pages by @alexwestphal in #349
- feat(whats-new): in-app What's new popup for product updates by @alexwestphal in #350
- feat(notes): org and personal notes on a master-detail layout by @alexwestphal in #348
- feat(skill-track): skill check session lifecycle and saved review decisions by @alexwestphal in #346
- fix(d4h): cache D4H data by credential reference and stop exposing it to the client by @alexwestphal in #344
- feat(roles): module-grouped role picker, and let Skills Admin grant Skills Assessor by @alexwestphal in #343
- feat(history): per-object History pages by @alexwestphal in #341
- feat(skill-track): record checks through Fail/Pass rows and a per-check dialog by @alexwestphal in #340
- feat(skill-track): session config dialogs + Actions sheet on the entry pages by @alexwestphal in #338
- feat(dialogs): dialog size prop, wider default, and aligned responsive fields by @alexwestphal in #334
- fix: address last week's review findings, ownerless orgs, and Dependabot alerts by @alexwestphal in #330
- refactor(permissions): reorganise organization roles by @alexwestphal in #326
- feat(provider-credential): move D4H tokens onto ProviderCredential and fix credential security gaps by @alexwestphal in #327
- Reorganize component directories by scope root; split routers by @alexwestphal in #321
- feat(users): recoverable account deletion, self-service closure, system Rubbish bin (#296, #150) by @alexwestphal in #315
- refactor: reduce authClient use — route admin/self-service actions through tRPC by @alexwestphal in #314
- feat(trash): purge, retention and Delete forever for the Rubbish bin (#298) by @alexwestphal in #313
- fix(trash): close Rubbish-bin leaks and stragglers; don't adopt deleted people on D4H import (#308, #183) by @alexwestphal in #312
- Split "Restore" audit-log action into "Restore" (archive) and "Recover" (trash) by @alexwestphal in #311
- Add single-id detail route for TeamMembership by @alexwestphal in #310
- feat(teams): recoverable deletion for TeamMembership (#293) by @alexwestphal in #304
- feat(invitations): confirm before declining an invitation by @alexwestphal in #302
- feat(skill-packages): recoverable deletion for Package/Group/Skill (#294) by @alexwestphal in #305
- feat(i3): recoverable deletion for I3Template (#295) by @alexwestphal in #306
- fix(skill-track): listSessions should require skillCheckSession:view by @alexwestphal in #300
- Standardize entity-name links with EntityLink hover cards by @alexwestphal in #301
- fix(user-dashboard): mobile wrap and card spacing on the user dashboard by @alexwestphal in #303
- feat: recoverable delete/restore-from-trash for Person and Team (#258) by @alexwestphal in #290
- Extract personnel router helpers into a domain-services layer by @alexwestphal in #271
- Per-user settings, session via tRPC, and related refactors by @alexwestphal in #269
- Entity action consistency: shared menu shell, person/user linking, team memberships, team archive by @alexwestphal in #270
Full Changelog: v0.10...2f1186b
0.10 - Philomel
v0.10 (Philomel)
A large release: three real scope roots for navigation, a reworked invitation flow, full-screen mobile dialogs, real data on the org dashboard, and a wide pass of tooling and import-boundary hardening.
Highlights
- Three real scope roots (org/user/system) — navigation is now built around organization, personal (
/user), and system scopes, each with its own sidebar and module list, switchable via a newScopeSwitcher, replacing the old per-scope route sprawl. - Reworked invitation flow — an invitation landing page with in-place accept/decline, verified-account creation straight from the landing page, and explicit accept/reject controls on the personal dashboard.
- Full-screen mobile dialogs — dialogs go full screen below
sm, composed from a shared Header/Body/Footer, withDialogBoundarystandardizing loading and error states across the app. - Org dashboard stat cards — the org dashboard now shows real, permission-gated stats, each with its own component and Suspense boundary instead of one blocking fetch.
- Personal dashboard and settings pages — profile settings, organizations, and D4H settings moved out of modals into dedicated
/user/settingspages, with a redesigned personal dashboard. - Auth page polish — show/hide password toggles, a consolidated forgot/reset-password flow, and social sign-in buttons on the invitation landing page.
- Import boundary + convention enforcement — new ESLint rules lock down Prisma client access,
server-onlymarkers, ID creation through schema files, and Zod import style, backed by ordered imports across the codebase. - Worktree and check tooling —
npm run worktree:setupclonesnode_modulesand regenerates the Prisma client for a new worktree, andnpm run checkruns typecheck/lint/related tests in one call. - Single-PR release flow — releases now ship through one PR into
production, with release notes generated from the actual feature PRs rather than the release PR itself. - Numerous smaller fixes and performance work: org/user/system pages no longer block on
requireOrganization, permissions are checked in memory instead of a second DB round trip, and per-moduleloading.tsxboundaries cover slow navigations.
What's Changed
Other changes
- Replace org dashboard module list with stat-card grid by @alexwestphal in #255
- chore(release): collapse to a single release PR, fix release notes by @alexwestphal in #252
- fix: keep the NavBar visible across loading, error, and the org index page by @alexwestphal in #251
- chore: enforce architecture rules in ESLint, typed env modules, check and worktree scripts by @alexwestphal in #249
- fix(mobile): keep mutation dialogs usable above the on-screen keyboard by @alexwestphal in #219
- Invitation flow: accept/reject, landing page, verified sign-up by @alexwestphal in #231
- Fix invitation email links pointing at the per-deployment Vercel URL by @alexwestphal in #238
- v0.10 cleanup: assorted fixes and follow-ups by @alexwestphal in #227
- Refine password fields and forgot-password flow by @alexwestphal in #218
- feat(user): dashboard cards, real settings pages, drop entry-control redirect by @alexwestphal in #221
- feat(nav): three real scope roots — org/user/system, scope switcher, personal dashboard by @alexwestphal in #220
- perf: reduce org-scoped navigation latency (issue #212 follow-up) by @alexwestphal in #213
Full Changelog: v0.9.2...6d96bf0
0.9.2 - Philomel
v0.9.2 (Philomel)
Small patch: one crash fix and a build-display change.
Highlights
createOrganizationno longer times out on the default-settings inserts
— the mutation spread oneorganizationConfig.create()per default
settings leaf (~20+ rows) into the same batched$transactionas the
organization/owner/log-event creates, bounded by Prisma's default 5000ms
batch timeout. A production call hitP2028outright. The config rows are
now written with a singlecreateMany, cutting the batch to a handful of
statements regardless of how many settings leaves exist. (#168)- Non-production environments show branch + commit instead of a build
counter — the old counter required a workflow that commits straight to
integration, which branch protection now blocks. Dev/preview builds now
display the branch name and short commit SHA instead (sourced from
Vercel/GitHub env vars, with a git fallback for local dev).
What's Changed
Other changes
- chore(release): v0.9.2 (Philomel) by @claude-avut in #169
- Release v0.9.2 (Philomel) by @claude-avut in #170
Full Changelog: v0.9.1...v0.9.2
0.9.1 - Philomel
v0.9.1 (Philomel)
Patch fixing two production crashes reported after v0.9.
Highlights
- Skill package import no longer times out on a shared transaction — the
whole import (package, groups, skills) was committed as one batched
transaction bounded by Prisma's default 5000ms timeout, and unchanged rows
were rewritten unconditionally. A production import hitP2028
("transaction expired") outright. Each changed row now commits as its own
transaction, correlated by a log batch, and unchanged rows are skipped
entirely. (#165) - D4H team sync recovers instead of crashing on a concurrent apply —
starting a second sync for the same team while an earlier one was still
running server-side (e.g. clicking out of the sync dialog and reopening it)
could make both requests race to create the sameTeamMembershiprow,
crashing the loser with a raw unique-constraint error. The loser now adopts
the row the other request created instead of failing. (#164)
What's Changed
Other changes
- chore(release): v0.9.1 (Philomel) by @claude-avut in #166
- Release v0.9.1 (Philomel) by @claude-avut in #167
Full Changelog: v0.9...v0.9.1
0.9 - Philomel
v0.9 (Philomel)
A large release: person↔user account linking, deeper D4H team integration, a
reworked team membership experience, the first cut of end-user documentation,
and a wide pass of smaller fixes and refactors.
Highlights
- Person↔user account linking — a person record and a user account can now
be linked automatically (on invitation accept, or when emails match) or
manually from the person record's own invite flow, withPerson.email
normalized to lowercase to make matching reliable. - D4H linking & preview-then-apply team sync (Phase 1) — teams can be
linked to a D4H team via sidecar link tables, with a preview-then-apply sync
flow, an admin D4H integration card, and D4H-aware team menu actions
(link/unlink/sync, org metadata sync). - Team membership rework — the team roster now lives on Kaga, with a
dedicated team-membership detail page (D4H status/source badges, inline
Person/Team links, membership timestamps) replacing inline roster actions. - Skill package import/export — packages can be exported to
.jsonand
imported across instances, replacing the old bundled-library-only flow. - End-user documentation site — a new
/docssection with a glossary,
per-page "Key Terms" callouts, screenshots, and an in-app?helpsheet
available from admin and skill-track pages. - Public site refresh — shared header/footer across
/,/docs,
/auth, and/policies; rewritten privacy policy and terms of service; a
new/toolspage listing tools by module. - Kaga table improvements — reworked table header/toolbar, per-column
sort/filter menus, and a "Show query" debug option. - Outbound email safety —
sendEmailnow redirects every send outside
production to Resend's sink, so the dev database's real email addresses can
never be mailed by accident. - en-NZ spelling — a lint guardrail plus a sweep of user-facing copy to
New Zealand English spelling. - Numerous smaller fixes: mobile breadcrumb dropdown, persisted sidebar
collapse state, Suspense-boundary/Cache-Components cleanup across the
authenticated layout, and dependency upgrades closing several dependabot
alerts.
What's Changed
Features
- Skill package .json export / cross-instance import (#115) by @alexwestphal in #117
Other changes
- docs(release): release skill + populate Release notes from docs/releases/ by @alexwestphal in #127
- feat(user-settings): set-password flow for social-login users by @alexwestphal in #112
- feat(docs): end-user documentation site + screenshot pipeline by @alexwestphal in #119
- feat(d4h): D4H linking & preview-then-apply team sync (Phase 1) by @alexwestphal in #118
- feat(teams): team membership display — Kaga roster, person card, membership page by @alexwestphal in #121
- Add end-user docs glossary by @alexwestphal in #132
- feat(skill-package-builder): real file-upload import, replacing the bundled library by @alexwestphal in #133
- PersonPicker improvements + Kaga table rework by @alexwestphal in #134
- Suspense boundary review: Cache Components, sidebar-slot prototype, org data-fetch cleanup by @alexwestphal in #139
- Shared public header/footer across /, /docs, /auth, /policies by @alexwestphal in #140
- Add a /tools page with a section per module by @alexwestphal in #141
- fix: collapse breadcrumbs into a dropdown below md by @alexwestphal in #143
- docs(skill-track): rebuild the demo seed and re-capture the session documentation by @alexwestphal in #145
- Rewrite the privacy policy and terms of service against NZ law by @alexwestphal in #152
- feat: person ↔ user linking — invite from a person, plus two email-match automations by @alexwestphal in #153
- feat: store Person.email lowercased by @alexwestphal in #154
- fix: await email sends in better-auth hooks by @alexwestphal in #155
- docs: en-NZ spelling sweep + lint guardrail by @alexwestphal in #156
- chore(release): v0.9 (Philomel) by @claude-avut in #162
- Release v0.9 (Philomel) by @claude-avut in #163
New Contributors
- @claude-avut made their first contribution in #162
Full Changelog: v0.8.1...v0.9
0.8.1 - Philomel
v0.8.1 Release 0.8.1 (Philomel)