Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .agent/architecture.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@
"dist/**",
"node_modules/**"
],
"digest": "7ae9bd6c7d1ea083b184aa8ca135b89ec4543b0ee5d21bf7535f7534af234759"
"digest": "4137d8bcbd0f88346d9213830c19603fc0a0d23ecbc20258252ea082073778f7"
},
"components": [
{
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="A standalone architecture map for the PersonalSite repository.">
<meta name="architecture-contract-sha256" content="7b8ffd7d89eb252ad5f30ae2c96ec425e04d4f7a611408d91467d80903f926c5">
<meta name="architecture-contract-sha256" content="65f6a5f7d043666fb35093dab8993a4c8f16832dabdac313cb9107b6253a6cde">
<title>PersonalSite architecture map</title>
<style>
:root {
Expand Down
8 changes: 3 additions & 5 deletions src/pages/about.astro
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const work = [
{
id: 'salesforce',
company: 'Salesforce',
summary: 'director of product, emerging technology. 2025 to present. enterprise ai adoption, 0 to 1: how large organizations actually absorb ai, and what makes it stick past the pilot.',
summary: 'director of product, emerging technology. 2025 to present. enterprise ai adoption, 0 to 1: how large organizations actually absorb ai, and what makes it stick after the first rollout.',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Refresh the architecture fingerprint after page edits

These src/pages edits are covered by .agent/architecture.json's source fingerprint, but the commit leaves its digest unchanged. Running python3 .agent/contribution_gate.py audit on this commit fails with a stale fingerprint (7ae9bd… declared versus 4137d8… computed), while the parent passes, so the repository's verification gate remains broken until the digest and synchronized docs/architecture.html marker are regenerated.

AGENTS.md reference: AGENTS.md:L78-L80

Useful? React with 👍 / 👎.

},
{
id: 'siriusxm',
Expand Down Expand Up @@ -50,12 +50,10 @@ const work = [
</dl>
</section>

<section class="mt-12" aria-labelledby="open-to-h">
<h2 id="open-to-h" class="label">open to</h2>
<section class="mt-12" aria-labelledby="conversation-h">
<h2 id="conversation-h" class="label">conversation</h2>
<ul class="list-plain mt-2">
<li>advisory roles at the right early-stage companies</li>
<li>conversations about ai, enterprise product, and how organizations actually change</li>
<li>selective consulting on ai product strategy</li>
</ul>
</section>

Expand Down
4 changes: 2 additions & 2 deletions src/pages/contact.astro
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import PageIntro from '../components/PageIntro.astro';
const returnUrl = new URL('/contact/?sent=1', Astro.site).href;
---

<Base title="Contact" description="get in touch with adrian lumley: product leader, builder, occasional advisor.">
<PageIntro title="contact" standfirst="product challenges, advisory, or just good conversation. it lands in my inbox." />
<Base title="Contact" description="get in touch with adrian lumley: product leader and builder.">
<PageIntro title="contact" standfirst="product challenges or just good conversation. it lands in my inbox." />

<p id="form-success" hidden class="measure mb-8" role="status">message sent, thanks for reaching out. i'll get back to you soon.</p>

Expand Down
9 changes: 9 additions & 0 deletions tests/contact.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
import { test, expect } from '@playwright/test';

test('contact page does not invite advisory work', async ({ page }) => {
await page.goto('/contact/');
await expect(page.locator('.page-standfirst')).toHaveText('product challenges or just good conversation. it lands in my inbox.');
await expect(page.locator('meta[name="description"]')).toHaveAttribute('content', /product leader and builder/);
const description = await page.locator('meta[name="description"]').getAttribute('content');
expect(description?.toLowerCase()).not.toMatch(/advis|consult/);
await expect(page.locator('main')).not.toContainText(/advis|consult/i);
});

test('contact form is present with all fields', async ({ page }) => {
await page.goto('/contact');

Expand Down
2 changes: 1 addition & 1 deletion tests/e2e/site-basics.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ test('nav: header shows the home wordmark + canonical primary tabs', async ({ pa
});

test('scrubbed pages are gone, not redirected', async ({ page }) => {
for (const path of ['/360/', '/joytap-privacy/', '/writing/joytap-one-sprint/', '/lab/iron-log/', '/lab/night-train/', '/signal-room/', '/signal-room/night-shift/']) {
for (const path of ['/360/', '/joytap-privacy/', '/writing/joytap-one-sprint/', '/lab/iron-log/', '/lab/night-train/', '/signal-room/', '/signal-room/night-shift/', '/past-the-pilot/', '/past-the-pilot/thanks/']) {
const response = await page.goto(path);
expect(response?.status(), path).toBe(404);
}
Expand Down
3 changes: 3 additions & 0 deletions tests/work.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ test('about page carries the work record, one row per role', async ({ page }) =>
await expect(work.getByText(company, { exact: true })).toBeVisible();
}
await expect(work.getByText(/18% more daily sessions/)).toBeVisible();
await expect(work.getByText(/what makes it stick after the first rollout/)).toBeVisible();
await expect(page.getByRole('heading', { name: 'open to' })).toHaveCount(0);
await expect(page.locator('main')).not.toContainText(/advisory|consulting|past the pilot/i);
});

test('/work/#<company> keeps its anchor on the about page', async ({ page }) => {
Expand Down
38 changes: 38 additions & 0 deletions unpublished/past-the-pilot/index.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
// Held off the public site until outside work is approved.
// Not a route: Astro only publishes files under src/pages.
// To restore, move this file to src/pages/past-the-pilot.astro and point the
// imports at ../layouts/Base.astro and ../components/PageIntro.astro.
import Base from '../../src/layouts/Base.astro';
import PageIntro from '../../src/components/PageIntro.astro';
---

<Base title="Past the Pilot" description="Async written audit of one AI feature that is live but not earning: kill, fix, or ship-next. $1,500. No discovery call.">
<PageIntro title="past the pilot" standfirst="one AI feature that is live but not earning. in writing: kill, fix, or ship-next, with a ranked list you can act on." />

<section class="measure">
<p class="label">$1,500 · async · ≤7 days · no discovery call</p>
<ul class="list-plain mt-4">
<li>short written memo (not a slide deck)</li>
<li>ranked kill / fix / ship-next list</li>
<li>what evidence would change the call</li>
<li>one recommended next move</li>
</ul>
<p class="mt-4">
personal product advisory from someone who has lived enterprise AI past the pilot.
not a Salesforce offering. not a coaching call.
</p>
<p class="links mt-6">
<a href="https://buy.stripe.com/28E3cx3VG6TwaMl10o6Zy01">buy past the pilot</a>
</p>
</section>

<section class="measure mt-12">
<p class="label">how it works</p>
<ol class="list-plain mt-4">
<li>pay $1,500 on Stripe.</li>
<li>send URL + Loom/docs: what is live, who the user is, what earning was supposed to mean.</li>
<li>within 7 days you get the memo + ranked list. no Zoom required.</li>
</ol>
</section>
</Base>
15 changes: 15 additions & 0 deletions unpublished/past-the-pilot/thanks.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
// Held off the public site until outside work is approved.
// Not a route: Astro only publishes files under src/pages.
// To restore, move this file to src/pages/past-the-pilot/thanks.astro and point
// the imports at ../../layouts/Base.astro and ../../components/PageIntro.astro.
import Base from '../../src/layouts/Base.astro';
import PageIntro from '../../src/components/PageIntro.astro';
---

<Base title="you're in" description="Past the Pilot payment received. Send your materials for the async audit.">
<PageIntro title="paid. you're in." standfirst="send URL + Loom/docs: what is live, who the user is, what earning was supposed to mean, and anything already measured." />

<p class="measure">turnaround: ≤7 days async. no Zoom required.</p>
<p class="links measure mt-6"><a href="/contact/">send materials via contact</a></p>
</Base>
Loading