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
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
- name: Static checks
run: |
uv run --frozen ruff check .
uv run --frozen mypy meta_importer/ai meta_importer/clock.py meta_importer/review_policy.py meta_importer/fix_lab.py meta_importer/portfolio_page.py meta_importer/portfolio_v20.py
uv run --frozen mypy meta_importer/ai meta_importer/clock.py meta_importer/review_policy.py meta_importer/fix_lab.py meta_importer/product_page.py meta_importer/product_landing_v21.py
- name: Tests and branch coverage
run: |
uv run --frozen coverage run -m unittest discover -s tests -q
Expand Down Expand Up @@ -70,7 +70,7 @@ jobs:
uv run --frozen python evals/brief_mapping/build_dataset.py
uv run --frozen python scripts/rebuild_ai_evidence.py
uv run --frozen python scripts/rebuild_fix_lab.py
uv run --frozen python scripts/rebuild_portfolio_page.py
uv run --frozen python scripts/rebuild_product_page.py
- name: Rehearse v1 launch workspace
run: uv run --frozen creative-launch plan fixtures/fake_agency_creatives/manifest.csv --out runs/fake_agency_creatives/launch_plan.json --review runs/fake_agency_creatives/review_packet.md --html runs/fake_agency_creatives/workspace.html --html-audit runs/fake_agency_creatives/workspace_audit.json --state runs/fake_agency_creatives/review_state.json --platform-preview runs/fake_agency_creatives/platform_preview.json --store-dir runs/fake_agency_creatives/store
- name: Rehearse v2 launch workspace
Expand Down
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 2.1.0 — 2026-07-15

- Promoted the complete product narrative to the canonical homepage and removed the legacy secondary route instead of redirecting it.
- Reframed every public section as a SaaS product story: problem, review workflow, controls, evidence, pilot and one compact builder block.
- Replaced the warm editorial palette with a cold-neutral Geist system and one accessible coral action color, while reserving green, amber and red for status.
- Applied compact shadcn-style controls, pointer-gated states, tactile press feedback and explicit reduced-motion, reduced-transparency and increased-contrast behavior.
- Renamed active landing generators, tests and evidence from portfolio terminology to product terminology.

## 2.0.0 — 2026-07-15

- Rebuilt the public entry as one product landing: pre-launch outcome first, a real interactive workspace in the first viewport, concrete checks, a focused review loop and one closing builder block.
Expand Down
6 changes: 3 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@ Before opening a pull request:
```bash
pip install -e '.[dev]'
ruff check .
mypy meta_importer/ai meta_importer/clock.py meta_importer/review_policy.py meta_importer/fix_lab.py meta_importer/portfolio_page.py
mypy meta_importer/ai meta_importer/clock.py meta_importer/review_policy.py meta_importer/fix_lab.py meta_importer/product_page.py
coverage run -m unittest discover -s tests -q
coverage report
npm ci
npm run qa:frontend
```

If a change affects generated fixtures, the brief benchmark, AI evidence, portfolio entry, Fix & Revalidate Lab, or the static workspace, run the corresponding generator and commit the updated artifact:
If a change affects generated fixtures, the brief benchmark, AI evidence, product entry, Fix & Revalidate Lab, or the static workspace, run the corresponding generator and commit the updated artifact:

