Skip to content
Closed
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
25 changes: 1 addition & 24 deletions .Jules/apex.md
Original file line number Diff line number Diff line change
@@ -1,24 +1 @@
# HARD ABORT — farmed experimental stack/uses pages

Read this before scouting. If the idea is one of these, ABORT the cycle. Do not downscope into a sibling route with the same job. Do not open a PR.

Do NOT recreate:

- `/experimental/dx-stack`
- `/experimental/uses`
- `/experimental/stack`
- any noindex experimental stack/uses page

Already closed as farm: #768, #732, #718, #702.

Prefer visitor-facing craft on live surfaces (Home, Work, Biography, Contact, and other shipped pages). Hire path is LinkedIn only. Do not invent a public email or CV.

---

## 2026-08-29 - Farm abort | Signal: closed #768/#732/#718/#702 | Lean Implementation: HARD ABORT dx-stack/uses/stack experimental routes; prefer live visitor surfaces

## 2026-05-25 - Strategic Pulse | Signal: "/now" page trend | Lean Implementation: Flagged experimental route, < 50 lines total delta.

## 2026-05-26 - Product Manifesto | Signal: Product Leadership "Guiding Principles" trend | Lean Implementation: Isolated experimental route, uses Hero/Icon primitives, ~45 lines delta.

## 2026-05-27 - Strategic Reading List | Signal: Portfolio "Bookshelf" trend | Lean Implementation: Isolated experimental route, static data array, uses Hero/Pill/Icon primitives, ~48 lines delta.
## 2025-05-18 - [Working With Me / User Manual MVP] | Signal: [Leadership UX / DX Guide] | Lean Implementation: [Isolated experimental route + flag + 3 principle cards + LinkedIn CTA]
10 changes: 7 additions & 3 deletions src/__tests__/content.config.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, it, expect } from 'vitest';
import { z } from './mocks/astro-zod';
import { glob } from 'astro/loaders';
import { defineCollection } from 'astro:content';
import { defineCollection, type SchemaContext } from 'astro:content';
import { collections } from '../content.config';
import flagsFixture from '../content/flags/config.json';

Expand All @@ -28,7 +28,9 @@ describe('content.config', () => {
});

it('validates flags fixture against schema', async () => {
const { schema } = collections.flags;
const rawSchema = collections.flags.schema;
const mockContext = { image: () => z.string() } as unknown as SchemaContext;
const schema = typeof rawSchema === 'function' ? rawSchema(mockContext) : rawSchema;
const result = schema.safeParse(flagsFixture);
expect(result.success).toBe(true);

Expand All @@ -40,7 +42,9 @@ describe('content.config', () => {
});

it('validates work schema with sample data', () => {
const { schema } = collections.work;
const rawSchema = collections.work.schema;
const mockContext = { image: () => z.string() } as unknown as SchemaContext;
const schema = typeof rawSchema === 'function' ? rawSchema(mockContext) : rawSchema;
const sampleWork = {
title: 'Sample Work',
description: 'A sample description',
Expand Down
1 change: 1 addition & 0 deletions src/content.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export const collections = {
enable_logo_wobble_v1: z.boolean().default(false),
enable_cta_tactile_v1: z.boolean().default(false),
enable_theme_toggle_tactile_v1: z.boolean().default(false),
enable_user_manual: z.boolean().default(false),
}),
}),
};
3 changes: 2 additions & 1 deletion src/content/flags/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
"enable_reading_list": true,
"enable_logo_wobble_v1": true,
"enable_cta_tactile_v1": true,
"enable_theme_toggle_tactile_v1": true
"enable_theme_toggle_tactile_v1": true,
"enable_user_manual": true
}
102 changes: 102 additions & 0 deletions src/pages/experimental/user-manual.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
---
import CallToAction from '../../components/CallToAction.astro';
import Hero from '../../components/Hero.astro';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getEntry } from 'astro:content';

const flagsEntry = await getEntry('flags', 'config');
if (!flagsEntry?.data.enable_user_manual) return Astro.redirect('/404/');

const items = [
{
t: 'Async-first clarity',
s: 'Write specs upfront. Clear written decisions scale faster than meetings.',
},
{ t: 'Empirical feedback', s: 'Short feedback loops with real telemetry beat opinions.' },
{
t: 'Autonomy & ownership',
s: 'Clear guardrails, outcome goals, and radical trust drive dependable shipping.',
},
];
---

<BaseLayout
title="Working with me | Product Manager, Developer Experience at IFS"
description="Product Manager, Developer Experience at IFS. Operating principles guide."
robots="noindex"
>
<main id="main-content" class="wrapper stack gap-10">
<Hero title="Working with me" align="start">
<p class="lede">
Product Manager, Developer Experience at IFS. A lightweight guide to how I collaborate and
make decisions.
</p>
</Hero>
<div class="grid">
{
items.map(({ t, s }) => (
<div class="card">
<>
<strong>{t}</strong>
<p>{s}</p>
</>
</div>
))
}
</div>
<div class="actions">
<CallToAction
href="https://www.linkedin.com/in/alehar/"
target="_blank"
rel="noopener noreferrer">Get in touch</CallToAction
>
<p class="cta-hint">LinkedIn · replies from me</p>
</div>
</main>
</BaseLayout>

<style>
.lede {
margin: 0;
color: var(--gray-200);
max-width: 46ch;
}
.grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
.card {
padding: 1rem;
border: 1px solid var(--gray-800);
border-radius: 0.5rem;
background: var(--gradient-subtle);
}
.card strong {
display: block;
color: var(--gray-0);
}
.card p {
margin: 0.35rem 0 0;
color: var(--gray-300);
}
.actions {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.4rem;
padding-bottom: var(--chat-fab-clearance);
padding-right: var(--chat-fab-clearance);
}
.cta-hint {
margin: 0;
font-size: var(--text-sm);
color: var(--gray-300);
}
@media (min-width: 50em) {
.actions {
padding-bottom: 0;
padding-right: 0;
}
}
</style>
Loading