Header action top-align + tighter divider spacing across shared surfaces
Updated shared header layout so action rails anchor to the top-right and tightened divider spacing; also widened description rail to avoid awkward writing-summary wraps.
Why it matters: Header buttons now consistently sit at the top, divider feels closer to content, and writing summary wraps less aggressively.
Changed
Updated `SurfaceHeader` desktop alignment from bottom-anchored to top-anchored actions (`align-items:flex-start` on row/actions).
Tightened shared header bottom spacing (`surface-header` and row padding/gap tokens) to bring divider line closer to content.
Expanded default description width ceiling and main max width to reduce premature wrapping in writing header summary.
Updated writing and experience header action wrappers to top alignment (`md:items-start`).
Updated profile compact header override to top-align with shared behavior while keeping description rail suppressed.
Improved
Resolved repeated user-reported header action vertical misalignment and awkward writing line breaks.
v2.4.48 2026-05-01Newcideployperformance
Deploy speed pass: streamlined push-path workflow
Reduced deploy critical-path time by removing redundant lint gates from deploy-dev-pages and limiting optional analytics/smoke steps to manual deploys.
Why it matters: Push-triggered Pages deploys now run on a faster build-and-publish path while quality checks remain enforced in dedicated a11y/linkcheck/lighthouse workflows.
Adjusted profile header compact overrides so the resume/clearance rail stays single-line and vertically aligned with the header title region instead of dropping to the lower border.
Why it matters: Profile top shell now presents the right rail in a cleaner, intentional position while preserving no-wrap behavior.
Changed
Added profile-specific `SurfaceHeader` token overrides and md+ vertical-centering rules for the header/action row via `profile-header-compact` class.
Improved
Eliminated low-slung action rail presentation shown in screenshot while keeping one-line rail requirement.
Header description wrap tuning to avoid awkward mid-phrase breaks
Increased shared header description line-width ceiling so short operational summaries do not wrap prematurely into awkward two-line splits.
Why it matters: Status and other surface headers keep description copy on one line more often at desktop widths while preserving responsive wrap behavior.
Changed
Updated `SurfaceHeader` description max width from fixed `66ch` to tokenized `--surface-header-description-max-width` with wider default `84ch`.
Improved
Reduced awkward phrase-splitting wraps such as the reported `/status/` operations description break.
Fixed
Addressed user-reported line break between “for” and “events” in status header description.
Header spacing uniformity pass across Writing/Profile/Capabilities surfaces
Standardized shared header description rail spacing and aligned first-section top offsets to remove page-to-page header rhythm drift.
Why it matters: Writing, Profile, Capabilities, and other `SurfaceHeader` pages now present more uniform top-shell spacing and action-rail alignment.
Changed
Updated `SurfaceHeader` to always reserve description-rail space (with a hidden placeholder when description is absent) so title/action rows keep consistent vertical rhythm.
Added shared description min-height tokens in `SurfaceHeader` for desktop/mobile spacing uniformity.
Aligned `/capabilities/` first content section offset to `md:mt-5` to match Writing/Profile top-gap behavior.
Improved
Reduced visible spacing drift across the pages highlighted by user screenshots.
Fixed
Resolved inconsistent top-header spacing and forced-variance feel between Writing, Profile, and Capabilities pages.
v2.4.41 2026-04-30Newuxconsistencytypography
UX cleanup: remove forced line-break balancing from surface headers
Removed CSS-driven forced title balancing in shared surface headers to prevent awkward line breaks like the reported /status/ “Operations Status” split.
Why it matters: Status and all other pages using `SurfaceHeader` now render header titles with natural wrapping instead of forced balancing behavior.
Changed
Removed `text-wrap: balance` from `src/components/SurfaceHeader.astro` title styling so line breaks are no longer forced by balancing logic.
Improved
Eliminated the forced-break pattern across all shared surface headers, including `/status/`.
Added a deterministic environment/config lint gate, wired it into core CI workflows, and removed more hardcoded domain assumptions in analytics/OG generation scripts.
Why it matters: Build/deploy safety improves with earlier config failures, while analytics and OG tooling now adapts more cleanly to domain/environment changes.
Added
Added `scripts/lint-config-env.mjs` to validate `.env.example` key presence and URL/email/E.164 formatting contracts.
Added `npm run lint:config` script in `package.json`.
Changed
Integrated config/env lint into CI workflows: a11y, lighthouse, linkcheck, and deploy-dev-pages.
Updated Plausible pageviews/funnel candidate resolution to include host derived from `PUBLIC_SITE_URL` before legacy fallbacks.
Updated OG image generator kicker text to derive from configured `PUBLIC_SITE_URL` host instead of fixed domain literals.
Improved
Reduced configuration drift risk and tightened preferred-practice CI guardrails for environment portability.
Moved robots sitemap origin and contact form submit routing behind environment-backed configuration and reduced hardcoded domain coupling in support scripts.
Why it matters: Deploy portability improved again: environment/domain moves no longer require editing robots or contact submit code paths, and crawler/plausible defaults now respect environment context.
Added
Added env-backed contact form endpoint support (`PUBLIC_CONTACT_FORM_ENDPOINT`) via shared site config.
Added generated `src/pages/robots.txt.ts` that derives sitemap URL from configured site origin.
Changed
Updated contact form page/script wiring to use dataset-provided submit endpoint + subject prefix instead of hardcoded values.
Replaced static `public/robots.txt` with generated route to keep sitemap origin environment-consistent.
Updated Plausible sitemap analytics defaults and radar crawler user-agent contact URLs to honor environment variables.
Improved
Reduced source edits required when moving across domains/environments and tightened 12-factor operational hygiene.
Moved key site identity and contact wiring to environment-driven config, removed hardcoded public URLs/emails from page surfaces, and documented runtime/build config contract.
Why it matters: UI and metadata are now easier to deploy across domains/environments without source edits, improving portability and preferred-practice configuration hygiene.
Added
Added `src/config/site.ts` with centralized `PUBLIC_SITE_URL`, `PUBLIC_CONTACT_EMAIL`, and `PUBLIC_CONTACT_PHONE_E164` handling plus helper builders (`absoluteUrl`, `contactMailto`).
Added `.env.example` documenting public runtime and build-time analytics variables.
Changed
Replaced hardcoded canonical origins in core pages (`/contact/`, `/sitemap/`, `/changes/`, `/license/`, `/events/`, `/events/sources/`, `/capabilities/`) with env-driven `absoluteUrl(...)` calls.
Replaced hardcoded contact links in homepage/contact/writing-detail surfaces with `contactMailto(...)` and env-backed E.164 tel wiring.
Updated profile JSON-LD page URL and status analytics sitemap fallback URL to derive from shared site config.
Improved
Improved deployment portability and reduced source-level edits required for environment/domain changes.
Locked shared header baseline metrics to reduce micro-jitter across page switches and migrated remaining background index pages to the shared page-header wrapper.
Why it matters: Header position and action-rail alignment are more stable across desktop transitions; experience/education indexes now use the same shared top-shell framing as other surfaces.
Changed
Updated `SurfaceHeader` with shared row/action min-height baseline tokens to reduce subtle cross-page header shift on larger breakpoints.
Migrated `/experience/` index and `/education/` index to `SurfacePageHeader` for consistent sticky-nav + header composition.
Improved
Reduced visual jitter when switching between pages with different header action payloads.
Fixed
Updated NavalX speaking event URL to `https://blackpearl.navy.mil/` to avoid intermittent DNS failures on `www.navalx.navy.mil` in strict link checks.
v2.4.35 2026-04-30Newuxconsistencyheadersrefactor
Header-frame stabilization across core navigation surfaces
Unified top-of-page scaffolding on core pages to reduce subtle cross-page header drift when switching between main surfaces.
Why it matters: Writing, Profile, Events, Opportunities, capability-topic pages, and writing-tag detail pages now share one header wrapper pattern with consistent sticky-nav + header alignment behavior.
Changed
Migrated `/profile/` header framing to `SurfacePageHeader`.
Migrated `/writing/` header framing to `SurfacePageHeader`.
Migrated `/writing/tags/[tag]/` header framing to `SurfacePageHeader`.
Migrated `/capabilities/[slug]/` header framing to `SurfacePageHeader`.
Migrated `/opportunities/` header framing to `SurfacePageHeader`.
Migrated `/events/` header framing to `SurfacePageHeader` and removed extra top-margin wrapper offset (`mt-2`) causing subtle page-to-page shift.
Improved
Reduced top-shell alignment variance across core nav destinations when toggling between pages.
Fixed
Addressed reported subtle header position shifting across primary surfaces.
Pretty-code foundation + broader shared header adoption
Added first-class Prettier tooling and migrated additional surfaces to the shared page-header wrapper for cleaner, more reusable page framing.
Why it matters: Code style is now enforceable with one formatter command, and more pages use shared top-of-page composition instead of duplicating sticky/header boilerplate.
Shared modal controller extracted for profile and speaking surfaces
Replaced duplicated modal behavior code with a shared controller utility used by both profile and speaking, improving reuse and consistency.
Why it matters: Modal focus trapping, escape handling, scroll locking, close timing, and restore-focus behavior now follow one shared implementation path.
Added
Added `src/scripts/ui/modal-controller.ts` shared utility for modal open/close lifecycle, focus trap, and body scroll lock behavior.
Changed
Refactored `/profile/` modal script to use shared modal controller instead of inline duplicated modal state logic.
Refactored speaking modal script in `SpeakingEventsSection` to use the same shared modal controller path.
Improved
Reduced duplicated modal behavior code and lowered drift risk between profile and speaking interactions.
v2.4.31 2026-04-30Newuxconsistencyheaderslayout
Surface-header consistency pass across core pages
Normalized page-header structure so secondary surfaces match the same visual rhythm as Writing/Profile, and migrated Writing/Profile to shared header framing for cross-site consistency.
Why it matters: Top-of-page formatting is now more uniform across primary and secondary surfaces, reducing header drift while preserving page-specific actions.
Changed
Migrated `/writing/` and `/profile/` top sections to the shared `SurfaceHeader` component with existing actions preserved.
Aligned `SurfaceHeader` typography, spacing, border treatment, and action styling to match the established Writing/Profile framing pattern.
Improved
Reduced cross-page visual variance in eyebrow/title/description/action alignment.
Fixed
Addressed inconsistent header/page framing across non-Writing/Profile surfaces.
v2.4.30 2026-04-30Newspeakinguxinteraction
Speaking title affordance pass (link clarity)
Made speaking engagement titles look unmistakably clickable by switching to accent link styling with underline and external-link cue.
Why it matters: Users can now immediately recognize speaking titles as interactive controls that open detailed modal context.
Changed
Updated speaking title button style to use link-color treatment, underline, and a small `↗` cue on card titles.
Improved
Increased visual affordance for modal-open interactions on speaking cards.
Updated the NavalX event naming and added a 2020 OPNAV N7 MyNavy HR cybersecurity off-site opening presentation entry focused on C2C24.
Why it matters: Speaking history now reflects corrected NavalX event naming and includes the newly added OPNAV N7 leadership talk context with RDML Danelle Barrett reference.
Added
Added speaking event `opnav-n7-mynavyhr-cybersecurity-offsite-c2c24-2020` with C2C24 opening-presenter context in `src/data/speaking.ts`.
Changed
Renamed NavalX event display title to `NavalX Center for Adaptive Warfighting Scrum for Leaders` per user correction.
Used `2020 (exact date not publicly listed)` for the new OPNAV N7 entry where exact date is unavailable.
Improved
Expanded speaking taxonomy with C2C24/MyNavy HR/OPNAV N7 tags for filter discoverability.
v2.4.28 2026-04-30Newspeakingcontentcorrection
Speaking date correction for NavalX Scrum for Leaders entry
Updated the newly added NavalX speaking engagement date from provisional May 7 to confirmed June 9, 2022.
Why it matters: Speaking timeline now reflects the corrected event date while keeping the same role and context details.
Changed
Updated `eventDateRange` to `Jun 9, 2022` for `navalx-scrum-for-leaders-2022-agile-cyber-software`.
Updated session text to `Thu, Jun 9, 2022 · exact session time not publicly listed`.
Fixed
Corrected prior fallback date based on user-provided confirmation.
Speaking entry added for NavalX Scrum for Leaders (2022)
Added a new speaking engagement covering agile leadership in cybersecurity and software development during Black Pearl support to PEO Digital PAS Software Practice & Automation.
Why it matters: Speaking timeline now includes the 2022 NavalX guest session with role/context details and topic tags aligned to cyber + software leadership themes.
Added
Added speaking event `navalx-scrum-for-leaders-2022-agile-cyber-software` in `src/data/speaking.ts`.
Changed
Set event date fallback to `May 7, 2022` pending publicly verifiable exact session timestamp.
Included augmented context in event summary (Black Pearl outreach/onboarding/planning leadership + PEO Digital PAS support scope).
Improved
Expanded topic taxonomy coverage with agile-leadership and DevSecOps-adjacent tags for speaking filter discoverability.
v2.4.26 2026-04-30Newprofilespeakingmobileux
Modal close-button anchoring fix for mobile
Stabilized modal close-button placement so the `✕` remains pinned at top-right regardless of content length or wrap.
Why it matters: Profile and speaking modals no longer shift close-control position as title/meta content changes on smaller screens.
Changed
Updated `.profile-modal-head`/`.profile-modal-close` to use reserved right padding + absolute-positioned close control.
Applied the same anchoring pattern to `.speaking-modal-head`/`.speaking-modal-close` for consistency across modals.
Improved
Close control now has predictable tap target location independent of dynamic text wrapping.
Fixed
Resolved reported mobile issue where modal close button position changed with content.
v2.4.25 2026-04-30Newprofilemobileuxlayout
Profile mobile overflow fix for education/experience cards
Fixed horizontal text overflow in profile mobile cards by hardening width constraints and word wrapping.
Why it matters: Long credential and role text now wraps cleanly on narrow screens without clipping or side-scroll artifacts.
Changed
Updated mobile experience and education card wrappers in `/profile/` with `min-w-0` on button and flex rows.
Applied explicit text wrapping (`break-words` + `overflow-wrap:anywhere`) to role/credential lines to prevent overflow.
Improved
Improved consistency of mobile profile card rendering under long institution and certification names.
Fixed
Resolved reported mobile overflow in Education & Certifications cards.
Refined speaking cards to prioritize scan clarity by moving dense metadata into a click-open modal and making topic tags interactive filters.
Why it matters: Speaking entries now show cleaner summaries by default, with one clear outbound event link and fast in-section tag filtering for topic exploration.
Added
Added interactive topic-tag filtering controls (including Clear) in `SpeakingEventsSection`.
Added speaking-detail modal opened by clicking engagement titles, with keyboard focus trap + close affordances.
Changed
Moved extraneous speaking metadata (When/Stage/Track/Role/Speaker profile/Sponsorship) from inline cards into the modal.
Kept a single external URL per engagement (`Event Name ↗`) and removed the trailing source URL row.
Improved
Unified tag interaction model across top-level topic chips and per-card tag chips for faster browsing.
v2.4.23 2026-04-30Newseowritinguxsyncci
SEO hardening phase 2 + writing UX/polish + sync guardrails
Shipped a broad second-phase SEO and UX batch: stronger writing schema/metadata, CI SEO linting, profile modal hardening, edge-header normalization, and whitepaper sync safety checks.
Why it matters: Search metadata and schema coverage are more resilient, writing pages gained better share/citation affordances and read-time context, profile modals now behave more accessibly, and sync pipelines now guard against silent published-note loss.
Added
Added `scripts/lint-seo-guards.mjs` and wired it into `a11y`, `deploy-dev-pages`, `linkcheck`, and `lighthouse` workflows.
Added Whitepaper sync protection in `.github/workflows/sync-whitepaper.yml` to detect missing previously published notes and fail unless explicitly allowed (`SYNC_ALLOW_REMOVED_NOTES=true`).
Added sync diagnostics artifact upload (`sync-whitepaper-diagnostics`) for removal debugging.
Changed
Upgraded writing detail schema to consistent `Article` JSON-LD coverage across notes, memos, and papers (papers include `additionalType: Report`).
Enhanced writing detail UX with citation-copy action (`📚 Cite`), canonical link strip, related-label clarity, and estimated read-time display.
Tightened writing/capabilities SEO metadata copy for stronger intent-aligned snippets.
Extended sticky TOC visibility from `2xl` to `xl` and tuned TOC/right-rail spacing for earlier availability on large screens.
Normalized edge surface headers and semantics on `/404/`, `/license/`, and `/content-license/` to reduce style drift and improve index hygiene.
Hardened profile detail modals with focus trapping, return-focus behavior, iOS-safe body scroll locking, transition polish, and swipe-down close gesture support.
Improved
`SurfaceHeader` now supports tokenized CSS variables for consistent eyebrow/title/description/action spacing control.
v2.4.22 2026-04-30Newwritingheaderuxconsistency
Writing header aligned to Profile formatting
Adjusted `/writing/` top header to match the visual hierarchy and spacing rhythm used on `/profile/`.
Why it matters: Writing now uses the same cleaner border-bottom header structure as Profile, removing the subtle formatting mismatch between the two key surfaces.
Changed
Replaced `/writing/` `SurfaceHeader` usage with the same `pb/pt + border-b + title stack` pattern used on `/profile/`.
Kept Writing actions (`Browse tags`) while aligning typography, label casing, spacing, and right-rail alignment to Profile style.
Improved
Reduced cross-surface visual drift between the two most frequently compared navigation surfaces.
Moved profile experience and education detail expansion into click-to-open modals and restored the CVEAgentNet note path that had fallen out after Whitepaper sync.
Why it matters: Profile scanning is now cleaner with on-demand detail views, and the CVEAgentNet note URL is restored and durable through upstream Whitepaper source sync.
Added
Added profile detail modal system on `/profile/` with keyboard-close support (`Esc`) and reusable trigger wiring for table and mobile card views.
Changed
Replaced in-page experience and education expansion blocks with modal-driven detail presentation when company/role or credential rows are clicked.
Restored `src/content/writing/notes/2026-04-29-cveagentnet-next-control-plane-vulnerability-management.md` after upstream sync removed it from site content.
Improved
Kept CVEAgentNet note durable by adding the same note into the Whitepaper source repository so scheduled sync no longer deletes it.
Fixed
Fixed `/writing/2026-04-29-cveagentnet-next-control-plane-vulnerability-management/` returning 404 after sync.
Unified surface header system across writing, capability, ops, and utility pages
Replaced boxed control-shell title blocks with the cleaner Profile-style header treatment across major site surfaces.
Why it matters: Top-level surfaces now share a consistent, less-boxed visual rhythm with eyebrow/title/description hierarchy and right-rail actions, improving scan flow and cross-page cohesion.
Added
Added reusable `src/components/SurfaceHeader.astro` component with support for eyebrow labels, action slots, and supplemental metadata rows.
Changed
Adopted the new surface header style on `/writing/`, `/writing/tags/`, `/writing/tags/[tag]/`, `/capabilities/`, `/capabilities/[slug]/`, `/opportunities/`, `/status/`, `/status/site-analytics/`, `/contact/`, `/speaking/`, `/experience/`, `/education/`, `/blog/`, `/events/sources/`, `/sitemap/`, and `/changes/`.
Updated `/events/` to use a Profile-style top header while retaining radar controls and filters in the existing control shell below.
Improved
Normalized top-of-page hierarchy and spacing so surface headers feel consistent regardless of route function (content, operations, or utility).
Improved readability for note-style writing entries by increasing paragraph spacing in the main content block.
Why it matters: Long and medium-length notes now scan more comfortably with clearer visual separation between ideas, including the new CVEAgentNet note.
Changed
Adjusted note-page paragraph spacing via `article[data-writing-type="note"] .paper-content p` in `src/styles/global.css`.
v2.4.18 2026-04-29Newseometadataindexingschema
SEO hardening pass: snippet quality + index hygiene
Strengthened branded-search quality by improving top-surface metadata and noindexing utility/duplicate surfaces that were diluting SERP results.
Why it matters: Home/profile/capabilities/writing descriptions are more specific, profile now includes ProfilePage schema, and low-priority operational pages are explicitly marked `noindex,follow` to concentrate index authority on core surfaces.
Added
Added `noindex` support in `BaseHead`/`SiteLayout` (`robots` + `googlebot` tags).
Applied `noindex={true}` to utility and duplicate surfaces: `/opportunities/`, `/events/`, `/events/sources/`, `/status/*`, `/changes/`, `/sitemap/`, `/blog/`, `/credentials/`, `/experience/*`, `/education/*`.
v2.4.17 2026-04-29Newprofileuxnavigation
Profile row-level links restored as in-page anchors
Restored row-level link behavior for experience and education while keeping all navigation inside `/profile/`.
Why it matters: Clicking rows/cards now jumps to detailed in-page anchor blocks (`#exp-*`, `#edu-*`) on `/profile/` instead of navigating to separate pages.
Added
Added in-page detail anchor sections for each experience and education record within `/profile/`.
Changed
Restored row-level links in desktop tables and mobile cards to target profile-local anchors.
v2.4.16 2026-04-29Newprofilenavigationspeakingux
Profile-first consolidation + tools dropdown + second speaking engagement
Removed profile-page detours, promoted a cleaner profile header, demoted Events/Opportunities under Tools navigation, and added another speaking panel entry.
Why it matters: `/profile/` is now the primary background surface without "full page" escape links. Nav now prioritizes `Writing`, `Profile`, and `Capabilities`, with `Events` and `Opportunities` grouped under `Tools`. Speaking entries now include both Modern Day Marine 2026 and DON Red Hat PAX River 2024 panel participation.
Added
Added speaking engagement: DON Red Hat PAX River Tech Day (Partner Lunch Panel featuring AWS, KBR, Confluent, Colossal), with topic tags and KBR panel contribution summary.
Changed
Replaced header hub labels with a `Tools` dropdown that groups `Events` and `Opportunities` on desktop and mobile.
Reworked `/profile/` top header section into a cleaner, non-boxed layout with stronger hierarchy.
Removed `Full experience page` and `Full education page` links and in-section deep-link wrappers so background content is fully consumed within `/profile/`.
v2.4.15 2026-04-29Newcideployperformancemedia
CI/deploy loop acceleration baseline + external media toggle
Reduced wasted CI runtime by canceling superseded runs and prepared deploy pipeline to drop heavy audio payloads when external media hosting is configured.
Why it matters: a11y/linkcheck/lighthouse now auto-cancel older runs on the same ref. Deploy workflow no longer runs paper/memo lint gates and can omit `dist/audio` from Pages artifacts when `PUBLIC_MEDIA_BASE_URL` is set, enabling a much faster deploy loop once media is externalized.
Added
Added `src/utils/mediaUrl.ts` to resolve audio URLs via optional `PUBLIC_MEDIA_BASE_URL`.
Added deploy step to trim `dist/audio` from artifact when external media base URL is configured.
Changed
Updated `WritingAudioPlayer` to use media URL resolver (supports external media hosting without content-schema changes).
Added `concurrency` + `cancel-in-progress` for `a11y`, `linkcheck`, and `lighthouse` workflows.
Removed `lint:papers` and `lint:memos` steps from `deploy-dev-pages` to keep deploy focused on build + smoke + publish.
Speaking restructured by event with topic tags and sponsorship metadata
Replaced placeholder speaking layout with an event-indexed format and seeded the first engagement entry from Modern Day Marine 2026.
Why it matters: `/speaking/` is now a real destination (no redirect language) with event cards, topic tags, and reusable sponsorship modeling (`employer` / `external` / `self`). Profile now reuses the same speaking event block so content stays synchronized.
Added
Added `src/data/speaking.ts` with normalized speaking-event schema, topic-tag derivation, and sponsor labeling helpers.
Added reusable `src/components/SpeakingEventsSection.astro` for event-card rendering and tag display.
Added first speaking entry: Modern Day Marine 2026 (MBSE talk, Acquisition Stage, Apr 28, 2026).
Changed
Converted `/speaking/` into an event-based speaking page with topic tags and metadata, removing redirect-only behavior.
Updated `/profile/` speaking section to use the shared event-based component and removed legacy/upcoming-past placeholder framing.
v2.4.13 2026-04-29Newnavigationuxheadermobile
Nav label cleanup: remove hub captions from header and mobile rail
Dropped the explicit `Profile` and `Capability` hub labels in favor of a cleaner direct-link navigation model.
Why it matters: Top navigation now reads as direct links in priority order: `Writing`, `Profile` | `Capabilities`, `Events`, `Opportunities` across desktop and mobile.
Changed
Removed `Profile`/`Capability` text labels from desktop header nav in `src/components/Header.astro`.
Flattened mobile sticky nav into one horizontal rail with a visual separator after `Profile` in `src/components/StickyBrowseBar.astro`.
Header simplification: Speaking folded into unified Profile surface
Finalized top-nav strategy by removing a standalone speaking slot and consolidating speaking, experience, and education under one Profile destination.
Why it matters: Header now follows a tighter two-hub model (`Profile`: Writing + Profile, `Capability`: Capabilities + Events + Opportunities). The Profile page now includes a full Speaking section, while `/speaking/` remains as a compatibility pointer to `Profile → Speaking`.
Navigation architecture split into Profile + Capability hubs
Reorganized navigation into two clear discovery hubs so speaking and other profile surfaces are no longer forced into experience/education buckets.
Why it matters: Desktop and mobile navigation now present two top-level groups: `Profile` (Writing, Speaking, Profile) and `Capability` (Capabilities, Events, Opportunities). Experience and education are collapsed into a single new `/profile/` page, while speaking has its own dedicated `/speaking/` route.
Added
Added new page route `src/pages/speaking/index.astro` as a dedicated home for speaking engagements.
Added new consolidated route `src/pages/profile/index.astro` that combines experience and education into one page.
Added `speaking` and `profile` active-state support to `StickyBrowseBar` props and links.
Changed
Updated desktop header navigation in `Header.astro` to grouped hubs: `Profile` and `Capability`.
Updated mobile sticky navigation in `StickyBrowseBar.astro` to the same two-hub structure with grouped horizontal rails.
Continued report closure with stronger mobile nav semantics and a more keyboard-friendly, responsive opportunities table container.
Why it matters: Mobile sticky browse now exposes explicit navigation semantics (`nav` landmark + `aria-current`), and opportunity-table interaction is cleaner on tablets/phones with focused horizontal scroll regions, reduced medium-screen column density, and explicit table guidance for assistive tech.
Added
Added a dedicated `nav` landmark + `aria-current="page"` support in `src/components/StickyBrowseBar.astro`.
Added table region semantics on opportunities (`role="region"`, `aria-label`, keyboard focus via `tabindex="0"`, and an accessibility caption).
Changed
Added explicit reset control label (`aria-label="Reset all opportunity filters"`) for filter controls.
Improved opportunities table responsive behavior at medium/mobile breakpoints with narrower min-widths and hidden lower-priority columns at <=1023px and <=767px.
Hardened horizontal scroll behavior on opportunities table wrapper for touch/trackpad interactions.
Responsive edge-case pass on mobile nav + opportunity table ergonomics
Continued report closure with responsive behavior hardening on mobile navigation overflow and dense opportunity-table handling.
Why it matters: Mobile browse tabs now avoid negative-margin overflow behavior, and the opportunities table now behaves more predictably on small screens with reduced default column density and improved horizontal-scroll containment.
Added
Added touch/contain scroll behavior on opportunities table wrapper (`overscroll-behavior-x: contain`, momentum scrolling) for cleaner small-screen horizontal navigation.
Changed
Removed negative-margin mobile browse-bar wrapper offsets in `StickyBrowseBar.astro` to reduce edge overflow artifacts.
Reduced mobile opportunities table minimum widths and hid low-priority columns on narrow screens (`Sol #`, `Agency`, `Events`, `Signals`) for better scanability.
Extended the report pass with more consistent empty-state recovery actions, map-view labeling alignment, and expanded automated axe coverage to additional showcase routes.
Why it matters: Events now provides clear reset affordances in both list and calendar empty states, map language is consistent (`Map View`), live result counters are announced for assistive tech, and a11y CI now scans capabilities/opportunities surfaces too.
Applied a broad implementation pass against the styling/consistency report, including nav semantics, writing filter/card behavior, events empty-state clarity, and grouped opportunity metrics.
Why it matters: Primary flows are more consistent and actionable: header now exposes `aria-current`, writing supports explicit All mode + limited visible tags, events/opportunities zero states are clearer, and opportunity KPIs are grouped into Coverage/Enrichment/Decision/System Health.
Added
Added `aria-current="page"` behavior to primary nav links in `HeaderLink.astro`.
Added explicit `All` control for writing type filters and persisted all-on state handling (`src/scripts/writing-index.js`).
Cross-page formatting pass on headings and spacing rhythm
Applied a consistency pass across secondary pages to normalize header treatment, top spacing, and section rhythm.
Why it matters: Experience, education, writing-tag, and blog surfaces now use the same carded header pattern and tighter, consistent vertical spacing.
Added
Added control-shell header cards to `experience/index`, `education/index`, `writing/tags/index`, `writing/tags/[tag]`, and `blog/index` for consistent page framing.
Changed
Normalized top spacing from legacy `mt-6/mt-8` patterns to a consistent `mt-4` (`md:mt-5`) rhythm after page headers on updated pages.
Unified heading style on updated pages to use `section-title` within header cards for visual consistency.
v2.4.04 2026-04-24Newhomeuxspacinglayout
Homepage section spacing normalized
Aligned vertical spacing between homepage card groups so transitions feel consistent after recent section removals.
Why it matters: The gap between `Featured Reading` and the `Operating Principles/Engagement` row now matches the hero-to-featured spacing.
Changed
Changed homepage container spacing from `mt-10` to `mt-6` before the `Operating Principles` + `Engagement` row in `src/pages/index.astro`.
v2.4.03 2026-04-23Newhomeuxcleanupcopy
Removed homepage “Core Surfaces” explanatory card
Dropped the homepage `Core Surfaces` card to reduce fourth-wall/meta framing and keep the landing experience immersive.
Why it matters: Homepage remains focused and direct: hero + featured reading + operating principles + engagement, without explicit explanatory taxonomy cards.
Changed
Removed `Core Surfaces` section from homepage (`src/pages/index.astro`).
Improved
Reduced immersion-breaking, explicit audience/taxonomy framing on home.
v2.4.02 2026-04-23Newfooternavigationuxcleanup
Footer simplified; primary nav duplication removed
Cleaned footer to utility-only links and removed top-nav duplicates so homepage hierarchy remains clear.
Why it matters: Footer now acts as a compact utility rail (`Sitemap`, `Changes`, `Status`, `Contact`) while primary discovery remains in top navigation and sitemap.
Changed
Removed redundant footer links that duplicated top navigation and secondary background routes.
Removed deploy badge/social/license/rss shortcut clutter from footer in favor of sitemap-based discovery.
Kept footer to four utility links: `Sitemap`, `Changes`, `Status`, `Contact`.
Navigation priority reset + experience/education demoted to background surfaces
Updated primary navigation to prioritize Writing → Capabilities → Events/Opportunities and repositioned experience/education as lower-priority background proof surfaces.
Why it matters: Top-level wayfinding now matches the intended emphasis: writing and capability showcase first, operational tools second, and resume-depth pages available but demoted.
Added
Added homepage `Core Surfaces` section to frame `Writing` and `Capabilities` as showcases, with `Events` and `Opportunities` presented as operational features.
Added subtle `Background` links (Experience, Education, Resume PDF) under Engagement to keep proof surfaces accessible but secondary.
Changed
Updated desktop header priority/order to: `Writing`, `Capabilities`, `Events`, `Opportunities`.
Updated mobile sticky browse links to match the same priority and removed direct Experience/Education tabs from primary mobile nav.
Added Experience/Education links in footer navigation as secondary discovery paths.
v2.4.00 2026-04-23Newhomeuxcleanupcopysummary
Removed homepage audience framing card language
Stripped fourth-wall audience labels and removed the `How to use this site` card from homepage to keep the landing page direct and content-first.
Why it matters: Homepage now avoids explicit audience/meta framing while retaining a concise summary structure through hero, featured reading, operating principles, and engagement.
Homepage shifted to topical summary + audience routing
Removed long-form resume/writing blocks from the homepage and refocused the page on summary intent with explicit routing for customer/employer and reader audiences.
Why it matters: Homepage now acts as a concise mission overview: featured reading is cleaner (no topic counts), deep resume/background content moves to dedicated pages, and visitors get immediate guidance on where to go next.
Added
Added `How to use this site` summary card section on homepage with clear routing for customer/employer, reader/background, and operational-tool paths.
Changed
Removed homepage long-form sections for `Writing`, `Experience`, and `Education` in favor of topical summary navigation.
Removed topic-count (`# topics`) metadata from homepage featured reading cards.
Updated engagement CTA flow to emphasize `Capabilities` as the customer-facing summary surface.
Improved
Clarified homepage positioning as a dual-audience landing page (customers/employers and readers/background).
Moved all writing filter pills onto the same row as paper/note/memo and standardized active/inactive pill contrast; removed the homepage quick-intents strip.
Why it matters: Writing controls now read as one coherent pill system with clearer active state visibility, and homepage hero is cleaner without quick-intent clutter.
Added
Added explicit active color states for density pills (`Compact`, `Comfortable`) and aligned inactive treatment to dull gray.
Changed
Moved `Has audio`, `Recent 30d`, and density pills into the same control row as `paper/note/memo` on `/writing/`.
Removed `Quick intents` strip from homepage hero and tightened associated engagement copy.
Site analytics simplification + true line chart trends
Simplified `/status/site-analytics/` by removing low-signal route dumps and converting the trend sparkline bars into an actual line chart.
Why it matters: Dashboard is cleaner and faster to scan, with trend movement represented as a real temporal line while noisy off-sitemap/zero-view tables are removed from the page.
Added
Replaced trend sparkline bars with an SVG line chart + point markers for 7d/30d/90d windows.
Changed
Removed `Top sitemap routes (table)` from `/status/site-analytics/`.
Removed `Zero-view sitemap routes` section from `/status/site-analytics/`.
Removed off-sitemap sections from `/status/site-analytics/`, including tracked off-sitemap table/risk surface.
Reduced KPI strip by dropping off-sitemap counter card to match the simplified surface.
Removed public form-submission analytics surface from site
Removed the public lead-funnel status page and all site navigation links to form-submission analytics so this data is no longer exposed on the website.
Why it matters: Form-submission funnel analytics are no longer publicly available on adamboas.com.
Changed
Removed `/status/leads/` route from published pages.
Removed `Lead funnel analytics` quick route from `/status/`.
Removed `Lead Funnel Status` link from `/sitemap/` utility links.
Analytics representation upgrade: Pareto, heatmap, risk chart, and trend panel
Upgraded `/status/site-analytics/` with stronger decision-first visual representations while keeping the existing compact house style and detailed tables.
Why it matters: The dashboard now answers concentration, section coverage, off-sitemap risk, and momentum questions at a glance without sacrificing route-level drilldown.
Added
Added Pareto chart for top sitemap routes with per-route share and cumulative contribution markers.
Added section heatmap cards aggregating route families (home/writing/experience/etc.) with coverage and views context.
Added off-sitemap risk chart with risk score tiers to prioritize sitemap drift cleanup.
Added trend sparkline panel for 7d/30d/90d windows + momentum chips when totals are available.
Changed
Extended sitemap analytics snapshot schema with `insights` and `trends` blocks generated by `fetch-plausible-sitemap-analytics.mjs`.
Updated dashboard layout to emphasize scan-first visual analytics while preserving detailed supporting tables below.
Improved
Local/dev fallback now carries trend metadata from existing snapshots (when only partial windows are available).
Site analytics graphs pass: visual bars for coverage and route traffic
Added graph-style visualizations to the sitemap analytics dashboard so key route and coverage signals can be scanned instantly without parsing only tables.
Why it matters: Faster readout of route performance and sitemap coverage at a glance, with direct visual emphasis on traffic concentration and off-sitemap drift.
Site analytics dashboard: Plausible traffic mapped to sitemap routes
Added a new status dashboard that maps Plausible route traffic against sitemap coverage, highlighting top routes, zero-view pages, and off-sitemap tracked paths.
Why it matters: Gives fast visibility into what content is actually being discovered/visited versus what is published in the sitemap, helping prioritize SEO and internal linking work.
Added
Added `/status/site-analytics/` dashboard with KPI cards and route-level tables for top sitemap traffic, zero-view sitemap pages, and tracked off-sitemap paths.
Added `scripts/fetch-plausible-sitemap-analytics.mjs` to generate `src/generated/plausible-sitemap-analytics.json` from Plausible pageview snapshots + live sitemap index.
Added npm task `analytics:plausible:sitemap` for snapshot refresh.
Changed
Updated `/status/` quick routes with direct link to the new sitemap traffic analytics view.
Improved
Sitemap analytics snapshot now supports fallback generation from local Plausible pageview snapshots when API keys are unavailable in local/dev environments.
v2.3.89 2026-04-22Newresumepdfmetadatawritingfix
Resume body regeneration: clearance + phone + bold writing titles now visible in PDF
Regenerated the canonical site resume PDF from source so requested updates are visible in the document body, not just surrounding site metadata.
Why it matters: The downloadable `adam-boas-resume.pdf` now visibly shows phone and clearance in the header, and writing entries render with bold titles.
Changed
Regenerated `public/files/adam-boas-resume.pdf` from `Whitepaper/memos/adam-boas-resume/tex/memo.tex` with visible header updates: phone `(301) 904-2011` and `Clearance: Top Secret`.
Updated writing section styling in the generated resume to use bold writing titles.
Improved
Kept PDF document metadata aligned with request (`Subject: Top Secret`, `Keywords: Clearance: Top Secret`).
Updated resume-facing metadata language to include clearance context, added direct phone contact across key pages, and made writing card titles fully bold for stronger scan contrast.
Why it matters: Resume links now surface clearance status more explicitly, visitors can call directly from key contact surfaces, and writing lists are easier to scan at speed.
Added
Added `CONTACT_PHONE` and `RESUME_CLEARANCE` shared resume constants for reuse across pages.
Added direct click-to-call actions (`tel:`) on homepage and contact page.
Changed
Updated resume metadata display in sitemap/download surfaces to include `Clearance: Top Secret` and updated the resume PDF document metadata (`Subject` + `Keywords`) to `Top Secret`.
Added phone + clearance context on resume-adjacent homepage/experience surfaces.
Made writing list card titles bold on homepage, writing index, and sitemap writing entries.
Improved
Enhanced Person structured-data payload with direct telephone metadata.
Continued writing UX hardening with a sticky active-filter strip, built-in keyboard shortcuts for common actions, and dedicated Playwright regression tests for writing controls and URL sync behavior.
Why it matters: Faster power-user flow on `/writing/`, clearer active-filter state while browsing long lists, and stronger guardrails against regressions in quick filters/type toggles.
Fixed blank hover popups on writing key pills by requiring explicit tooltip metadata and added missing tooltip text for quick/density controls. Also removed the `+N tags` preview chip when tags are hidden.
Why it matters: Tooltips now render meaningful content instead of empty boxes, and hidden-tag mode is cleaner with less visual noise.
Changed
Added explicit tooltip copy (`data-tooltip` + `title`) for `Has audio`, `Recent 30d`, `Compact`, and `Comfortable` writing controls.
Removed per-card `+N tags` preview chips while tags are hidden; hidden mode now suppresses the tag metadata row entirely until tags are shown.
Fixed
Prevented empty tooltip popovers by scoping tooltip pseudo-elements to `.writing-key-pill[data-tooltip]` only.
Pass 2 consistency sweep: events + opportunities filter UX and shared control tokens
Improved high-traffic `/events/` and `/opportunities/` surfaces with debounced search input handling, event-type-specific filter listeners, and replacement of page-local action/pill styles with shared global UI tokens.
Why it matters: Smoother filter interactions under rapid typing, lower accidental rerender churn, and stronger cross-page visual consistency with less page-specific CSS to maintain.
Changed
Events filters now debounce free-text search and use `change` handlers for select controls instead of broad `input` wiring.
Opportunities filters now debounce search, use control-appropriate event bindings (`change` for selects/checkboxes), and keep numeric weight as immediate input.
Replaced opportunities page-local `opp-link-btn` and `opp-status-pill` usage with shared `ui-link-btn`/`ui-link-btn-muted` and `ui-pill` tokens.
Normalized search control semantics on both pages with `autocomplete=off` and `spellcheck=false`.
Improved
Removed redundant opportunities CSS blocks for button/pill variants now covered by shared global styles.
Applied a focused consistency pass across `/writing/` and homepage sections to tighten filter ergonomics, semantic form behavior, and shared visual language usage.
Why it matters: Filter interactions are less error-prone, controls are more accessible/consistent, and homepage section typography + intent chips align better with shared design tokens.
Changed
Writing type-toggle behavior now prevents disabling the last active type, avoiding accidental zero-result states caused by all-off filters.
Updated writing search input semantics (`type=search`, `autocomplete=off`, `spellcheck=false`) for cleaner query UX and predictable control behavior.
Writing quick filters simplified by removing redundant `Papers only` pill
Removed the `Papers only` quick-filter pill from `/writing/` and simplified filter state logic to rely on the existing type toggles for paper-only views.
Why it matters: Cleaner controls with less duplicated filtering behavior, while preserving backward compatibility for existing `papers=1` links and saved preferences.
Changed
Removed `Papers only` from quick filters since paper-only targeting already exists in the type toggle row.
Removed duplicate paper-only chip rendering and quick-filter state handling from `writing-index.js`.
Improved
Consolidated filter logic and URL normalization by stripping `papers` from rewritten query state while still honoring legacy `papers=1` on initial load.
CI/CD fast path for deploys: lighter main-branch deploy workflow + PR-only full regression gate
Reduced deploy critical path by replacing heavy Playwright/linkcheck gates in `deploy-dev-pages` with a quick preview smoke check, and moved `build-site` full regression workflow to PR/manual triggers.
Why it matters: Main-branch deploys should land materially faster while preserving deep quality gates for pull requests and optional manual runs.
Changed
Replaced deploy-time Playwright regression + strict/warn linkcheck steps with a fast preview smoke check (`/`, `/writing/`, `/events/`).
Updated `build-site` workflow triggers to `pull_request` + `workflow_dispatch` so full regression gates run where they add the most value before merge.
Improved
Removed duplicate heavy checks from the deploy path to shorten push-to-live cycle time on `main`.
Homepage writing cards compacted and contact CTA lane consolidated
Applied compact writing-card styling to homepage reading sections, added quick-intent contact shortcuts, and consolidated duplicated homepage card markup into a shared component.
Why it matters: Homepage scan is denser and cleaner, contact routing is faster for high-intent visitors, and the page now has less duplicated UI code to maintain.
Added
Added hero `Quick intents` shortcuts for `Consulting` and `Proposal support` that prefill `/contact/` intent routing.
Added reusable `WritingCompactCard` component for homepage writing/featured-card rendering.
Changed
Updated homepage Featured Reading and Writing lists to use compact, title-row signal-first card presentation (inline audio marker, lighter metadata footprint).
Consolidated engagement CTA lane to reduce duplicated contact actions and keep one clear project-start path.
Replaced remaining `import.meta.env.BASE_URL` homepage links with `withBase(...)` for path consistency.
Improved
Improved homepage maintenance posture by removing duplicated writing-card markup blocks.
v2.3.80 2026-04-22Newwritingaudiouxdensity
Writing audio indicator compacted into the title row
Moved the audio indicator from the metadata chip row into a compact inline marker beside each writing title.
Why it matters: Audio availability remains visible while card metadata wraps less and no longer burns an entire line for audio-only entries.
Changed
Replaced the larger `🎧 audio` metadata pill with a compact inline `🎧` marker in the title row.
Removed audio from the tag/metadata chip line so tags can occupy that row without audio forcing standalone wrapping.
Improved
Improved card scan density on `/writing/`, especially for entries that previously rendered only an audio pill beneath the summary.
Writing index upgraded with canonical tags, quick filters, density controls, and stronger related-reading recommendations
Delivered a full `/writing/` UX pass: canonicalized tag routing, added hidden-by-default tag previews with local preference toggles, introduced quick filters + sort + density controls, persisted view preferences in localStorage, and upgraded writing-detail related suggestions to use shared tags plus type-aware fallback logic.
Why it matters: Writing discovery is now faster and cleaner by default, tag pages no longer fork on formatting variants, personal browsing preferences persist, and detail pages surface more relevant follow-up reading.
Added
Added writing quick filters (`Has audio`, `Papers only`, `Recent 30d`) and card density toggles (`Compact` / `Comfortable`).
Added per-card subtle `+N tags` preview chips that appear when tags are hidden.
Changed
Canonicalized writing tag routing so spacing/hyphen variants share one canonical slug page instead of forking.
Updated `/writing/tags/` aggregation to merge canonical tag counts and labels by normalized slug.
Extended related-reading ranking on writing detail pages to weight shared tags + same-type affinity with fallback fill to maintain 3-5 recommendations.
Improved
Persisted writing view preferences (type filters, sort, density, quick-filter state) in localStorage while preserving URL state for shareable views.
Kept controls aligned to existing control-shell/key-pill design language and compact scan rhythm.
v2.3.78 2026-04-21Newwritingmobileuxresponsive
Mobile writing cards now hide tag chips
Adjusted `/writing/` card metadata on small screens so topic tags are hidden while the positive audio badge remains visible.
Why it matters: Cleaner mobile scan and less card crowding without removing the audio-availability signal.
Changed
Added mobile-only hiding for writing-card tag chips (`.writing-mobile-hide-tags`) at widths <= 767px.
Improved
Preserved the `🎧 audio` badge on mobile so audio availability remains explicit while tags are suppressed.
Removed the redundant home `Jump to` panel and standardized button/pill styling across contact, status, leads, and capability pages using shared global UI classes.
Why it matters: Cleaner homepage hierarchy, tighter cross-page visual consistency, and stronger resilience against long-text overflow on key status/capability surfaces.
Changed
Removed the redundant home hero `Jump to` box and kept section navigation in global header/sticky navigation surfaces.
Normalized CTA/action controls to shared `.ui-link-btn` variants across home, contact, status, lead-funnel, and capability pages.
Replaced page-local pill styles with shared `.ui-pill` tokens for consistent card metadata treatment.
Improved
Added `.wrap-anywhere` utility and applied it to long labels/titles on capability and status-lead surfaces to avoid clipping and horizontal pressure.
Hardened lead-funnel table behavior by allowing first-column wrapping with a minimum readable width.
Fixed
Fixed duplicated/fragmented style definitions by consolidating repeated button/pill CSS into global shared primitives.
Shipped a lead-funnel status surface from Plausible event snapshots and launched SEO-first capability/topic pages that aggregate writing, events, and opportunities.
Why it matters: You can now monitor conversion health (`CTA -> submit -> success`) and rank for capability-intent queries with focused topic landing pages.
Added
Added `scripts/fetch-plausible-funnel.mjs` plus generated snapshot `src/generated/plausible-funnel.json` for contact-funnel event aggregation.
Added `/status/leads/` lead funnel page with stage metrics, conversion rates, and by-page event breakdown.
Added `/capabilities/` index and `/capabilities/[slug]/` landing pages for AI/autonomy, cyber, cloud, DevSecOps, data, and proposal/capture topics.
Added shared capability taxonomy in `src/data/capabilities.ts`.
Homepage hero reorganized for cleaner navigation and better CTA placement
Refactored the homepage header/banner so Writing/Experience/Education live in a dedicated jump panel, while `Start project` is promoted as the primary action near the mission statement.
Why it matters: Top-of-page scan is cleaner: one clear conversion path and one clear navigation cluster, with less visual competition in the hero row.
Changed
Restructured hero layout into a content/CTA column plus a right-side `Jump to` panel.
Moved `Start project` to the primary CTA row next to mission copy and moved section links into a dedicated navigation block.
Simplified Engagement section CTA wording from `Start project intake` to `Open contact form` to reduce repeated primary emphasis.
Improved
Improved hierarchy for home-banner actions by separating conversion intent from in-page section navigation.
Contact intake + pipeline status surfaces shipped across core pages
Added a dedicated `/contact/` intake form, conversion CTAs on Home/Events/Opportunities, and pipeline freshness/status surfaces including a new `/status/` page.
Why it matters: Visitors can move from discovery to project intake faster, while events/opportunities users can verify deploy and data freshness without leaving the site.
Added
Added `/contact/` page with structured intake form (name/email/org/intent/brief) and direct email fallback.
Added `/status/` page with deploy badge, feed-crawl health snapshot, and SAM opportunity drift/freshness KPIs.
Added footer `Status` and `Contact` routes plus sitemap entries for both pages.
Changed
Updated Home hero + Engagement CTAs to include `Start project` / `Start project intake` flows.
Extended Events and Opportunities header action rows with direct intake CTA and status routing.
Improved
Added top-of-surface freshness pills on `/events/` and `/opportunities/` (feed crawl dates, source health, drift recency).
Writing index audio pill now appears only when available and moved into tag row
Updated `/writing/` cards so the audio pill renders only for entries with audio and is positioned first on the same line as tags.
Why it matters: Cards are cleaner (no negative no-audio marker), and audio availability stays obvious in the exact metadata row where people scan tags.
Changed
Audio pill now renders only when `audioPath` is present (removed `no audio` pill).
Moved audio pill into the tag row and placed it first when present.
Improved
Reduced right-side card clutter by keeping date-only metadata in the trailing column.
v2.3.71 2026-04-20Newwritingaudiouxdensity
Writing index audio summary row removed for cleaner top-line scan
Removed the top audio-coverage summary pills from `/writing/` while keeping the per-item audio availability pill on each card.
Why it matters: The `/writing/` control row stays shorter and cleaner, while audio visibility remains available exactly where needed per item.
Changed
Removed the audio-coverage summary row from the writing index control shell.
Improved
Reduced top-of-page control-line clutter for faster scan and cleaner visual rhythm.
SAM full-mirror archival mode with immutable snapshot history
Added a mirror-forever mode to SAM opportunity imports so every run can be archived in-repo with per-run snapshots, per-notice version history, and optional raw query payload captures.
Why it matters: You can now keep a Git-versioned long-term mirror of SAM content and compare how notices evolve over time without losing previous states.
Added
Added importer flags: `--mirror-forever`, `--mirror-root`, `--run-id`, and `--skip-query-payloads`.
Added mirror outputs: run snapshots, run metadata index, `latest` pointer, and per-notice version history under mirror directories.
Added npm script `events:sam-import:mirror` for deep, immutable, full-text mirror runs.
Changed
Extended detail-cache semantics so `--detail-cache-ttl-hours -1` behaves as immutable cache (fetch once, reuse forever).
In mirror mode, notice-description cache path now lives under mirror tree for Git-visible provenance.
Improved
Improved reproducibility for SAM intelligence ingestion with deterministic, content-hash based notice versioning.
Opportunities intel modal: deep text + attachments in-page
Added an in-page intel modal on `/opportunities` so each solicitation can be opened directly for deep-text preview and attachment/resource-link review.
Why it matters: You can now inspect notice intelligence context without leaving the opportunities workflow, then jump to source links only when needed.
Added
Added per-row `Open` intel action in Opportunity Table.
Added modal with solicitation metadata (who/what/agency/type/due/intel depth) plus deep-text preview and attachment/resource-link list.
Added direct links from modal to SAM notice and detail endpoint when available.
Changed
Extended opportunities client payload to include detail preview text, detail URL, and captured resource link arrays.
Improved
Added modal keyboard/backdrop close behavior and responsive layout for mobile review workflows.
Opportunities WHO/WHAT client intelligence explorer
Expanded `/opportunities` so you can directly target buyer organizations (WHO) and work lanes (WHAT) with explicit filters, visual distributions, and table columns.
Why it matters: You can now isolate likely client accounts and capability demand patterns in one workflow, then pivot into specific solicitations without leaving the page.
Added
Added `Who (client)` filter with dynamic client-family options derived from agency paths.
Added `What (work type)` filter with capability taxonomy classification (software/cloud/AI/cyber/data/etc).
Added `WHAT: work profile mix` chart and upgraded `WHO: target clients` chart for click-to-filter exploration.
Added `Client` and `Work type` columns to Opportunity Table for direct targeting analysis.
Changed
Updated control-shell guidance to emphasize WHO + WHAT targeting workflow.
Extended sort options with `Client org` and `Work type` modes.
Improved
Chart-filter status now surfaces active WHO/WHAT/NAICS pivots for fast context awareness.
Deep SAM intel controls expanded + maintenance cohesion sweep
Extended both `/events` and `/opportunities` with deep-notice intelligence controls/metrics, then completed a maintenance pass to keep release metadata and sitemap navigation in sync.
Why it matters: You can triage opportunities by evidence depth (text + attachments) faster, and supporting utility surfaces stay current as the platform evolves.
Added
Added deep-intel controls in `/opportunities`: Intel-depth filter/sort, deep/attachment KPI counters, and table depth/files columns.
Added deep-intel controls in `/events` solicitation tables: deep-text and attachment columns, plus depth/file sort and filters.
Changed
Updated human sitemap core links to include `/opportunities/` and `/radar/` for better intelligence-surface discoverability.
Expanded sitemap utility links with `Content License` and bumped global displayed release version to `v2.3.65`.
Improved
Improved maintenance cohesion between operational event/SAM updates and user-facing release/navigation surfaces.
Opportunities now includes full SAM feed mirror + resilient chart interactivity
Expanded `/opportunities` to include broad SAM candidate feed data (not only event-cached notices) and restored clickable bar filtering across fallback render paths.
Why it matters: You can analyze a much wider SAM opportunity set immediately and still use click-driven filtering even when chart runtime falls back.
Added
Added ingestion of `events-candidates-sam-opportunities.json` directly into `/opportunities` data model.
Added KPI visibility for SAM global feed row volume alongside event-linked SAM cache metrics.
Fixed
Restored full bar-click filtering behavior for fallback chart rendering (click + keyboard interactions).
Changed
Updated page framing from event-only SAM mirror to combined SAM feed + event enrichment intelligence surface.
Opportunities visuals streamlined for signal density
Removed underperforming/redundant charts from `/opportunities` to keep the analytics surface focused on high-signal views that support fast exploration.
Why it matters: You get a cleaner cockpit with fewer dead or overlapping visuals and faster scan-to-insight behavior.
Changed
Removed `Gem score vs due pressure` chart from `/opportunities`.
Removed `Due timeline` chart to avoid overlap with urgency distribution.
Improved
Reduced visual redundancy so remaining charts carry clearer analytical intent.
Opportunity Table upgraded with release-age, sorting, and pagination controls
Upgraded the opportunities table into a full interactive data grid with per-column sorting, page-size controls, pager navigation, and a new Days Since Release signal for faster triage.
Why it matters: You can now scan large opportunity sets without scroll fatigue and sort exactly by the field you care about.
Added
Added `Days Since Release` column to Opportunity Table (derived from posted date).
Added table pagination controls with first/prev/next/last navigation and rows-per-page selector.
Changed
Renamed section heading from `Opportunity mirror table` to `Opportunity Table`.
Opportunity Intelligence UI aligned to Events design language
Restructured Opportunity Intelligence into a tighter scan-first shell with consistent controls, denser visual cards, and improved table readability matching the Events polish baseline.
Why it matters: Opportunity triage now feels like the Events workflow: compact, consistent, and much faster to scan.
Changed
Converted top sections to shared control-shell styling for design consistency with `/events`.
Restructured filter area into a unified scan-first control shell with grouped fields and dedicated action row.
Reflowed visualization cards to a denser 3-column layout with responsive spans for gem/timeline focus cards.
Improved
Improved typography, spacing, and hierarchy across KPI cards, filter controls, and analytics panels.
Added zebra/hover treatment for table rows and tighter numeric/readability styling for scan speed.
Opportunity Intelligence mirror launched with rendering + CI hardening
Shipped a new `/opportunities` intelligence surface with full filtering, ranked gem detection, and visual analytics across cached SAM opportunity data; then patched rendering and deploy blockers.
Why it matters: You can now scan and triage opportunities directly from one page, while CI/deploy reliability was tightened to keep dev pages moving.
Added
Added `/opportunities` page that deduplicates cached SAM intelligence across enriched events into one mirror table.
Added filters/sorting for search, notice type, branch, due windows, minimum weight, focus-only mode, and gem ranking.
Added visual analytics blocks: gem picks, urgency distribution, notice mix, top agencies, top NAICS, and due timeline.
Changed
Added Opportunities to desktop/mobile navigation and global keyboard shortcuts (`g` then `o`).
Trimmed opportunity page header copy to remove the “Open this page to answer...” sentence per request.
Improved
Adjusted strict linkcheck policy to reduce false deploy blocks (moved `xponential.org` to warn tier; accepted HTTP 202 in strict checks).
Fixed
Fixed opportunities client dataset embedding so table/charts/gem list render instead of showing empty sections.
v2.3.58 2026-02-24Neweventsuxcalendarmapicons
Map popup calendar links now show icons only
Updated calendar links in event map popups to icon-only actions (🍎 / 🗓️ / 📘) while preserving accessibility labels/tooltips.
Why it matters: Calendar popup actions are cleaner and more compact, matching your icon-first preference without losing clarity.
Changed
Removed text labels (`iOS (.ics)`, `Google`, `Outlook (.ics)`) from map popup calendar links and kept only icons.
Improved
Added ARIA labels and title attributes so icon-only links remain accessible and self-describing on hover.
v2.3.57 2026-02-24Neweventsuxcalendarlegendtopics
Tracked event legend now shows topic-coded icon key inline
Updated calendar legend to show `Tracked Event [ AI | Software | Cloud | Cyber ]` with icons in a single consolidated key.
Why it matters: Legend now reads exactly as an at-a-glance topic key and better matches the icon-forward calendar action style.
Changed
Replaced separate topic legend chips with one consolidated tracked-event key: `Tracked Event [ 🤖 AI | 🧩 Software | ☁️ Cloud | 🛡️ Cyber ]`.
Improved
Kept hover explanation + accessibility labels on tracked legend key while aligning label style to icon-first calendar actions.
Events calendar actions now include iOS, Google, and Outlook with clearer labels
Updated event calendar action labels to `Calendar: iOS / Google / Outlook` with icon-marked options and explicit `.ics` cues for iOS/Outlook.
Why it matters: Calendar actions are now easier to understand at a glance and better aligned to device-specific intent (especially iOS + Outlook `.ics`).
Added
Added iOS calendar action (`🍎 iOS (.ics)`) alongside Google and Outlook in event cards and details.
Added iOS calendar action in map popup calendar group for parity across list/map surfaces.
Changed
Updated calendar group label to `Calendar:` and standardized icon-led labels (`🍎`, `🗓️`, `📘`).
Clarified Outlook and iOS actions with explicit `.ics` label suffixes.
Events list now jumps directly to the matching calendar month/event
Added a per-event list action that jumps the calendar to that event month, scrolls to the calendar section, and briefly highlights the matching calendar bar.
Why it matters: You can move from list triage to month context in one click without manually paging the calendar.
Added
Added an `In Calendar` action on each event card in the list.
Changed
Clicking `In Calendar` now sets the calendar to the event's month and scrolls directly to Calendar View.
Improved
Added temporary focus highlighting on the matching calendar bar so the selected event is easy to spot in dense months.
Events calendar reverted to uniform event colors with attendance-only highlighting
Removed topic-based color tones from calendar bars while keeping topic icons, and retained color emphasis only for attended events.
Why it matters: The calendar now reads cleaner with one default event color; your attended events remain visually distinct, and topic context still shows via icons.
Changed
Removed topic-tone bar classes so all non-attending calendar events render in the same baseline color.
Kept topic icon labeling (AI/Software/Cloud/Cyber) in event bars and legend for lightweight semantic cues.
Improved
Increased visual focus on attendance state by keeping color-coding exclusive to attended events.
Events calendar day-height stabilization, topic coding, and SOF Week attendance tag
Stabilized day-cell height for clearer month scanning, added lightweight topic icon/color coding for primary themes, and marked SOF Week as attending.
Why it matters: Calendar stays readable in dense months, AI/software/cloud/cyber priorities are easier to spot at a glance, and personal attendance now appears directly in calendar bars.
Calendar bars now derive and display a primary topic icon with matching tone classes for minor at-a-glance coding.
Marked `radar-sofweek-2026` as attended via `attendingEventIds` so SOF Week is visibly flagged.
Improved
Raised calendar day-cell minimum height to keep month rows visually stable and easier to scan.
v2.3.48 2026-02-24Neweventsuxcalendarcssbugfix
Events calendar rendering fixed to preserve traditional month-grid layout
Fixed calendar styling scope so dynamically rendered week/day grid rows and spanning bars keep their intended month layout instead of collapsing into stacked text.
Why it matters: Calendar now renders as a recognizable traditional month view with clear weekday columns, day cells, and readable multi-day bars.
Changed
Promoted calendar CSS selectors to global scope for JS-generated calendar nodes (`weekdays`, `days`, `bars`, and bar states).
Applied matching global mobile overrides so compact calendar typography and spacing still hold on small screens.
Improved
Improved calendar readability and month-grid fidelity for high-event-density months.
Fixed
Resolved scoped-style mismatch causing calendar rows and bars to render like unstyled stacked text.
Events month calendar added with spanning bars and attending highlights
Added a themed month-by-month calendar view with full month day grids and event bars that span across every day of each event duration.
Why it matters: You can now scan event timing as a true calendar, navigate month to month, and visually distinguish attended events for future reusable personal calendars.
Added
Added a new `Calendar View` section with Prev/Next/This month controls and themed week/day rendering.
Added event bars that stretch across every day of an event (including multi-day spans across week boundaries).
Added attended-event highlighting via code-managed `attendingEventIds` for distinct calendar enumeration and future reuse.
Changed
Calendar data now derives from filtered event results, so the month view stays in sync with active list filters.
Added event card data attributes (`data-end-date`, `data-attending`) to support reusable calendar rendering pipelines.
Events map pinning: above/below list with saved preference
Replaced the map hide toggle with a map placement pin control that moves the map above or below the event list and persists preference in localStorage.
Why it matters: Users can keep map and list both visible while choosing preferred scan order; default remains map below list and preference persists per browser.
Changed
Replaced `Hide map` with a `Pin map above/below list` toggle button in the control shell.
Added persistent map placement preference (`adamboas.events.mapPin.v1`) with default `below`.
Updated render logic to reposition the map section above or below the list without hiding either section.
Events recency state: New is view-based, Fresh is add-window based
Switched event recency badges to persistent local state so `New` only appears for events you have not seen yet, while `Fresh` tracks newly discovered events for a short window.
Why it matters: New badges now clear permanently after first view, and Fresh appears only for events first discovered in your browser within the last 14 days.
Changed
Replaced simple seen-id storage with a persistent per-event localStorage state object (`firstDetectedAt`, `firstSeenAt`, `lastSeenAt`).
Updated `New` badge logic to display only for currently visible events that have never been seen before on this browser.
Updated `Fresh` badge logic to show only when an event is newly discovered and within a 14-day freshness window.
Renamed event CTA labels for clarity and grouped Google/Outlook calendar actions into a single intuitive control in cards and map popups.
Why it matters: Event actions are now clearer at a glance (`Event Link`) and calendar options feel like one coherent action instead of separate unrelated buttons.
Changed
Renamed card and map link CTA text from generic `Link` to `Event Link`.
Grouped Google + Outlook calendar actions under one segmented `Calendar` control in event cards.
Grouped calendar actions in map popups and consolidated detail-view calendar links into a single `Add to calendar` row.
v2.3.42 2026-02-24Neweventsuxsearchfiltersmap
Events page flow streamlined: search + list first, map moved below
Reordered the DoW Events page so users land on full-text search and the event list immediately, with advanced filters collapsed and the map positioned after the list.
Why it matters: You can now open `/events/` and immediately scan/search the list without scrolling past the map; advanced controls remain available under More filters.
Changed
Moved the list section above the map section so search and results are adjacent at page entry.
Promoted full-text search to always-visible in the control shell.
Collapsed advanced controls under `More filters` to reduce top-of-page clutter.
v2.3.41 2026-02-24Neweventscalendaroutlookicsux
Events calendar export expanded to Outlook (.ics)
Added Outlook-compatible ICS downloads for each event alongside existing Google Calendar links across cards, event details, and map popups.
Why it matters: DoW events can now be added from the page into both Google Calendar and Outlook workflows without manual re-entry.
Added
Added per-event Outlook (.ics) download links in event card actions and verified-links detail sections.
Added Outlook (.ics) actions in map popups for parity with list view event controls.
Changed
Relabeled the existing card calendar button as `Google` for clearer provider distinction.
v2.3.40 2026-02-22Newfooternavigationuxlayout
Footer link order rationalized
Reordered footer utility links to put internal site navigation first, legal next, and external/contact links last.
Why it matters: Footer scanning is now more intuitive and consistent: sitemap and site utilities appear before outbound links.
Restored the sitemap top box to the preferred two-column structure with Core on the left and Utility on the right.
Why it matters: Sitemap keeps the improved overall layout while matching the previously preferred Core/Utility scan pattern.
Changed
Restored two-column sitemap structure inside the top box (`Core` + `Utility`).
v2.3.38 2026-02-22Newsitemapwritingpdflayoutux
Sitemap layout alignment + PDF-link consolidation
Aligned the sitemap to the site’s standard single-column layout, removed the separate published-PDF page, and folded PDF links directly into the Published Writing list.
Why it matters: Sitemap now matches the established visual system and avoids overflow, while published writing pages expose direct PDF access in one consolidated list.
Changed
Reworked `/sitemap/` to a single-column structure with standard card/control-shell spacing and heading treatment.
Renamed section heading to `Published Writing` and moved PDF access into each writing entry.
Fixed
Fixed long-title overflow in sitemap writing entries via safer wrapping behavior.
Improved
Removed the standalone `/pdfs/` route to consolidate published writing navigation in one place.
Memo pipeline upgraded to LaTeX-first artifact workflow
Moved memos to a deterministic LaTeX source pipeline with CI-built PDF/HTML/manifest artifacts and site-side verification gates, aligned with paper pipeline quality controls.
Why it matters: Memo rendering now follows the same reproducible build discipline as papers, reducing format drift and making sync validation deterministic across Whitepaper and site repos.
Added
Added Whitepaper memo artifact pipeline (`build-memos.yml`) with PDF/HTML/manifest outputs and metadata validation from `MEMO.yml`.
Added shared memo LaTeX preamble (`tex/memo_preamble.tex`) and memo source directories under `memos/<slug>/tex/memo.tex`.
Added site-side memo artifact verification (`scripts/verify-memos.mjs`) and CI gates (`npm run lint:memos`) in build/deploy workflows.
Changed
Updated `sync-whitepaper` workflow to ingest memo artifacts from Whitepaper `build-memos` runs instead of relying on ad-hoc local PDF generation.
Updated writing detail rendering to prefer generated memo HTML fragments (`src/generated/memos/*`) for published memos.
Improved
Introduced memo metadata mirror sync checks so `writing/memos/*.md` frontmatter stays aligned with `memos/*/MEMO.yml`.
v2.3.35 2026-02-20Newcilinkcheckeventsreliability
CI reliability: move unstable AUSA links to warn-tier checks
Updated linkcheck policy classification so `ausa.org` links are checked in warn-tier mode instead of strict blocking mode.
Why it matters: Intermittent upstream AUSA connection resets no longer break blocking CI gates, while warn artifacts still retain visibility for remediation and verification.
Changed
Classified `ausa.org` URLs into warn-tier policy handling during linkcheck preparation.
Removed transient AUSA transport failures from strict blocking gates while preserving non-blocking diagnostics.
CI reliability: move Google Calendar template links out of strict blocking checks
Updated linkcheck policy classification so generated Google Calendar template URLs run in non-blocking warn-tier checks instead of strict blocking checks.
Why it matters: Deploy and build workflows stay green more consistently while still preserving visibility into Calendar-link health through warn artifacts.
Changed
Classified `calendar.google.com` URLs into warn-tier policy handling during linkcheck preparation.
Removed calendar-template URL volatility from strict blocking gates while retaining non-blocking diagnostics.
Events quick-scan windows + unified control-shell alignment
Added timeline quick filters (Next 30d/90d/180d), introduced compact confidence-plus-source badges on event cards, and aligned control-shell rhythm across Events/Writing/Changes.
Why it matters: Event triage is now faster by narrowing to near-term windows in one tap, trust context is easier to parse at a glance, and top control surfaces feel more consistent across core list pages.
Added
Added quick timeline chips on `/events/`: `Next 30d`, `Next 90d`, `Next 180d`, with URL-persisted state.
Added compact event-card badges combining source confidence and source type (`High · Official`, etc.).
Changed
Aligned control-shell styling hooks across `/events/`, `/writing/`, and `/changes/` for tighter spacing rhythm and mobile wrap consistency.
Changes UX sweep: sticky mini filters, accessibility polish, and idle prefetch
Upgraded the Change Notes flow with a sticky compact filter row, stronger focus visibility, reduced-motion safeguards, and smoother list transitions.
Why it matters: Filtering/scanning long release history now stays fast during scroll, keyboard focus is easier to track, and transitions/navigation feel quicker without extra visual noise.
Added
Added a sticky mini filter row on scroll with compact search, topic-group toggles, and one-click reset.
Added skeleton loading states for filter and pagination transitions to improve perceived responsiveness.
Improved
Improved keyboard focus consistency with stronger visible rings across interactive controls.
Added reduced-motion handling so transitions/animations respect user motion preferences.
Tightened low-emphasis contrast on chips/meta text for better readability.
Added idle-time route/page prefetching for likely next navigation targets.
v2.3.31 2026-02-19Newuxeventscopyconsistency
Header title-case consistency pass
Standardized key UI section headers to Title Case across Events and supporting pages.
Why it matters: Interface labels read cleaner and more consistent, including “Geographic View” and related section titles.
Changed
Updated “Geographic view” to “Geographic View” on `/events/`.
Applied Title Case to related section headings on `/events/sources/` and `/404/` for consistency.
Restored generated paper HTML to match manifest hashes and moved a known legacy WEF citation URL out of blocking/warn checks.
Why it matters: CI paper verification is green again, and linkcheck avoids failing on a known unstable legacy citation while still surfacing actionable stale-link suggestions.
Fixed
Restored `agentic-force-creation` generated HTML/raw artifacts to match `manifest.sha256` expectations used by `lint:papers`.
Added targeted ignore rule for legacy WEF citation URL in linkcheck policy classification to prevent recurring noise during CI runs.
v2.3.29 2026-02-19Neweventsuxresponsivelayout
Events list header responsiveness polish
Updated the events-list heading/sort control layout so “Upcoming Events” stays one line on larger viewports and stacks cleanly on smaller screens.
Why it matters: Desktop keeps a compact one-line title + sort control row, while mobile/small screens place the dropdown on the next line for cleaner readability.
Changed
Renamed heading to “Upcoming Events” and applied nowrap behavior for larger viewports.
Adjusted list-header flex layout to stack on smaller screens and keep one-row alignment on larger screens.
Expanded CI/deploy quality gates with smoke/overflow/a11y regression coverage and tightened linkcheck signal quality.
Why it matters: Deployments are now blocked behind practical route-level and accessibility checks, while stale/noisy linkcheck findings are reduced and better surfaced as artifacts.
Added
Added core-route smoke Playwright suite (`tests/smoke.spec.ts`) and integrated it with overflow + a11y in CI/deploy gates.
Added topic-level linkcheck/test artifact uploads for easier triage from GitHub Actions runs.
Changed
Build and deploy workflows now run practical regression gates before deployment artifacts are published.
Events source page now supports `displayUrl` so public references can remain stable while crawler endpoints stay internal.
Fixed
Updated known stale links (AUSA events URL and WEF Amodei citation canonical path) to reduce recurring linkcheck noise.
Updated SAM API public reference links to stable Open.GSA documentation in user-facing content.
Extended paginated list controls to include First and Last actions across Writing, Change Notes, and Events.
Why it matters: Navigation across long result sets is now faster with one-click jumps to beginning/end while preserving existing clean control styling.
Added
Added First/Last buttons to paginated list controls on Writing index, Change Notes, and Events list views.
Changed
Pagination button disabled states now cover edge jumps (First/Prev disabled on page 1, Next/Last disabled on final page).
Tightened control-to-card spacing, removed empty filter-chip gap, and normalized type-pill centering for cleaner visual rhythm on the Writing index.
Why it matters: Controls and cards now feel more evenly spaced with better vertical alignment and less dead space in the filter shell.
Changed
Retuned writing-index control shell spacing (padding and row gaps) and reduced control-to-card stack gap.
Adjusted type toggle pill sizing for more consistent centering and hit-area alignment with other controls.
Fixed
Removed empty-state whitespace under writing filters by hiding the chip row when no active chips are present.
v2.3.18 2026-02-19Newwritinguxvisual-cohesion
Writing action-row cohesion pass
Aligned spacing and sizing of action-row controls by styling the read-progress chip with the same button tokens used by PDF, Copy, and Discuss.
Why it matters: Writing action controls now read as one cohesive control set with consistent spacing, typography, and hit area.
Changed
Restyled the read-progress indicator to match existing action-button dimensions and visual treatment.
v2.3.17 2026-02-19Newwritinguxreadability
Writing progress indicator switched to persistent percent chip
Replaced the top progress line with a persistent read-percentage chip beside PDF/Copy/Discuss for clearer visibility.
Why it matters: Reading progress is now always visible in the action row as text (for example, `42% read`) instead of a subtle line at the top.
Changed
Replaced the thin sticky progress line with an inline action-chip percentage indicator in the writing controls row.
Improved
Progress percentage now updates only when value changes to reduce unnecessary DOM churn while scrolling.
v2.3.16 2026-02-19Newwritinguxregression-fix
Reading progress bar behavior fix
Fixed writing detail reading progress so it tracks correctly in the site’s body-scrolling layout instead of appearing static.
Why it matters: The top reading line now visibly advances as you scroll long writing pages and reaches full width near the end of the article.
Fixed
Progress calculation now reads from whichever scroll container is active (`window`, `documentElement`, or `body`) and listens at document capture level for reliable updates.
Linkcheck reliability lane + events intelligence CTA pass
Introduced tiered external link checking, added stale-link suggestion output, and expanded events quick actions with Calendar plus stronger confidence/acquisition context.
Why it matters: CI linkcheck now fails less on known unstable domains while still enforcing strict-quality links, and event cards/map/details provide faster actionability and evidence context.
Added
Added linkcheck policy preprocessing (`strict`/`warn`/`ignore`) and new scripts for warn-tier checks plus stale-link replacement suggestions.
Added event-level Google Calendar deep links on cards, map popups, and expanded event links.
Changed
Linkcheck workflow now blocks only strict-tier domains while running unstable domains in non-blocking warn mode with machine-readable output artifacts.
Improved
Added confidence-notes and acquisition-reference summaries in event details to improve source provenance clarity during triage.
Fixed
Addressed stale known links via actionable suggestion reporting (AUSA events URL, SAM API docs endpoint, and WEF canonical URL mapping).
Eliminated TOC text jitter caused by scrollbar mode-switching on hover/focus.
Why it matters: Hovering the right-side TOC now reveals scroll affordance without shifting words or reflowing line breaks.
Fixed
Changed TOC scrollbar behavior to keep a stable gutter and constant scrollbar width, with colors transitioning on hover/focus instead of width toggling.
Prevented TOC content reflow by removing hidden-to-visible scrollbar width changes that caused horizontal text movement.
Added
Playwright regression test asserting TOC hover does not shift first-link position or width.
Hardened Whitepaper sync so notes/memos marked as draft are excluded from site content and memo PDF publishing.
Why it matters: You can now keep writing in pipeline with `status: draft` without accidentally publishing markdown pages or direct memo PDFs on the public site.
Changed
`sync-whitepaper` now syncs only published notes/memos (status defaults to published when omitted).
Memo PDFs are now copied only when tied to published memos (via `pdfPath` or matching slug stem).
v2.3.11 2026-02-17Newlayoutdesktopultrawideux
Ultra-wide layout expansion for large screens
Expanded overall content width on very large displays (1900px+) so center content uses substantially more horizontal space.
Why it matters: On ultra-wide monitors, pages no longer feel boxed into a narrow center column and can use much more of the available viewport.
Changed
Added a 1900px+ responsive breakpoint that increases `.site-main` max width to `min(96vw, 116rem)`.
Expanded shared `.container` width at 1900px+ to `min(94vw, 112rem)` for better header/footer and section alignment.
v2.3.10 2026-02-17Newchangesmobileuxfilters
Changes mobile filter usability fix
Fixed `/changes` mobile usability by removing sticky filter lock on phones, tightening search/control sizing, and constraining the tag area so release content stays visible.
Why it matters: On mobile, release entries are now immediately readable instead of being obscured by an oversized sticky filter surface.
Changed
Changed `.changes-filter-bar` to non-sticky on mobile and retained sticky behavior for desktop only.
Added mobile-friendly sizing for search/clear controls and improved input shrink behavior.
Constrained tag cloud height on phones with internal scroll to prevent viewport takeover.
v2.3.9 2026-02-17Newuxvisualmobileglobal
Global visual polish across all pages
Applied a site-wide beautification pass: calmer background grid, softened surface borders, cleaner card depth, tighter mobile heading rhythm, and refined header/footer link chrome.
Why it matters: Pages now feel cleaner and more consistent end-to-end with better scanability and less visual noise, especially on mobile.
Changed
Updated global surface tokens and card styling (`.card`) for cleaner border hierarchy and subtler elevation.
Refined header navigation pills and footer utility links for a more consistent visual system.
Reduced body grid intensity and tuned mobile spacing for section titles and footer controls.
Improved
Added global control transitions for smoother hover/focus feedback across form and button elements.
v2.3.8 2026-02-17Neweventsmobileuxreadability
Events mobile readability cleanup
Refined `/events` card layout and typography on phones to prevent right-rail controls from crushing title/metadata width and to improve scan speed.
Why it matters: Event cards now read cleanly on mobile with less wrapping noise, tighter action controls, and clearer metadata grouping.
Changed
Card action rail now stacks below content on small screens instead of competing for horizontal title space.
Converted card metadata line into wrapped meta items with separators that collapse cleanly on mobile.
Compacted mobile button/chip sizing (`In Nd`, `Link`, `Map`, confidence/freshness/new badges) to reduce visual crowding.
Implemented a broad UX pass across Events/Writing/Changes: quick AI-cloud-software-cyber filters, inline confidence/freshness badges, new-since-last-visit cues, mobile control compaction, and page-specific helper-script loading.
Why it matters: Faster scanning, higher trust clarity, improved mobile reading space, and lower non-essential script overhead on non-writing pages.
Added
Added quick topic filter chips on Events (`AI`, `Cloud`, `Software`, `Cyber`) with URL-persisted state.
Added inline trust signals to event cards: confidence band + evidence freshness + `New` badge for unseen events.
Added `New` badge support on Change Notes releases based on last-seen version in browser local storage.
Changed
Further compacted mobile top chrome: tighter header spacing, compact sticky browse shell, and icon-labeled compact writing action pills.
Moved non-critical helper scripts (`copy-link`, `codeblock-tools`) to writing pages only and switched global shortcuts script from inline payload to external module URL loading.
v2.3.6 2026-02-17Newmobilewritinguxdensity
Mobile writing header density reduction
Reduced vertical space used by mobile writing pages by compressing sticky browse controls and converting the writing action bar to a compact single-row scroller.
Why it matters: On phones, the top navigation/action region now occupies materially less height, preserving more visible reading area above the fold.
Changed
Sticky mobile browse bar is now a single compact row (removed secondary row actions from the top rail).
Writing action controls now render as a compact horizontal scroller on mobile instead of a two-row stacked block.
Improved
Hidden PDF page/size metadata on small screens to reduce control width and visual clutter.
v2.3.5 2026-02-17Neweventsaicloudsoftwarefooter
Cloud/software/AI event expansion + footer nav trim
Added additional cloud/software/AI-focused federal event records from official GovCIO event pages and trimmed footer links to utility-only navigation.
Why it matters: The events tracker now includes more AI/cloud/software signal while the footer is cleaner and avoids duplicating primary header navigation.
Added
Added six official GovCIO 2026 events to the radar dataset: Defense IT Summit, CyberScape Summit, Federal IT Efficiency Summit, Federal Tech Leaders Summit, Federal Cloud & Data Forum, and Health IT Summit.
Changed
Trimmed footer navigation to utility links only (RSS, Changes, License, GitHub, LinkedIn, Email), removing duplicate primary-section links already present in header navigation.
v2.3.4 2026-02-17Newsiteprofilelinkedinseofooter
LinkedIn profile link added to site navigation/footer surfaces
Added Adam’s LinkedIn profile link to the site footer and homepage Person structured data (`sameAs`).
Why it matters: Visitors and search engines now have an explicit LinkedIn profile reference directly from site UI and metadata.
Added
Added LinkedIn link to footer navigation: `https://www.linkedin.com/in/adamnboas/`.
Changed
Extended homepage Person schema `sameAs` list to include LinkedIn profile URL.
ACP-RA web duplicate Executive Summary suppression
Fixed duplicate Executive Summary rendering on the ACP-RA writing page by suppressing a leading unnumbered duplicate block when an in-body Executive Summary section is already present.
Why it matters: ACP-RA now displays a single Executive Summary section in web view, matching expected reading flow.
Fixed
Added generated-paper HTML normalization to remove duplicate leading Executive Summary block when duplicate `id="executive-summary"` sections are present.
NDIA/NTSA event-detail enrichment from live browser data
Enriched the full NDIA/NTSA 2026 event set with card-level metadata from the live NDIA browser page, including registration/agenda links, type/location parsing, and cleaned deduplication.
Why it matters: Tracker records now carry substantially more actionable detail for NDIA/NTSA events while preserving official-link legitimacy gating.
Changed
Updated NDIA/NTSA 2026 entries with live card metadata: date ranges, type/venue/location normalization, and richer event descriptions.
Added available registration and agenda links into ontology links for newly integrated event records.
Fixed
Removed duplicate I/ITSEC representation and retained a single canonical tracker record tied to the official NTSA event URL.
Bulk NDIA 2026 calendar ingest from live browser session
Pulled the full currently listed NDIA/NTSA 2026 calendar set from a live browser-visible NDIA events page and added missing records with official event URLs.
Why it matters: Coverage expanded immediately with broad NDIA/NTSA 2026 event visibility despite direct-fetch anti-bot blocking on NDIA endpoints.
Added
Added 27 missing NDIA/NTSA 2026 events from the live NDIA events calendar into `src/data/radar/events.ts`.
Attached official event links for each newly ingested calendar record (event-page canonical URLs).
Changed
Normalized new records to Radar schema with consistent provenance notes indicating browser-relay ingest path.
Improved
Expanded near-term conference pipeline coverage while NDIA anti-bot protection continues to block direct crawler fetches.
Added a public source registry and one-off URL list for PR-based contributions, plus a scheduled GitHub Action that crawls feed health daily and opens report PRs.
Why it matters: Contributors now have a clear PR target for event sources, and feed reliability monitoring is automated with a daily crawl report.
Added
Added public registry file `src/data/radar/feed-registry.json` and public page `/events/sources/` for feed transparency + PR contribution.
Added crawler `scripts/crawl-radar-feed-registry.py` with outputs `feed-crawl-report-latest.json|md`.
Added scheduled workflow `.github/workflows/radar-feed-crawl.yml` to run daily and open/update a PR with crawl report changes.
Changed
Linked source-feeds and registry PR target directly from `/events/` header.
Added npm script `events:feed-crawl` for local/manual feed health runs.
v2.2.0 2026-02-17Neweventssourcesingestoperations
Marine Military Expos source integration + feed inventory
Integrated Marine Military Expos into priority-source ingestion and published a durable inventory of active event feeds and aggregator pull targets.
Why it matters: Event sourcing is now clearer and broader, with explicit feed operations guidance for ongoing monitoring and ingestion.
Added
Added `Marine Military Expos` scraper support in priority-source import pipeline.
Added AI/agentic/autonomy-relevant future events and upgraded key existing records from disallowed-source provenance to official links.
Why it matters: The active /events feed now includes stronger AI/autonomy signal with better link trust and fewer records blocked by legitimacy gating.
Added
Added `AI for Defense Transformation 2026` (IDGA), `AI+ Expo for National Competitiveness 2026` (SCSP), and `Defense IT Summit 2026` (GovCIO) with verifiable event links.
Changed
Updated existing `AUVSI XPONENTIAL 2026` and `Autonomy in Defense 2026` entries to trusted official provenance/links so they pass active-feed trust gating.
v2.1.5 2026-02-17Neweventsog-imagecopy
Events OG title simplified
Updated the Events OG card title text to the shorter label requested.
Why it matters: Social previews now present a cleaner, minimal title: `DoW Events`.
Changed
Changed the /events OG card title from `DoW Events + BD Intelligence` to `DoW Events`.
v2.1.4 2026-02-17Neweventsog-imagecopysocial
Events OG card expanded with full descriptive subtitle
Updated the /events social preview image copy to use the available space with fuller explanatory text.
Why it matters: Link previews now communicate page purpose more clearly before click-through.
Changed
Expanded the Events OG subtitle to a fuller description and increased line capacity for clearer preview context.
v2.1.3 2026-02-17Neweventscopylaunch-readiness
Events hero subtitle removed per directive
Removed the extra hero subtitle line from /events for cleaner launch framing.
Why it matters: The events page top section is now tighter and less verbose while preserving functionality.
Changed
Removed `Conference-first tracking with sourced opportunity context, SAM visibility, and evidence-backed links.` from the /events hero area.
Added explicit source-domain trust gating and produced a one-by-one legitimacy audit artifact for all event records.
Why it matters: Events tied to known low-trust aggregator domain `jbenton1.github.io/government-guide/conference-tracker/` are excluded from active display until independently verified.
Fixed
Blocked disallowed source domain links from eligibility (`jbenton1.github.io`) in active event filtering and link rendering.
Required future date + usable external link + trusted source domain for inclusion in active event feed.
Added
Generated row-by-row audit report: `src/data/radar/event-legitimacy-audit-2026-02-17.md` (kept vs dropped with reasons).
v2.0.8 2026-02-17Newuxmobilehomepagebugfix
Homepage mobile overflow fix for featured cards
Fixed a mobile rendering bug where featured reading titles could overflow card bounds and appear clipped/bleeding outside the container.
Why it matters: Homepage cards now wrap safely on small screens and preserve readable layout without horizontal clipping artifacts.
Fixed
Hardened featured reading card layout with min-width constraints, overflow clipping, and wrapped title rendering.
Updated mobile top quick-link row to allow wrapping under tight viewport/text-size conditions.
Future-only event feed + one-by-one link hardening pass
Restricted the active tracker feed to future-dated events with usable external references and promoted real source links when official links are missing.
Why it matters: The board now suppresses stale/non-future records and improves link integrity by preferring valid external event references over placeholders.
Fixed
Removed non-future entries from active display (only future-dated events remain in tracker output).
Required at least one usable external URL (official or provenance) for events to appear.
Changed
Primary event `Link` now falls back to validated provenance URLs when a direct official URL is absent.
Expanded detail links with source references (`Ref 1..n`) to support one-by-one verification workflows.
Events tracker reframed as generic DoW + BD intelligence capability
Renamed the Events surface to a generic DoW events + BD intelligence capability and filtered out manual seed-only records without real external sources.
Why it matters: Tracker language is now capability-oriented, and trust is improved by excluding synthetic/unverifiable seed records from the active feed.
Changed
Renamed page and key detail blocks toward a generic capability model (`DoW Events + BD Intelligence Tracker`, `Opportunity intelligence`, `BD insights`).
Kept conference-first UX while preserving layered opportunity intelligence (SAM links, government organizations, POCs, insights).
Fixed
Filtered out manual seed-only records that lacked real external official links, reducing non-verifiable event noise.
v2.0.5 2026-02-17Neweventsuxdata-quality
Events link integrity pass + circular-link suppression
Hardened event link rendering so circular/self-referential links are excluded and only usable external links surface in card actions and metadata.
Why it matters: The `Link` button now appears only when an event has a valid external official URL, preventing loops back to the tracker itself.
Fixed
Suppressed circular links that pointed back to `/events/` from both top card actions and detail link sections.
Normalized/validated event links before rendering to avoid showing invalid link actions.
Changed
Cleaned placeholder self-links from seeded event records so only real external event links remain eligible for display.
Events informational overlay generalized for public intelligence use
Replaced user-specific BD tracking fields with generic informational overlays oriented to opportunity discovery and public-source context.
Why it matters: Expanded event details now prioritize SAM links, government organizations, government POCs, and relevant insights instead of personal engagement status tracking.
Changed
Replaced `BD engagement` panel with a generic `Informational overlay` panel for opportunity context.
Converted contact section into `Government POCs` and added `Government organizations` + `Relevant insights` blocks.
Expanded SAM handling to surface SAM links as explicit opportunity references in detailed metadata.
v2.0.3 2026-02-17Neweventsseosocialux
Events OG card subtitle fit tuned for more visible text
Adjusted OG text layout so the Events page subtitle can occupy more space before truncation.
Why it matters: Shared `/events/` links now show a fuller subtitle instead of clipping early with ellipsis.
Changed
Updated Events OG card subtitle rendering to use a slightly smaller subtitle font and up to two lines.
v2.0.2 2026-02-17Neweventsseosocial
Events page OG image generated and wired
Added a dedicated social preview image for the Events tracker and connected page metadata to use it.
Why it matters: Sharing `/events/` now renders a page-specific OG card instead of the global default image.
Added
New generated image asset: `/public/og/events.png` via the OG image generator.
Changed
Events layout now sets `image="/og/events.png"` for Open Graph and Twitter cards.
v2.0.1 2026-02-17Neweventsacquisitionoperationsux
Conference-first tracker cleanup with deeper BD/evidence overlays
Re-centered Events on conference tracking while keeping SAM/opportunity intelligence in detailed metadata through engagement and evidence overlays.
Why it matters: The interface is cleaner for fast event scanning, and BD/opportunity depth is preserved where it matters: inside detailed event analysis.
Added
New BD engagement + contacts metadata block (status, owner, next action, touch date, contact list) in expanded event details.
New evidence-health view per source (`Fresh/Watch/Stale`) with timestamp-aware provenance badges.
Direct SAM links in map popups and metadata links section when SAM provenance is available.
Added explicit source-layer filtering and visual differentiation so SAM official notices can be overlaid against conference/workshop/hackathon events without ambiguity.
Why it matters: You can now compare opportunity notices and conference ecosystem activity in one view while still quickly isolating each channel when needed.
Added
New source-layer filter (`All`, `Conferences/workshops/hackathons`, `Government opportunity signals`, `SAM official notices`).
Preset shortcuts for conference-only and SAM-only slices in the compact control shell.
SAM/opportunity source tags on event cards and source badges inside map popups.
Changed
Map pin rendering now applies source-layer color coding in addition to event-type tone.
Filter/query state now persists `source=` in URL so overlays are shareable and reproducible.
Improved
Event summary stats now include SAM official notice count for quick channel health checks.
Accessibility labels added to filter controls to keep axe-critical checks clean as controls expand.
v1.5.5 2026-02-17Neweventsacquisitionnavydata
Navy / NSWC sourcing expansion + solicitation-heavy SAM profiles
Expanded Events ingestion with Navy-targeted SAM profiles and an official NAVSEA/NSWC page crawler for industry-day signal discovery.
Why it matters: Higher coverage of Navy and naval-warfare-center opportunity signals with cleaner prioritization for solicitation-relevant action.
Added
Navy and NSWC-specific SAM import modes (`events:navy-sam-import`, `events:nswc-sam-import`) with organization-focused filtering.
Additional service-oriented SAM profiles (`events:army-sam-import`, `events:air-sam-import`, `events:marine-sam-import`, `events:joint-sam-import`).
Official NAVSEA/NSWC page crawler (`events:navy-pages-import`) to surface industry-day and outreach candidates from warfare-center pages.
Changed
SAM importer now supports additional notice types (`o`, `k`) for deeper solicitation relevance alongside p/r/s signal notices.
Importer scoring now includes deterministic relevance reasons and Navy-linked confidence tagging.
Improved
Priority-source guidance now explicitly ranks NAVSEA/NSWC official pages + expanded SAM profile strategy.
v1.5.4 2026-02-17Neweventsfiltersacquisitiondata
Events industry-intelligence lens + acquisition signal pipeline
Added engagement-signal filtering (industry day, pre-solicitation, sources sought, vendor outreach, special notice) and introduced a SAM.gov opportunities importer baseline.
Why it matters: You can now isolate actionable procurement engagement signals faster and prepare a cleaner ingestion path for deadline-aware tracking.
Added
Preset event views for all events, government opportunity signals, and key engagement kinds.
New engagement filter with URL-persisted state and filter-chip visibility.
Acquisition-signal metadata block in event details (notice type, agency, solicitation number, response/registration dates when present).
New SAM opportunities importer script (`events:sam-import`) for p/r/s notice ingestion candidates.
Changed
Events now infer engagement kinds from structured metadata plus deterministic title/description heuristics.
Map popups now surface opportunity badges when engagement signals are detected.
Improved
Priority-source notes now include SAM.gov API as a first-class source for acquisition notice coverage.
Importer pipeline hardening includes stronger duplicate prevention by canonical title-year keys and source precedence.
v1.5.3 2026-02-17Newwritinguxaccessibility
Code block wrap control reliability fix
Fixed Wrap/Unwrap behavior for numbered code blocks on writing pages and improved visible state feedback.
Why it matters: Long code samples now reliably wrap on demand, especially on mobile and narrower windows.
Added
Wrap control now toggles visible state text (`Wrap`/`Unwrap`) with pressed-state semantics.
Changed
Numbered code-line wrapping now correctly overrides base `white-space: pre` rules when wrap mode is enabled.
Improved
Applied safer word breaking/overflow handling for long tokens in wrapped code lines.
v1.5.2 2026-02-17Neweventsuxdata
Events cost visibility in compact + detailed views
Registration cost now appears in event cards and metadata views only when cost data is actually tracked.
Why it matters: Improves decision-readiness while keeping cards clean when cost data is absent.
Added
Compact card metadata now includes `Reg: <amount>` when registration cost exists.
Changed
Detailed logistics now conditionally renders estimated cost only when tracked.
Improved
Cost rendering now avoids separators/placeholders when cost is missing.