Director lessons. 2026-04-30
These lines are designed to be injected into the next Director PROMPT_EOF
template. They encode what was learned during the first day of operation.
For inclusion under "Rules" in the Director prompt
- Look at the last 4 decisions in the recent-director-decisions context.
If 3 or 4 of them share a decision letter, you are FORBIDDEN from
picking that letter this tick. Diversify across A-H.
- The state context tells you the time elapsed in minutes. Use it. If
ELAPSED_MIN is over 360 of an 8h window, prefer light cheap actions
(E append_to_changelog, G cross-page improvements, H marketing
collateral) over heavy ones (A new page, C new MVP shell). Heavy
actions will not finish before the loop runs out of budget.
- Decisions A "write a missing micro-site page" and B "polish an
existing artifact" have strictly higher quality leverage than F
"sub-page expansion" once the micro-site is up. The first run
picked F four ticks in a row. If F is your impulse, ask: is there
a polish demand from a critic round I have not yet shipped? That
is decision B.
- The canonical filesystem path for shipped artifacts is
/srv/sites/factory/ (Caddy serves from here). Do NOT write to
/home/ubuntu/factory/builds/ or /home/ubuntu/factory/sc-insights/.
Those are legacy paths.
- If you are about to call critic round 3 or later on the same
artifact with the same Claude model and the same prompt, stop.
Round 3 should be a Foreman pass (corpus-comparative). Round 4
should be a Codex pass (cross-LLM perspective). Pure Claude
rounds 3+ have diminishing returns; we measured this on the
/factory/ elevation session.
For inclusion under "Action menu" in the Director prompt
Add to the menu (not yet in PROMPT_EOF):
I. spawn_foreman_pass: invoke /home/ubuntu/factory/director/foreman.sh
<target_url> <local_file_path>. Returns demands rooted in Wes's
12-site reference corpus. Use after a build has shipped at least
one critic round but before round 3.
J. verify_links: scan a directory for href values, check each returns
200, append a report. Critic round 1 caught href="#" placeholders
that no agent has yet fixed.
K. embed_real_screenshot: write to a build's hero a real screenshot
from a captured artifact (the 7am brief email body, the admin
dashboard mock). Multiple critic rounds demanded this and it was
never shipped.
For inclusion under "Cadence"
Replace 30-minute fixed cadence with adaptive:
TICK_DURATION = end - start
SLEEP = max(120, 900 - TICK_DURATION)
This caps inter-tick sleep at 15 min, floors at 2 min. Roughly
doubles ticks per 8h window.
Lesson added 2026-05-01: per-product brand identity
When picking action C (new MVP shell) or action B (polish an existing build),
each product must have its OWN visual identity, not the studio template.
Specifically:
- Do NOT default to Fraunces+Inter, forest/gold/cream palette, or any other
reusable studio look. That makes products feel like sub-pages of one
website rather than independent businesses. Wes flagged this on day 1
and we de-tentacled AfterHours and Tideline as the experiment.
- For each new product, generate a distinct palette (3 specific hex
codes), a Google Fonts typography pairing chosen for the audience
(slab-serif Bitter for service businesses, Space Grotesk for SaaS
founders, Plus Jakarta Sans for friendly tech, etc.), and a one-line
voice description.
- Save the brand brief to /home/ubuntu/factory/director/brands/<slug>-brand.md
before writing the index.html. Read it back when the next polish action
fires on the same slug.
- Strip the studio chrome from the product page. The nav must NOT show
Factory / Builds / About / How-it-works / Methodology - those are studio
concepts, not customer concepts. Use product-only nav (Pricing, FAQ,
Case Studies, Get Started, etc.).
- A small footer credit ("Built by Wishdeal Studio") with link to /factory/about/
is acceptable. Nothing more visible than that.
- The URL stays /factory/<slug>/. Wes does not want subdomains.
- See /srv/sites/factory/afterhours/ and /srv/sites/factory/builds/feedback-widget/
as concrete examples of "de-tentacled" products. See lawfirm-ai, repo-scanner,
solo-analytics for the studio-branded control group still pending rebrand.
Lesson added 2026-05-01: category diversity (not just action diversity)
The breadth gate forces action C every 3 ticks, which works for action variety.
But on day 2 it produced 9 MVPs in a row that were all "AI tool for freelancers"
(brief-ai, contract-ai, estimate-ai, handoff-ai, intake-ai, invoice-ai, proposal-ai,
retainer-ai, scope-ai). Cross-product cannibalization is real: Brief AI and Proposal
AI are essentially the same product. We diversified action letters but not concept
categories.
When picking action C, before committing to a slug:
1. Look at the existing /srv/sites/factory/builds/ directory. List the slugs.
2. Categorize them by thematic root: e.g. "freelancer AI tools", "service business AI",
"SaaS dev tools", "legal AI", "analytics".
3. If 3+ existing slugs share a thematic root, the next C action MUST pick a runner-up
from a DIFFERENT category. If no different-category runner-up is in the picks file,
trigger action J (mine fresh ideas) instead, or pick a deeper expansion of an
existing strong product (action F or H) on a non-saturated slug.
4. Save a one-line note in the brand brief about which thematic root this product
belongs to so future ticks can avoid the cluster.
Concept diversity matters more than action diversity. A studio with 9 freelancer-AI
products and 0 other categories is a category bet, not a portfolio.
Lesson added 2026-05-03: archived paths are intentional, not missing
When the Director scans the filesystem and notices that /factory/about/ or
/factory/methodology/ or /factory/how-it-works/ does NOT exist as a directory
under /srv/sites/factory/, do NOT treat that as "missing micro-site page" and
rebuild it via action A. These paths were INTENTIONALLY archived to
/srv/sites/factory/_archive/ on day 2 because they were studio narcissism
(meta-pages about the studio that customers do not care about).
The studio site is now intentionally minimal: only /factory/, /factory/builds/,
/factory/log/, /factory/concepts/, /factory/calibrate/ are first-class.
Everything else under /factory/ that is missing is missing on purpose.
If you are tempted to rebuild a meta-page about the studio, instead pick action
B (polish an existing artifact), F (sub-page on an existing product), or K/L/M
(marketing collateral on an existing product). The studio meta-pages are
permanently archived; do not regenerate them.
Lesson 2026-05-03: ratings inform priority
Wes maintains ratings at /home/ubuntu/factory/director/ratings.json. Tiers:
pursue, curious, shelf, not-for-me. When picking action B (polish),
F (sub-page), K/L/M (collateral), strongly prefer Pursue and Curious
products. Avoid spending ticks on Not-for-me products unless every
other product is fully developed. Shelf products get baseline polish
only (no new sub-pages, no new collateral). Never delete or archive a
product based on rating; ratings are organizational, not destructive.
The state context surfaces a TIER_VIEW block that lists every product
slug with its current tier. Use it. Wes's calibrate page lives at
https://wishdeal.com/factory/calibrate/ and writes to ratings.json via
POST /factory/api/rate. The gallery at /factory/builds/ now sorts
Pursue first, then Curious, then unrated, then Shelf, then Not-for-me,
and shows a colored tier chip on each card.
Lesson queued 2026-05-03: cross-product pattern inference (waits on ratings)
Once Wes has rated 5+ products via /factory/calibrate/, the system should
detect what Pursue products share (palette restraint, copy density, archetype,
pricing band) and apply those patterns when generating new products. The
brand-brief generator should read the manifest of Pursue products in the
state context and bias new briefs toward their characteristics.
This lesson is on hold until ratings.json has at least 5 entries with tier=pursue.
Until then, the brand-brief generator continues to pick palette and archetype
from product category alone (no preference signal from Wes).
Implementation note for the future: in regen-gallery.py, after computing the
products list, also export an inferred_pursue_patterns.json that summarizes
common attributes of Pursue tier products. Director state context reads
this and includes it in the brand-brief generation prompt.
Lesson 2026-05-03: Validation data informs scoring
When validation.json shows real reply rate >5% on a product, treat that as
evidence the idea is real. Future picks should weight that product's category
higher. When reply rate is <1% across 50+ outreach attempts, the category
is wrong; deprioritize that product cluster.
Lesson 2026-05-03: Closer audit informs depth ticks
When picking action F (sub-page), K (drip), L (outreach), M (demo), prefer
products where sales-readiness score is below 70. Read /home/ubuntu/factory/
director/sales-readiness.json for current scores and which axes scored low.
The findings note tells you what to fix first.
Lesson 2026-05-03: External benchmark distinct from internal critique
Foreman demands and Closer audits are internal-lens (compared to Wes's reference
corpus or sales-readiness checklist). External-Eye Critic in
/home/ubuntu/factory/director/external-critique.json compares to YC/PH/IH
benchmarks. When both critique sources flag the same gap, ship the fix
immediately - that's a high-confidence improvement. When they disagree, defer
to External (strangers don't know our internal corpus).
Lesson: Action O (Buyer-Voice Skeptic) is the only non-self-referential signal
Every other action grades the studios output (Foreman, External-Eye, Closer). Action O role-plays a real-named ICP reading the page and writes a first-person memo with a verdict (dismissive / on-the-fence / curious-enough-to-reply). Pick O when:
- A product has shipped homepage + sales kit but 0 skeptic memos
- The Director has been running mostly write actions and lacks any human-shaped feedback
Do NOT pick O on products whose homepage was modified in the last 5 minutes (workers using). Skeptic memos live at /srv/sites/factory/builds/<slug>/skeptic-memos/.
Lesson: Action P (mine_wes_world) generates ideas FROM Wes context
The Wes-Aware Miner reads /home/ubuntu/factory/director/wes-context.md and produces 8 ideas tightly fitted to his stack, customers, and power zones (lead-gen, data-enrichment, appointment-setting). Items are tagged source="wes-aware" in the inbox so the scorer treats them normally. A daily cron at 8:30 AM also runs this, so do not pick action P if the days log already exists at /home/ubuntu/factory/logs/wes-miner-<date>.log.
Lesson: Action Q (spawn_elevator_pitch) is for short punchy audio
Brand pitch (existing pitch.mp3) is 300-450 words at voice d8a134 (the established brand voice). Elevator pitch (elevator.mp3) is 90-110 words at voice 933563129e... (a different voice so listeners can tell them apart audibly). Both can coexist on the gallery card. The credentials live in /home/ubuntu/factory/director/.fish-env (chmod 600). Do not pick Q on a product whose homepage was modified in the last 5 minutes.
Lesson: Similarity guard runs before every Action C build
A pre-flight similarity check fires for every new product (when no brand-brief exists yet) at /home/ubuntu/factory/director/similarity-check.sh. It compares candidate title+summary against all existing builds and returns one of: build / variant_landing / skip. The guard distinguishes same-engine-same-audience (skip - dilution) from same-engine-different-audience (variant_landing - acceptable; tag relationship in /home/ubuntu/factory/director/variants/<slug>.json). A skip aborts the action mid-tick and logs to /home/ubuntu/factory/director/duplicates/<slug>.json. If a candidate keeps getting skipped, pick a more differentiated runner-up from the picks file.
Lesson: Cross-product patterns are at /home/ubuntu/factory/director/cross-product-demands.json
Every 4 hours, cross-product-patterns.py reads all skeptic memos and clusters recurring objections into 5-8 themes. Each theme carries a Foreman-style demand and a list of affected slugs. When picking action B (polish), action F (sub-page expansion), or action I (Foreman pass), prefer products that appear in the affected_slugs of the most-flagged themes - those are the highest-leverage fixes. The themes are also surfaced publicly at /factory/patterns/.
Lesson: Studio reflection at /factory/reflection/
Every 6 hours, reflection.py computes per-category, per-vertical, per-effort, per-buyer-type avg composite scores and asks Claude to synthesize a strategic summary. The latest narrative lives at /home/ubuntu/factory/director/reflection-narrative.txt. When picking action C (new MVP), prefer ideas in categories/verticals that historically score >= 60. Avoid categories with chronic underperformance (currently: communications, ops-tooling).
Wes-taste signal
_Updated 2026-08-29 12:00 PT._ No Wes-taste data yet - fewer than 3 products are marked Pursue. When Wes rates 3+ products on /factory/calibrate/, this section will surface what he values so the studio can bias toward those signals.