```bash
python scripts/rebuild_ai_evidence.py
python scripts/rebuild_fix_lab.py
python scripts/rebuild_portfolio_page.py
python scripts/rebuild_product_page.py
creative-launch plan fixtures/fake_agency_creatives/manifest_v2.csv --html docs/workspace.html
```

Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[![CI](https://github.com/mattyu-dev/creative-launch-workspace/actions/workflows/ci.yml/badge.svg)](https://github.com/mattyu-dev/creative-launch-workspace/actions/workflows/ci.yml)
[![CodeQL](https://github.com/mattyu-dev/creative-launch-workspace/actions/workflows/codeql.yml/badge.svg)](https://github.com/mattyu-dev/creative-launch-workspace/actions/workflows/codeql.yml)
[![Live demo](https://img.shields.io/badge/live_demo-open_product-b83b1f)](https://mattyu-dev.github.io/creative-launch-workspace/)
[![Live demo](https://img.shields.io/badge/live_demo-open_product-c83b24)](https://mattyu-dev.github.io/creative-launch-workspace/)
[![License: MIT](https://img.shields.io/badge/license-MIT-f4ead4)](LICENSE)

Catch approval, mapping, destination and placement errors before a large Meta creative launch reaches Ads Manager.
Expand All @@ -17,7 +17,7 @@ Deterministic rules check each AI proposal before a person decides an ambiguous

[![Creative Launch Workspace desktop](docs/assets/workspace-desktop.png)](https://mattyu-dev.github.io/creative-launch-workspace/workspace.html)

The public landing and interactive workspace share one warm operational system: an ivory `#f4f1ea` canvas, ink typography and a single ember `#b83b1f` action color. Success, warning and blocked colors remain reserved for status, while the product and its proof now live on one canonical page.
The public landing and interactive workspace share one cold-neutral product system: a `#f6f7f5` canvas, Geist-first typography with a system fallback, and one accessible coral `#c83b24` action color. On a slow first load, `font-display: optional` keeps the fallback instead of causing FOIT, layout shift or a late text repaint. Success, warning and blocked colors remain reserved for status, while the product and its proof live on one canonical page.

[![Guided human review with local audit evidence](docs/assets/guided-review-step-3.png)](https://mattyu-dev.github.io/creative-launch-workspace/workspace.html?guided=1)

Expand Down Expand Up @@ -171,17 +171,17 @@ The repo-native benchmark contains 36 labelled contract cases for the determinis

Browser QA exercises seven viewport widths plus dedicated 320×568 guided-decision and product-landing contracts. The small-phone gates require a named home link, logical keyboard order, 44-pixel standalone targets and an above-the-fold primary CTA. QA also doubles rendered landing text at 320 and 768 pixels to reject clipped or horizontally overflowing content. The committed workspace and landing Lighthouse accessibility reports score 100/100 on desktop and mobile, while a separate gate fails any serious or critical WCAG audit even if the category score rounds to 100.

The same QA run completes the guided 1→2→3 decision path, verifies that it creates only browser-local state and audit evidence, confirms the next pending ambiguous case survives reload, and enforces landing Lighthouse budgets of at least 90 performance, 95 best practices and 95 SEO, with LCP 2.5 s, CLS 0.1 and total blocking time 200 ms. These are reproducible local Lighthouse measurements, not production RUM.
The same QA run completes the guided 1→2→3 decision path, verifies that it creates only browser-local state and audit evidence, and confirms the next pending ambiguous case survives reload. The landing targets at least 90 Lighthouse performance, with an explicit CI variance floor of 89 only while best practices and SEO remain at least 95, LCP stays at or below 2.5 s, CLS at or below 0.1 and total blocking time at or below 200 ms. These are reproducible local Lighthouse measurements, not production RUM.

- [Brief baseline eval](docs/evidence/brief-mapping-baseline-eval.json)
- [Reviewed manifest validation](docs/evidence/reviewed-manifest-validation.json)
- [Runtime browser QA](docs/evidence/workspace-runtime-qa.json)
- [Desktop accessibility](docs/evidence/workspace-lighthouse-accessibility-desktop.json)
- [Mobile accessibility](docs/evidence/workspace-lighthouse-accessibility-mobile.json)
- [Portfolio desktop accessibility](docs/evidence/portfolio-lighthouse-accessibility-desktop.json)
- [Portfolio mobile accessibility](docs/evidence/portfolio-lighthouse-accessibility-mobile.json)
- [Portfolio desktop quality budget](docs/evidence/portfolio-lighthouse-quality-desktop.json)
- [Portfolio mobile quality budget](docs/evidence/portfolio-lighthouse-quality-mobile.json)
- [Product desktop accessibility](docs/evidence/product-lighthouse-accessibility-desktop.json)
- [Product mobile accessibility](docs/evidence/product-lighthouse-accessibility-mobile.json)
- [Product desktop quality budget](docs/evidence/product-lighthouse-quality-desktop.json)
- [Product mobile quality budget](docs/evidence/product-lighthouse-quality-mobile.json)

## Engineering choices

Expand Down
5 changes: 3 additions & 2 deletions docs/404.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="light">
<meta name="theme-color" content="#f4f1ea">
<meta name="theme-color" content="#f6f7f5">
<meta name="robots" content="noindex">
<meta name="author" content="Mathieu Petroni">
<link rel="icon" href="https://mattyu-dev.github.io/creative-launch-workspace/assets/favicon.svg" type="image/svg+xml">
<link rel="preload" href="https://mattyu-dev.github.io/creative-launch-workspace/assets/geist-latin-variable.woff2" as="font" type="font/woff2" crossorigin>
<title>Page not found · Mathieu Petroni</title>
<style>
:root{color-scheme:light;--background:#f4f1ea;--foreground:#1d1f1c;--card:#fffdf8;--secondary:#454943;--muted:#666b64;--primary:#b83b1f;--primary-hover:#972d18;--primary-foreground:#fff;--border:#d7d8d2;--ring:#b83b1f}*{box-sizing:border-box}body{min-height:100vh;display:grid;place-items:center;margin:0;padding:24px;color:var(--foreground);background:var(--background);font:400 16px/1.5 "Avenir Next",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}main{width:min(720px,100%);padding:42px;border:1px solid var(--border);border-radius:14px;background:var(--card)}.eyebrow{color:var(--primary);font-size:13px;font-weight:700;letter-spacing:.03em}h1{margin:14px 0 16px;font-size:clamp(42px,8vw,68px);font-weight:680;line-height:1;letter-spacing:-.05em}p{max-width:600px;color:var(--secondary)}.links{display:flex;flex-wrap:wrap;gap:10px 18px;margin-top:26px}a{min-height:44px;display:inline-flex;align-items:center;color:var(--secondary);font-weight:650;text-underline-offset:4px}a:first-child{padding:9px 14px;border-radius:10px;color:var(--primary-foreground);background:var(--primary);text-decoration:none}a:first-child:hover{background:var(--primary-hover)}a:focus-visible{outline:2px solid var(--ring);outline-offset:3px}@media(max-width:520px){main{padding:30px 20px}.links{align-items:stretch;flex-direction:column}.links a{width:100%}}
@font-face{font-family:"Geist";src:url("https://mattyu-dev.github.io/creative-launch-workspace/assets/geist-latin-variable.woff2") format("woff2");font-weight:100 900;font-display:swap}:root{color-scheme:light;--background:#f6f7f5;--foreground:#151817;--card:#fff;--secondary:#3e4541;--muted:#636b66;--primary:#c83b24;--primary-hover:#ae311d;--primary-pressed:#8d2414;--primary-foreground:#fff;--border:#d8ddd9;--ring:#c83b24}*{box-sizing:border-box}body{min-height:100vh;display:grid;place-items:center;margin:0;padding:24px;color:var(--foreground);background:var(--background);font:400 16px/1.5 "Geist",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}main{width:min(720px,100%);padding:42px;border:1px solid var(--border);border-radius:14px;background:var(--card)}.eyebrow{color:var(--primary);font-size:13px;font-weight:700;letter-spacing:.03em}h1{margin:14px 0 16px;font-size:clamp(42px,8vw,68px);font-weight:680;line-height:1;letter-spacing:-.05em}p{max-width:600px;color:var(--secondary)}.links{display:flex;flex-wrap:wrap;gap:10px 18px;margin-top:26px}a{min-height:44px;display:inline-flex;align-items:center;color:var(--secondary);font-weight:650;text-underline-offset:4px;transition:transform 130ms cubic-bezier(.23,1,.32,1),background-color 160ms ease}a:first-child{padding:9px 14px;border-radius:8px;color:var(--primary-foreground);background:var(--primary);text-decoration:none}a:first-child:hover{background:var(--primary-hover)}a:first-child:active{transform:scale(.97);background:var(--primary-pressed)}a:focus-visible{outline:2px solid var(--ring);outline-offset:3px}@media(max-width:520px){main{padding:30px 20px}.links{align-items:stretch;flex-direction:column}.links a{width:100%}}@media(prefers-reduced-motion:reduce){a{transition:none}a:first-child:active{transform:none}}
</style>
</head>
<body><main><div class="eyebrow">404 · Creative Launch Workspace</div><h1>This route does not exist.</h1><p>Return to the product, review the sample workspace or inspect the source.</p><div class="links"><a href="https://mattyu-dev.github.io/creative-launch-workspace/">Back to the product</a><a href="https://mattyu-dev.github.io/creative-launch-workspace/workspace.html?guided=1">Review a sample batch</a><a href="https://github.com/mattyu-dev/creative-launch-workspace">Open the source</a><a href="https://www.linkedin.com/in/mathieu-petroni/" rel="me external">Contact Mathieu</a></div></main></body>
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture/system.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ The static GitHub Pages workspace and the SQLite adapter are deliberately separa

## Public proof surfaces

- `index.html`: business- and recruiter-facing case study with a product-first hero, trust-boundary diagram, ownership, production path, reproducible fixture evidence and explicit limits.
- `index.html`: canonical SaaS product entry with a product-first hero, real workspace captures, governed review controls, reproducible fixture evidence and explicit limits.
- `workspace.html`: interactive 100-row operator queue using guarded browser-local state, plus an ephemeral three-step guide that reuses the same decision and audit functions.
- `fix-lab.html`: correction/revalidation rehearsal over committed Python golden scenarios.
- `brief-evidence.html`: deterministic intake evidence, human decisions and fail-closed behaviors.
Expand Down
Binary file modified docs/assets/brief-evidence.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/assets/case-study-desktop.png
Binary file not shown.
Binary file removed docs/assets/case-study-mobile.png
Binary file not shown.
Binary file modified docs/assets/fix-lab.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/geist-latin-variable.woff2
Binary file not shown.
Binary file added docs/assets/geist-mono-latin-variable.woff2
Binary file not shown.
Binary file modified docs/assets/guided-receipt-mobile.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guided-receipt-mobile.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guided-review-mobile-step-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guided-review-mobile-step-3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guided-review-step-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guided-review-step-3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/assets/portfolio-desktop.png
Binary file not shown.
Binary file removed docs/assets/portfolio-mobile.png
Binary file not shown.
Binary file added docs/assets/product-desktop.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/product-mobile.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed docs/assets/social-card-v2-0.png
Binary file not shown.
Binary file added docs/assets/social-card-v2-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/social-card.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/workspace-desktop.avif
Binary file not shown.
Binary file modified docs/assets/workspace-desktop.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/workspace-desktop.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/workspace-mobile-detail.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/workspace-mobile-hero.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/workspace-mobile-hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/workspace-mobile.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/workspace-mobile.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions docs/brief-evidence.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
<meta property="article:author" content="https://www.linkedin.com/in/mathieu-petroni/">
<meta property="og:title" content="Governed intake evidence · Mathieu Petroni">
<meta property="og:description" content="Source evidence, bounded proposals, policy checks and explicit human decisions.">
<meta property="og:image" content="https://mattyu-dev.github.io/creative-launch-workspace/assets/social-card-v2-0.png">
<meta property="og:image" content="https://mattyu-dev.github.io/creative-launch-workspace/assets/social-card-v2-1.png">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
<title>Brief mapping evidence · Mathieu Petroni</title>
<style>
:root { --ink:#1d1f1c; --body:#454943; --muted:#666b64; --canvas:#f4f1ea; --paper:#fffdf8; --line:#d7d8d2; --brand:#b83b1f; --brand-soft:#f4dcd4; --success:#176143; --success-soft:#e3eee8; }
:root { --ink:#151817; --body:#3e4541; --muted:#636b66; --canvas:#f6f7f5; --paper:#ffffff; --line:#d8ddd9; --brand:#c83b24; --brand-soft:#fbe8e2; --success:#176143; --success-soft:#e3eee8; }
* { box-sizing:border-box; }
body { margin:0; color:var(--ink); background:var(--canvas); font:400 15px/1.5 Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; }
header { padding:14px max(20px,calc((100vw - 1180px)/2)); border-bottom:1px solid var(--line); background:var(--paper); }
Expand Down
15 changes: 0 additions & 15 deletions docs/case-study.html

This file was deleted.

Loading