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
2 changes: 2 additions & 0 deletions .Jules/apex.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@ Prefer visitor-facing craft on live surfaces (Home, Work, Biography, Contact, an
## 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.

## 2026-05-28 - Decision Frameworks | Signal: Product Leadership "Decision Frameworks" trend | Lean Implementation: Flagged experimental route, static array, uses Hero primitive & LinkedIn CTA, ~40 lines total delta.
1 change: 1 addition & 0 deletions src/content.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export const collections = {
enable_product_manifesto: z.boolean().default(false),
enable_skills_pulse_v1: z.boolean().default(false),
enable_reading_list: z.boolean().default(false),
enable_decision_frameworks: z.boolean().default(false),
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),
Expand Down
1 change: 1 addition & 0 deletions src/content/flags/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"enable_product_manifesto": true,
"enable_skills_pulse_v1": true,
"enable_reading_list": true,
"enable_decision_frameworks": true,
"enable_logo_wobble_v1": true,
"enable_cta_tactile_v1": true,
"enable_theme_toggle_tactile_v1": true
Expand Down
117 changes: 117 additions & 0 deletions src/pages/experimental/frameworks.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
---
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_decision_frameworks) return Astro.redirect('/404/');

const linkedinHref = 'https://www.linkedin.com/in/alehar/';

const frameworks = [
{
title: 'Jobs to be Done',
summary: 'Focus on the underlying outcome a developer hires a tool or platform to achieve.',
},
{
title: 'Hypothesis-Driven Development',
summary: 'Frame feature initiatives as measurable hypotheses to validate value early.',
},
{
title: 'Developer Friction Mapping',
summary: 'Identify cognitive overhead and workflow bottlenecks across the inner dev loop.',
},
];
---
Comment on lines +16 to +26

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Card summaries read like a glossary, not like you. Reading-list cards say what the book is for; these say what the framework is.

Suggested:

{
  title: 'Jobs to be Done',
  summary: 'What outcome is a developer hiring this tool to get done? Start there, not with features.',
},
{
  title: 'Hypothesis-Driven Development',
  summary: 'Write the bet before the build: what we think will change, how we will know, and what we kill if it does not.',
},
{
  title: 'Developer Friction Mapping',
  summary: 'Walk the inner loop and name the drag: waits, context switches, and steps that only exist because the tools do not talk.',
},


<BaseLayout
title="Decision Frameworks | Product Manager, Developer Experience at IFS"
description="Product decision frameworks for DevEx, design systems, and product leadership."
robots="noindex"
>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Meta description claims "design systems" and "product leadership" but the page only has three DevEx cards. Thin proof.

Suggested:

description="Product Manager, Developer Experience at IFS. How I frame DevEx bets before we build."

<main id="main-content" class="wrapper stack gap-8">
<Hero title="Decision Frameworks" align="start">
<p class="lede">
Core frameworks for evaluating DevEx initiatives and aligning engineering outcomes.
</p>
</Hero>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Lede is brochure-speak ("evaluating DevEx initiatives and aligning engineering outcomes"). Same hold class as #872/#858.

Suggested:

How I decide what DevEx work is worth doing: the outcome someone is hiring for, a testable bet, and where friction actually sits in the loop.

<div class="grid">
{
frameworks.map(({ title, summary }) => (
<div class="card">
<strong>{title}</strong>
<p>{summary}</p>
</div>
))
}
</div>
<div class="actions">
<CallToAction
href={linkedinHref}
target="_blank"
rel="noopener noreferrer"
data-hire-event="hire_cta_click"
data-hire-surface="frameworks"
>
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;
margin-top: 0.5rem;
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);
font-weight: 400;
}

@media (min-width: 50em) {
.actions {
padding-bottom: 0;
padding-right: 0;
}
}
</style>
Loading