Conversation
…ccess Previously fired on push to main with a fixed 30s sleep, which races GitHub Pages deployment. Now triggers on deployment_status success for the github-pages environment — purge fires only after Pages confirms the deploy is live. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…loses #54 - GA script, cookie banner HTML, and cookie consent JS removed from all six pages (index, doctrine, portfolio, now, governance, 404) - Cookie consent CSS block removed from style-v2.css (~95 lines) - GitHub icon (18px header, 20px footer) added to all pages - JSON-LD sameAs updated on all pages to include github.com/simonives - governance.html rewritten: Cloudflare Analytics explanation, no-cookies statement, infrastructure disclosure, updated jurisdiction section - governance.html meta description updated to reflect Cloudflare Analytics - llms.txt: GitHub profile section added - sitemap.xml: governance.html lastmod updated to 2026-07-15 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace em dashes with colon and full stop per CLAUDE.md hard rule. Found by code-review on PR #55. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Currently section: BHP, SAP SuccessFactors, ServiceNow, and Australian HR
Institute all linked to their respective websites
- Where he'll be: expanded to three separate entries with event page links
- 12 Aug: SAP NOW ANZ (sapnowanz.html)
- 13 Aug: Snowflake World Tour Sydney
- 1 Sep: SAP HR Connect Sydney (SuccessFactors event)
- Updated timestamp to 15 July 2026
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…E.md Adds tool-neutral (AGENTS.md) and Gemini/Antigravity (GEMINI.md) instruction files for this repo, reorganised under Scope/Precedence/Instructions/Negatives/Expiry with all named topics (accessibility, voice, architecture, SEO, dark mode, GitHub workflow, Superpowers) folded into Conventions/Commands. CLAUDE.md was rewritten to the same structure but is not included in this commit — it is gitignored by existing repo convention (.gitignore line 57, "AI collaboration files... not needed in the public repo view") and remains local-only, consistent with that convention. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Same privacy boundary as CLAUDE.md — these carry identical brand/site content and were committed before the boundary was reconsidered.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JSYCmcxgTH8whkKwjZekxB
GitHub Pages serves the apex domain directly (CNAME: simonives.com, no www). Cloudflare 301-redirects www to apex. Every canonical reference on the site (link rel=canonical, og:url, sitemap.xml, llms.txt, simonives.md, robots.txt's Sitemap line, JSON-LD url) pointed to www instead, so any tool that doesn't follow cross-host redirects, several AI fetch tools among them, got a dead end instead of content. Also adds a CI check (check-canonical-host.yml) that fails the build if www.simonives.com reappears anywhere in tracked files, so this can't quietly come back when new pages are added. Fixes #72
# Conflicts: # 404.html # doctrine.html # governance.html # index.html # now.html # portfolio.html # sitemap.xml
Replaces the Google Fonts CDN dependency. Instanced from Google's variable fonts (wght for Cormorant Garamond, wght+opsz for Inter), subset to latin, converted to woff2 via fonttools. SIL OFL 1.1, license included alongside each family.
fonts.css: @font-face for the self-hosted faces (Task 1) plus the existing Material Symbols font. tokens.css: full M3 semantic colour, typography, spacing, and shape token layer, light + html.dark, seeded from the site's own Aurum, Midnight, Parchment, and Slate palette per STYLE_GUIDE.md. components.css: component layer keyed to class names used across all six pages (Tasks 3-8). Not yet wired into any page; that's Tasks 3-8.
Review finding: 28 em dash occurrences across the three new stylesheets' comments violated the plan's no-em-dash constraint. Replaced with full stops or commas, no functional CSS changed.
Stylesheet links swapped, hero and quote-band moved onto Midnight with the Phi watermark, polyrhythm rule replaces the old <hr>, engage cards added at end of page. No copy changed except the engage-cards placeholder text (see Task 8).
fonts.css (Task 2) references fonts/material-symbols/MaterialSymbolsOutlined-Variable.woff2, but that file only ever existed on the unmerged material-design-poc branch, not on dev, so it was missing from this worktree. Brought in from that branch (same file, Apache 2.0 licensed, license included). Task 3's implementer flagged this as a concern; it doesn't affect index.html (no icons rendered there) but would break every other page's nav icons (menu, theme toggle) once they're migrated.
Sticky rail navigation removed (superseded by numbered practice cards per the M3 spec). Three practices wrapped as numbered cards with ghosted ordinals; polyrhythm diagram added to practice 03. No copy changed.
components.css styles engage-card descriptions via the bare .engage-block p selector, which a span never matches. Changed <span class="engage-body"> to <p class="engage-body"> in both files so the intended 16px/1.6/on-surface-variant styling actually applies. No text content changed.
Prose wrapped in reading rails with a dropcap opening paragraph 1, the two-teachers quote promoted to a full quote band, a phi-break marks the shift from movement two to three (immediately after "I want to be clear about one thing..." and before "When I decided to study it formally..."). Engage cards added with the Understand -> doctrine.html variant. No copy changed except the placeholder engage-body text. Two deviations from the task brief, both required by the actual spec doc (docs/superpowers/specs/2026-09-16-material-design-site-refresh.md, lines 235-249), not the brief's paraphrase of it: 1. The brief assumed 9 paragraphs across 3 even movements. The real file has 12. Per the spec's own paragraph counts and semantic description, the split is 2/3/7: movement one is the two-teachers paragraphs (dropcap opens the first), movement two is exactly the three paragraphs "not a straightforward student" through "I want to be clear about one thing," and movement three is the remaining seven paragraphs from "When I decided to study it formally" to the close. The phi-break sits at the movement two/three boundary, marking "the shift from childhood to working life" per the spec. 2. The spec calls for an 80px .quote-phi on this page versus 88px on the home page, implying a page-specific modifier (e.g. .quote-band--portfolio). No such modifier exists in components.css (Task 2). This is a CSS gap, not fixable from this file alone; the base 88px .quote-band sizing is used here for now. Tracked as a follow-up for whoever revisits Task 2/components.css.
Flat now-label paragraphs restructured into an M3 card grid; schedule entries restructured into event rows with a date chip. No copy changed, existing headings and body text preserved exactly, mapped to the closest matching card from the design spec.
…dd past-event marker and update Now schedule Task 6 review found two real defects inherited from the task brief's literal markup template colliding with the existing CSS: event rows rendered stacked instead of chip-beside-text (the wrapping <a> had no flex layout of its own), and the "Still going" card's background never actually switched to Midnight (a class-collision between .card-filled and .on-midnight of equal specificity), producing a severe contrast failure. Both fixed in components.css. Also adds a Material Design 3-consistent past-event treatment (dimmed row plus a tonal "Past" pill, matching the site's existing eyebrow/tag typography, rather than strikethrough) and refreshes the Now page's schedule per Simon's direction: three past events marked accordingly, three upcoming events added (family holidays 16-24 Sep, Montreal SAP SuccessFactors Executive Innovation Board 2-6 Nov, Gartner HR Symposium/Xpo Sydney 16-17 Nov, the latter's dates verified against Gartner's own conference page). Last-updated stamp bumped to 17 September 2026. This is content Simon supplied directly, distinct from the placeholder engage-cards copy still pending the separate content pass.
.event-row--past:hover was resetting opacity to 1 (inherited from the base .event-row:hover rule), popping past events back to full brightness on hover instead of staying visually de-emphasised.
Governance stays deliberately plain, no Midnight band, no watermark, per the spec. 404 gets the largest Phi watermark on the site, full Midnight treatment, with a phi-break transition device between the hero and the engage cards in place of the removed legacy divider. No copy changed on either page, including the existing 404 subheadline's em dash, which is a content fix for the next pass, not this one.
Grep-verified across all six HTML files that nothing references either stylesheet before deleting them, the M3 stylesheet trio (fonts.css, tokens.css, components.css) is now the site's only CSS.
tokens.css's own comment on this block said to delete it once every selector was migrated and style.css was removed (Task 9). Grep- confirmed zero remaining references to any --color-* alias or --transition-premium anywhere in the six HTML files or components.css before removing it.
Discovered during Task 10's accessibility pass: the mobile nav's menu-toggle script had no keyboard path to close the overlay other than tabbing back to the toggle button. Pre-existing on dev, not introduced by this refresh, but worth closing given the site owner's stated vision impairment and the WCAG 2.2 AA baseline this project is held to. Escape now closes the overlay and returns focus to the toggle button, identical behaviour added to all six pages since each carries its own inline copy of this script.
Fixes #74. .on-midnight a (element+class, specificity 0,1,1) was beating .btn-filled's own color rule (single class, 0,1,0) at rest, painting the "Read all of Phronesis" button's text the same Aurum as its own background, a zero-contrast label invisible until :hover's higher-specificity rule took over. Added .on-midnight .btn-filled (0,2,0) so the filled button's own text colour always wins inside a Midnight section, regardless of any future placement.
Two Critical findings: - 404.html's engage-cards section was not new: the page already had a real, site-owner-authored Phronesis/LinkedIn card pair before this refresh (confirmed via git show against the base branch), which Task 8's "no existing equivalent anywhere" premise wrongly assumed didn't exist. The migration silently overwrote both bodies with placeholder text and wrapped the loss in a PLACEHOLDER COPY marker that would have hidden it from the future content pass. Restored both original strings verbatim (including their own pre-existing em dash) and narrowed the placeholder marker to bracket only the genuinely new third card. - Past-event rows on now.html used `opacity: .55` to convey "past", which composites every descendant colour toward the card surface. Measured against the real card background, 8 of 10 affected text/UI pairings fell to 2.33-3.75:1, well under the 4.5:1 floor, on a site whose owner has a stated vision impairment. Replaced with explicit token colours per element (each independently verified against its actual background) so muting is a colour choice, not an opacity side effect. Two Important findings: - Two new em dashes in the schedule content Simon supplied directly (family holidays, Montreal trip) violated the project's own no-em-dash constraint; reworded with a comma and a full stop. - now.html's cards sit in a bare .container, not .container.prose, so the underline non-colour cue for inline links never applied to the five links inside them (BHP, SAP SuccessFactors, ServiceNow, AHRI, Phronesis), leaving link-vs-text contrast below 3:1. Extended the underline rule to also cover .card-filled/.card-outlined body links, rather than wrapping the cards in .prose, which would have capped the whole now-grid to reading-column width. Three trivial minors fixed while in these files: the On-Midnight outlined-button border was 2.78:1 against the 3:1 non-text floor, raised to .62 alpha (3.20:1, verified); a fonts.css comment described Roboto/Roboto Flex directories that never existed in this repo; and an undefined --md-sys-color-outline-var typo was silently masked by its own fallback value. Remaining minor findings (dropped outbound vendor links on now.html's event rows, unused .btn-outlined, a raw 999px value, portfolio.html's retained legacy .section-marker versus index.html's newer .phi-rhythm device) are disclosed as known items in the Task 11 PR rather than fixed here, none are defects a user would notice.
.phi-break had margin: var(--space-14) 0, zero horizontal margin, so once its parent exceeded the bar's own 680px max-width (any desktop viewport, in the footer's 1200px-wide container and 404.html's hero-to-engage-cards divider), it sat flush against the container's left edge instead of centering. Changed to margin: var(--space-14) auto. No effect where .phi-break already sits inside an exactly 680px-wide .prose column (its own max-width leaves no space to redistribute there). Found via Simon's own report of a left-aligned footer divider on wide viewports. Also scopes the .card-filled/.card-outlined link-underline rule (added in 67cd92e for Important 4) to exclude .btn-filled/.btn- outlined/.cta-button descendants. The earlier re-review caught that the unscoped selector was giving the Now page's "Read all of Phronesis" filled button an unintended hairline underline, since its <a> also sits inside a <p> inside a .card-filled.
.footer-tagline and .footer-orient are <p> elements, and the global
p { text-align: left; } rule (components.css:80) applies directly to
them, which always wins over an inherited value from an ancestor
(.footer-band's text-align: center) regardless of specificity math,
since a rule targeting the element itself is never beaten by
inheritance. Set text-align: center directly on both classes.
Confirmed live in Chrome (localhost preview) at 1600px viewport
width, before and after: the phi-break divider fix (f273300) alone
was not sufficient, this second, distinct rule was the actual cause
of the tagline/link line still reading as left-aligned.
Fixes #76. simonives.md has YAML front matter, so without this file GitHub Pages' default Jekyll build treats it as a page and renders it to simonives.html instead of serving the raw .md file, leaving the literal /simonives.md path 404ing. This site is hand-authored static HTML/CSS with no Jekyll templating in use, so disabling Jekyll entirely is correct, not a workaround: every file is now served exactly as committed. Pre-dates the Material Design 3 refresh, not a regression from it, confirmed via git log.
Closes #78. The Material Design 3 refresh (#75) added the hamburger button and its is-active/no-scroll toggle JS but shipped no matching CSS: .menu-toggle was visible at every width and .nav-links never collapsed below 1024px, so on mobile the nav overflowed off the right edge of the viewport instead of hiding behind the hamburger. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…skip-link, and stale security docs Closes #81, #82, #83, #84, #86, #87. - Remove placeholder-copy markers from the homepage engage section (copy approved as final); no wording changes. - Update README: remove the defunct Web3Forms contact-form docs and Google Fonts references, correct the Pages and Stylesheets tables to match the actual current files. - Bump stale 2026-07-15 dates in sitemap.xml, llms.txt, and simonives.md to today. - Add a skip-to-content link (WCAG 2.4.1) to every page, with matching #main-content landmark ids and shared CSS. - Fix a stale CSS comment (scrollY > 8 to > 10, matching the actual JS threshold). - Remove the stale, simulated DPIA and IRAP assessment files from security_outputs/ (described an old Web3Forms/GA4 architecture that no longer exists); regenerated current versions tracked separately in a new issue. Issues #80 (Cloudflare Analytics beacon vs governance.html copy) and #85 (CSP/Referrer-Policy/frame headers) are Cloudflare dashboard configuration, not code changes, and remain open as manual follow-ups.
Closes #89. - Replaces the removed, stale security_outputs/*.md files (PR #88) with current versions reflecting the site's actual architecture as at 29 Sep 2026: no form, no analytics beacon, self-hosted fonts, CSP/Referrer-Policy/X-Frame-Options headers, TLS 1.2 minimum. - DPIA treats the Australian Privacy Act 1988 (Cth) as the primary governing framework (Simon resides and publishes from Australia), with GDPR and CCPA explicitly assessed as voluntary alignment rather than primary jurisdiction. - IRAP-aligned assessment scopes ISM control categories honestly to what applies to a static, serverless site, and documents the same-day TLS 1.0 to 1.2 remediation found during the assessment. - Adds security.txt (RFC 9116) at both /.well-known/security.txt (canonical) and /security.txt (courtesy copy for scanners), pointing to a dedicated security@simonives.com address kept separate from Simon's and Heather's primary Workspace mailboxes. Both documents are published to demonstrate practice, not as formal certifications, and say so explicitly.
… add Permissions-Policy Closes #91. - #81 (reopened): remove the placeholder-copy comment block from doctrine.html, portfolio.html, now.html, governance.html, and 404.html, missed in PR #88's original fix. Copy itself is unchanged, already reviewed and approved as final. - Add .github/workflows/check-no-placeholders.yml, fails CI if PLACEHOLDER or an internal docs/superpowers plan path appears in any published file. - #91: extract the mobile-nav and header-scroll/theme-toggle/reveal-on-scroll scripts (identical across all six pages bar whitespace) into a shared site.js, loaded with defer. Only the small theme-flash-prevention script stays inline, since it must run before first paint. - Add scripts/csp-hashes.sh, computes the sha256 CSP hash of the inline theme script across all pages and fails if any page's copy has drifted; scripts/csp-hashes.txt records the current hash. - Add .github/workflows/check-csp-hashes.yml, fails CI if the recorded hash is stale. - Document all Cloudflare edge security headers (CSP, Referrer-Policy, X-Frame-Options, Permissions-Policy, HSTS) in a new README.md section, so the repo stays the source of truth even though the config lives in Cloudflare (#92). The Cloudflare CSP's script-src still allows 'unsafe-inline' at this commit; it gets switched to the hash-only value in a follow-up once this PR is deployed (switching it before deploy would break the still-inline scripts on the currently-live site). Permissions-Policy has already been applied live, since it doesn't depend on this deploy.
…r favicon Closes #60. Closes #62. Closes #67. Closes #69. - Add scroll-behavior: smooth to the base html rule; the existing prefers-reduced-motion block already forces scroll-behavior: auto, so the accessibility override was already in place. - Preload the two Cormorant Garamond display weights actually used (500 for headings, 600 for the Phi mark) on every page, ahead of the fonts.css stylesheet link. - Add a "Machine-readable" footer link to /llms.txt next to the existing Information Governance link, per the issue's own suggested copy. - Replace the text-rendered Phi favicon with a genuine vector mark (favicon/phi-mark.svg, a line and an ellipse drawn from primitives, no font glyph involved), exported to 16x16 and 32x32 PNG fallbacks and a 180x180 apple-touch-icon with a solid Midnight background, since iOS handles transparency poorly on home-screen icons.
…o-top Closes #28. Closes #39. Closes #58. Closes #61. - Make .lead text fluid with clamp(16px, 1vw + 14px, 18px) instead of a static 18px, so it scales down gracefully on smaller viewports. - Nudge .phi-mark 1px to correct a slight baseline mismatch against the Inter wordmark in the header logo, caused by Cormorant Garamond's differing font metrics. - Extend the existing .pullquote treatment (already used once, on the Socratic practice card) to the Utilitarian and Polyrhythm practice cards on doctrine.html, with new one-line synthesis copy for each, reviewed and approved directly. - Add a back-to-top button to portfolio.html (the longest page), appearing after scrolling past 300px, an Aurum filled circle with an inline SVG arrow matching the site's existing icon-button pattern, scroll-to-top handled in site.js and respecting prefers-reduced-motion.
Google was pulling body copy into search results instead of the meta description. Rewrite it to be more specific and complete so it reads as a stronger candidate for the snippet. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Family holidays event has passed and is now styled and ordered with the other historical events. Added the upcoming Mount Isa work trip (9-30 October). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Test plan
🤖 Generated with Claude Code