Fix SKILL.md: correct sound-effects.md → sfx.md, add 5 missing rule e…#10
Open
Graehamwatts wants to merge 386 commits into
Open
Fix SKILL.md: correct sound-effects.md → sfx.md, add 5 missing rule e…#10Graehamwatts wants to merge 386 commits into
Graehamwatts wants to merge 386 commits into
Conversation
Previous consequence-section removal only took out the OPENING of the block. It left 3 orphan .cq-stake child divs + their closing tags behind. Result: delta=2 extra </div> tags that closed .page prematurely, which broke the DOM hierarchy for the <script type=text/template> blocks and the openModal() script — hence 'nothing happens' on modal clicks. FIX: Surgical removal of all orphan content between hero close and SECTION 1 anchor. HTML balance restored to delta=0. Verified: 14 modal triggers, 14 script templates, openModal function present, modalBackdrop div present. Modal buttons should now work.
… sequential Graeham correctly pointed out I was treating the principles as a sequence (consequence-first = hook rule, story = segment 1 rule, stakes = segment 2 rule, cliffs = segment boundary rule). Sabrina's framework is the opposite: all 4 principles are parallel, applied to EVERY segment of the script. Rewrote youtube-script-template.md: - New top section explains the 4 principles are equally weighted and applied throughout, with a 'critical' note that you don't apply them in sequence - Structure section still lists the 5 parts (Hook / Seg 1 / Seg 2 / Seg 3 / CTA), but now each part has a 'Principle check' line that runs consequence-first, story, stakes, cliff checks simultaneously - Every segment asks: does this have consequence? is it story not list? does it stake higher than previous? does it cliff into the next? - Required elements checklist updated to enforce 'every segment passes every principle' rather than 'segment X passes rule X' This matches Sabrina's actual framework from the screenshot: the 4 principles are presented as a flat list under 'Core Principles' — no hierarchy, no sequencing.
… 6.37%)
WHAT GRAEHAM SAW: Tuesday's Content Creation section had 15 cards all
showing 'Awaiting Generation' with command-hint text that LOOKED like
broken buttons but were actually unrendered placeholders.
WHAT WAS MISSING: the actual content. Only Monday had real content
populated.
WHAT I BUILT: all 15 Tuesday format blocks written fresh, applying the
PARALLEL principles (consequence-first, story, escalating stakes,
retention cliffs) to every segment of every format:
1. Talking-Head Script + SSML (YT Long) — 4:30, 568 words, consequence
hook ('6.37% just cost/saved you $220K'), full act structure with
SSML tags, specific Peninsula math, COMMENT RATES CTA
2. Vertical Punch Cut (YT Short) — 0:30, 88 words
3. Hook-Led Reel (IG Reel remotion-dev#1) — 0:30, hook-led variant
4. Data-Led Reel (IG Reel remotion-dev#2) — 0:20, data-led variant
5. 8-Slide Arc (IG Carousel) — 8 slides, complete arc
6. Casual Adaptation (TikTok) — 0:30, native pacing
7. SEO + AEO Long-Form (Blog) — 1,200w, H2/H3 hierarchy, stats table,
Peninsula-specific cities
8. Local SEO Post (GMB) — 250w geo-tagged
9. Extended Caption (Facebook) — 400w full story
10. Professional Post (LinkedIn) — 300w authority tone
11. Paid Variants (Ads) — 3 A/B variants for FB/IG, Google, LinkedIn
with UTM tracking
12. Weekly Email Lead (Newsletter lead section) — 400w
13. Complete Weekly Email (Newsletter full structure) — 7 sections
14. Editing Package for Jason (Production brief) — B-roll shot list,
motion graphics, text overlay timings, deliverables
15. A/B Testing Hooks — 3 alternate hooks with rationale and test plan
All content applies the corrected parallel-principles framework: every
segment has consequence + story + escalating stakes + cliff into next.
TUESDAY IS NOW MORE COMPLETE THAN MONDAY (15 vs 14 populated formats).
CC Overview stats updated: 15 Ready, 0 Pending.
All 15 format cards now have working modal-trigger buttons (same as
Monday). HTML delta=0.
Next up (if you want): Wed/Thu/Fri remain as pending placeholders.
Same approach can generate each of those in one pass.
…penModal) The fix I made in commit 8dc67e1 only landed on Monday. The other 4 day views still had the pre-fix openModal that used tmpl.innerHTML — which returns empty string for <script type='text/template'>. Result: even after generating Tuesday's content in commit 36d0b1b, the Tuesday buttons didn't open modals because the JS couldn't read the content. This is the bug Graeham reported: 'buttons still not working' on Tuesday. Replaced the openModal/closeModal/copyModalContent script block on all 4 day views with the bulletproof version that uses el.textContent — matches Monday. Now all 5 day views have identical working modal JS. Monday and Tuesday both have content with working buttons. Wed/Thu/Fri have the fixed JS ready to go whenever content is populated on their cards.
WHAT GRAEHAM CAUGHT: the OLD dashboard had multiple copy buttons per format (Copy Content + Copy Prompt + Copy Production for YT Long). My rebuild only had one modal per card — missed the prompt-as-universal-fallback pattern. Also: 15 formats x 5 days of fully pre-generated content is unrealistic at context-budget scale. Prompts are the right primitive. PATTERN NOW (matches old dashboard): Each format card has a button row with 2-3 buttons: - Gold-filled: 'View [Format] Content' — opens modal with actual content - Gold-outline: 'Copy Prompt' — copies a format-specific regeneration prompt directly to clipboard (no modal, instant + visual 'Prompt Copied!' feedback) - Purple (YT Long only): 'Production Brief' — opens modal with the Editing Package content (B-roll, shot list, motion graphics, deliverables) MONDAY COMPLETE: - 14 populated format cards: each has Copy Content + Copy Prompt buttons - 1 pending format (Data-Led Reel): has Copy Prompt button as fallback - Talking-Head card: has all three (Content + Prompt + Production Brief) - 15 Copy Prompt buttons total, 1 Production Brief button TUESDAY COMPLETE (full demo): - 15 populated format cards: each has Copy Content + Copy Prompt buttons - Talking-Head card: all three buttons - 15 Copy Prompt buttons total, 1 Production Brief button PROMPT STRUCTURE (each prompt ~800 words): - Brand block: Graeham identity, markets, voice, Fair Housing guardrails - Topic block: this day's topic with key data points - Principles block: the 4 parallel rules (consequence-first, story, stakes, cliffs) - CTA/lead capture: keyword + GHL workflow - Format block: format_name, specs, structure, required elements, output - Everything Claude needs to generate that format for that topic in one paste NEW JS (copyPrompt) uses same pattern as openModal — reads textContent from <script type='text/template'> block, copies to clipboard, flashes '✓ Prompt Copied!' feedback on button for 2.5s with green success color. HTML delta=0 on both files. All 5 tests pass structurally. Wed/Thu/Fri still have pending placeholders with no Copy Prompt yet — next step is rolling this same treatment to them so every format card has at minimum a Copy Prompt fallback button even when content isn't generated.
GRAEHAM'S FEEDBACK: (1) YT Long script at 573 words doesn't actually hit
4:30 — the math gave 4:17 and I called it 4:30. (2) Prompts should be
comprehensive enough that one paste to Claude generates everything —
script + SSML + production brief.
FIXES:
1. TIMING MATH EXPLICIT per format. YT Long now specifies:
- Target 4:30 = 620-680 spoken words (at 150 WPM × 1.15 pause buffer)
- Per-segment word count ranges so Claude hits the target:
* Hook 55-70 words
* Act 1 145-165 words
* Act 2 180-210 words
* Act 3 175-205 words
* CTA 85-105 words
- Total 640-755 words, target 650-680 for true 4:30
2. COMPREHENSIVE OUTPUT REQUIREMENTS. Each prompt now has an explicit
'OUTPUT — YOU MUST GENERATE BOTH SECTIONS IN ONE RESPONSE' block
listing exactly what Claude should produce:
- Talking-Head: script with SSML + Production Brief for Jason (full
shot list, motion graphics spec, text overlay timings, deliverables,
deadline)
- YT Short / Vertical: script + caption + hashtags for IG/TikTok
- Hook-Led Reel: script with overlays + IG caption + FB cross-post variant
- Data-Led Reel: script + stat-heavy caption + hashtags
- 8-Slide Carousel: all 8 slides with visuals + caption
- TikTok: script + caption with emoji/hashtag treatment
- Blog: YAML frontmatter + full Markdown post + FAQ schema JSON-LD
- GMB: post copy + image brief + UTM link
- Facebook Extended: post body + first-comment template + native video note
- LinkedIn: post + tag suggestions
- Paid Ads: Variant A (FB/IG) + Variant B (Google) + Variant C (LinkedIn)
+ landing page brief, all with UTM
- Newsletter Lead: metadata (subject + preview) + 400w body + A/B subject variants
- Full Newsletter: all 7 sections + assets needed list
- Production Brief: standalone editor document with deliverables list
- A/B Hooks: 3 hooks + rationale per + test plan
Each output section separated by '---' dividers so Claude's response
is structured and Graeham can copy specific sections.
3. BRAND + PRINCIPLES BLOCK is now shared and reused across all prompts:
- Voice: warm, direct, peer-to-peer, data-backed, never condescending
- Fair Housing guardrails (non-negotiable)
- 4 parallel principles (consequence-first, story, escalating stakes,
retention cliffs — applied to EVERY segment, not sequentially)
4. TOPIC BLOCK is day-specific with concrete data:
- Monday: EPA Homicide-Free with MLS data, 1992 contrast, DOM, keyword EPA
- Tuesday: 6.37% mortgage rates with buying-power math, refi break-even,
keyword RATES
Each prompt now ~900 words, up from ~400 words. Claude now has everything
needed to generate comprehensive content in one response.
Applied to Monday (15 prompts) and Tuesday (15 prompts). 30 prompts total
updated. HTML delta=0 on both files.
- seo-optimizer: on-page SEO audit + rewrites + keyword strategy - copywriter: direct-response copy with AIDA/PAS/FAB/BAB, 3 variations per run - context-engineer: context-window diagnostic, SKILL.md auditor, tiered-structure designer Each includes a SKILL.md plus 3 references/ files. All three passed their eval suites (26/26, 19/19, 19/19 assertions).
…ne response GRAEHAM CLARIFIED: when Copy Prompt → paste in Claude, the output should include BOTH the plain-readable script AND the SSML-tagged version (for ElevenLabs/HeyGen voice rendering) — two distinct deliverables from one paste. UPDATED Talking-Head prompt (Monday + Tuesday) to demand THREE sections separated by '===' dividers: SECTION 1: PLAIN SCRIPT — human-readable, no SSML tags, with B-roll annotations and timing math. For sharing with Peter/Jason, reading aloud, YouTube description, proofreading. SECTION 2: SSML-TAGGED SCRIPT — same content but with ElevenLabs-ready XML tags inline (<prosody rate='medium'>, <break time='400ms'/>, etc.) Paste directly into ElevenLabs v2 or HeyGen v3 for voice rendering. SECTION 3: PRODUCTION BRIEF — standalone doc for Jason: B-roll shot list (STOCK vs SHOOT LOCALLY, duration per shot), motion graphics spec, text overlay timings, audio specs, deliverables list (Master 16:9 + Vertical + 2x Reel variants + TikTok), deadline. Delimited by '===' so Graeham can copy individual sections without parsing. One Copy Prompt click → paste to Claude → get all three in one response. If Claude's output is ever too long for one response, the '===' dividers mean you can ask 'give me only SECTION 2' as a follow-up. Both Monday (EPA Homicide-Free) and Tuesday (6.37% Mortgage Rates) Talking-Head prompts updated. HTML delta=0 on both files.
TASK 1: Copy Prompt buttons on Wed/Thu/Fri this week - 15 Copy Prompt buttons per day × 3 days = 45 new prompts - Each prompt includes brand + topic + principles + format specs - Wed topic: EPA Q2 2026 Price Breakdown by Neighborhood - Thu topic: What $5M Buys (Atherton vs PA vs MP) - Fri topic: CA Smoke & CO Detector Seller Compliance - copyPrompt JS function added to all 3 files TASK 2: Weekly calendar topic links point to day views, not legacy - Updated weekly-calendar-builder.py to use relative day-view paths (was hardcoded content-calendars/ prefix) - Updated calendar-2026-04-20.json and calendar-2026-04-27.json single_topic_dashboard fields to new day view filenames - Regenerated both weekly calendars - All 10 topic cards (5 per week) now link to day-YYYY-MM-DD-*.html TASK 3: 5 next-week day views + 25 research stubs - Built day views for Apr 27-May 1 using same structure as this week * day-2026-04-27-mon-epa-homes-under-1m.html * day-2026-04-28-tue-peninsula-bidding-wars.html * day-2026-04-29-wed-hidden-equity-refi-vs-sell.html * day-2026-04-30-thu-woodland-park-772-units.html * day-2026-05-01-fri-ab1482-rental-exemption.html - Each has full scoring panel (with estimated intent scores), research accordion with 5 source buttons, 15 format cards with Copy Prompt buttons - 25 research stubs created (5 days × 5 sources) linking back to Monday's populated versions as reference - next-week.html day tiles now clickable (5 <a href=...> wrappers) TASK 4: Deleted legacy single-topic production dashboards - Removed 5 files from content-calendars/: * 2026-04-18-epa-two-years-homicide-free-production.html (280KB) * 2026-04-19-ca-smoke-detector-compliance-production.html * 2026-04-19-epa-market-update-production.html * 2026-04-19-peninsula-bidding-wars-back-production.html * 2026-04-19-woodland-park-772-units-production.html - content-calendars/ now contains only the 2 weekly calendar v7 HTMLs - Recoverable from git history if needed SUMMARY: - 10 day views total (5 this week + 5 next week) - 50 research pages total (25 this week + 25 next week, Monday is populated) - 2 weekly calendars (Rule 14 compliant, linking to day views) - Every format card on every day has at minimum a Copy Prompt button - Every day view has clickable research cards - next-week tiles are clickable HTML delta=0 across all files. Clean structure.
…ni API (no third-party wrapper)
… vaibhav-template, video-prompt-builder, video-script-creation-engine
… (14 replacements across 9 files). Preserves warning lines intact.
…r shipped This commit treats the April 20 week as scaffolding/dev work that never actually shipped. It is removed entirely and replaced with a clean April 27 week ready to ship. Removed: - 5 day views for April 20-24 (the dev/test week) - 25 research pages for April 20-24 - content-calendars/2026-04-20-production-calendar-v7.html - content-calendar-data/calendar-2026-04-20.json - next-week.html (legacy v6 calendar — superseded by Rule 14 v7) - skills/video-script-creation-engine/ (28 files — fully absorbed by content-creation-engine) - scripts/update_weekly_calendar.py (one-time migration script, no longer needed) - HeyGen render log entry for the dev-cycle test video Cleaned references: - DRE 02015066 fully scrubbed (was in shared-references/branding.md, prompts-library-builder.py, and newsletter-generator/SKILL.md as guard comments — replaced cleanly with DRE 01466876) - calendar-2026-04-27.json: previously_shipped_this_week is now [] and previously_shipped_week_of marks this as the first week of the new system - topic-history.json: removed 2026-04-20 entry (didn't ship) - single-topic-dashboard-builder.py + prompts-library-builder.py: replaced hardcoded April 20 example references with neutral evergreen prose - content-creation-engine/SKILL.md: updated Rule 3 reference to v7 calendar - 2026-04-27-production-calendar-v7.html: removed Already Shipped section, neutralized topic-card prose Rewrote: - index.html: April 27 is This Week, with 5 day-tile cards linking to the new day views (EPA Under $1M / Peninsula Bidding Wars / Refi vs Sell / Woodland Park 772 / AB 1482 Exemption) - 25 April 27 research stubs cleaned of stale April 20 cross-links Final architecture audit: PASSING - DRE compliance: 0 references to 02015066 (correct) - Day views: 5/5 present, all April 27 week - Research stubs: 25/25 present - All index.html links resolve - All day-view research links resolve - No legacy skills remaining Continues: rewriting Monday April 27 (EPA Homes Under $1M) full content across 15 format cards in a follow-up commit.
ROOT CAUSE of the recurring DRE leaks: the wrong number kept reappearing
because brand identity was DUPLICATED across 71 files instead of being
read from a single source. Each scrub had to find and replace every
instance — miss one and the next session resurfaced it.
FIX (now in place):
1. skills/shared-references/identity.json
- Single source of truth for name, DRE, brokerage, contact info, markets
- Includes a _blocked_values.dre_blocklist with 02015066 (the wrong DRE)
- Bump the blocklist to add any future bad value
2. scripts/verify_brand_identity.py
- Tripwire that grep-fails the entire repo against the blocklist
- Exits 1 if any blocked value appears anywhere outside identity.json
- Currently: PASS (0 violations)
3. .git/hooks/pre-push
- Auto-runs the tripwire before every push
- Push refuses to ship if a blocked value leaked back in
- This is the enforcement layer that was missing
4. skills/shared-references/branding.md
- Updated to point at identity.json as the source of truth
- Removed hardcoded DRE/contact strings — now references identity.json
ALSO FIXED — separate architectural gap that surfaced this week:
5. topic-history.json schema v2.0 — added 'in_production' register
- Gatekeepers previously only saw POSTED content, missing shot-but-unposted
- Logged Graeham's shot 'EPA Homes Around $1M' video so next ideation pass
excludes anything that overlaps it
- exclusion_radius field lets each in-production topic block conceptual
neighbors even when slugs differ
6. content-creation-engine/SKILL.md — added Rule 15 (Two-Register Freshness)
- Documents how ideation-engine and bofu-scorer must read BOTH history
and in_production for freshness checks
Why these two fixes belong together: same root pattern. State that
mattered for correctness was duplicated/incomplete with no enforcement.
Solution in both cases: one canonical store + a verifier that fails loud
when reality drifts from the canonical store.
…up + Monday topic swap ROOT CAUSE of the disappearing Production buttons: Two builder scripts existed with conflicting button architectures: - single-topic-dashboard-builder.py wrote DUAL buttons (script + production) - prompts-library-builder.py wrote SINGLE button (copyPrompt only) Day views regenerated through prompts-library-builder.py silently dropped the Production buttons every time. Fixed by updating that builder to write the same 3-button block, so future regenerations preserve them. FIXES IN THIS COMMIT: 1. 3-button architecture across all 75 format cards (5 day views x 15 each): - Copy Prompt (master) - returns Plain Script + SSML + Production Brief in one paste - Copy SSML - focused prompt, returns ONLY ElevenLabs-ready XML in a code block - Copy Production - focused prompt, returns ONLY production brief for Jason Implementation: single master template per card; copyPromptMode() JS appends a section-specific override block at copy time (no template duplication). 2. Status pill auto-flips on copy: 'Awaiting Generation' (gray) -> 'Prompt Copied - Generate in Claude' (green) when any of the 3 prompt buttons is clicked. Visual feedback was missing. 3. SSML output now points Claude at the canonical ElevenLabs tag set: <speak>, <p>, <s>, <break time>, <emphasis level>, <prosody> -- matching the elevenlabs-audio-tags.md spec we already had but weren't actually pointing the prompts at. Closes the 'Claude improvises SSML dialect' bug. 4. Monday topic swapped: EPA Homes Under $1M -> Peninsula Rent vs Own Math Reason: Graeham shot a near-identical EPA Around $1M video Apr 23 still in production. New topic is 'First-Time Buyer Math: Why Renting in 2026 Costs More Than Owning Under $1.1M on the Peninsula'. Same BOFU buyer audience and BUY keyword, distinct angle (rent-vs-buy decision math). File renamed: day-2026-04-27-mon-peninsula-rent-vs-own.html Updated: index.html, v7 calendar, calendar JSON, topic-history. 5. Killed 15 dead next-week.html links across all 5 day views (file was deleted in earlier reset; nav still pointed at it). Now point at index.html with relabeled link text 'Weekly Calendar'. 6. Builder regression source patched: prompts-library-builder.py now writes the 3-button block by default. This is the structural fix that prevents the 'Production buttons disappeared again' issue from recurring on the next regeneration. Audit: 0 conflicts. 0 broken links. 0 DRE leaks. 75/75 cards rewired. Pre-push tripwire: PASS.
This commit captures the verified-working state of the system after the reset, the architectural fixes (identity tripwire + in-production register), the 3-button rewrite, and the Monday topic swap. ALSO: populated funnel field on calendar JSON topics that were missing it (caught by section-5 audit). Five topics now correctly tagged BOFU/MOFU matching the v7 calendar HTML. Tag this commit so we can revert here if anything regresses: git tag v2026.04.27-stable git push origin v2026.04.27-stable STATE_SNAPSHOT.md documents what 'working' looks like across 8 sections with audit commands you can re-run any time. If anything drifts, refer back here as the source of truth.
…t + GHL + Excel + By_Date)
…to central PCFS hub (handles new-deal onboarding, contact edits, pause/unsubscribe, audit, cadence lookups)
…lishing - Replace teal/navy email-style HTML with Graeham Watts brand (gold/black palette) - Add CMA-style cover header (GRAEHAM WATTS / R E A L T O R / OFFER COMPARISON) - Add sticky site nav bar matching CMA reports (graehamwatts.com nav) - Switch from 720px email width to full-width 1320px container - Switch from system font stack to Inter (Google Fonts) - Add references/email_branding.md (full brand spec) - Add references/github_publishing.md (push to cma-reports flow) - Update SKILL.md with mandatory publishing step (file naming Offer_*.html) - Color rules forbid teal/navy/blue: gold/black/cream only
…able Sellers want to compare net proceeds line-by-line, not click between tabs. The new format renders one column per offer with the recommended (rank remotion-dev#1) column highlighted in gold/cream. Single-offer analyses still use a normal vertical table since there's nothing to compare.
ROOT CAUSE FOUND: Local pre-push hook is advisory only — it didn't prevent these regressions because it doesn't run for pushes from machines that don't have the hook installed. Two recent commits to offer-analyzer (aaf7273, e668631) bypassed the hook entirely and shipped 4 instances of the wrong DRE. FIXES: 1. Scrubbed the 4 leak instances: - skills/offer-analyzer/SKILL.md (2 places — bottom contact strip, contact line) - skills/offer-analyzer/references/email_branding.md (2 places — same two places in the branding reference) 2. Added .github/workflows/verify_brand_identity.yml as the SERVER-SIDE enforcement layer. This runs the brand identity tripwire as a GitHub Actions check on every push and pull request to main, regardless of who pushed or which machine they pushed from. Local hooks are advisory; this is the real enforcement. To make this BLOCKING (not just visible): once this workflow runs once, go to Settings -> Branches -> Add branch protection rule for main -> require this check to pass. Until then, the check runs but doesn't block merges automatically. Tripwire state: PASS — repo is clean against the 1-item blocklist.
Goal: prevent the recurring DRE leak from happening an 8th time by making sure every Claude session that touches this repo reads the correct identity FIRST, before writing brand info from memory. Specifically: - Names identity.json as the single source of truth - Calls out 02015066 as prohibited (with explanation that it's not the brokerage DRE either — Graeham confirmed) - Documents the tripwire and how to run it - Points at v2026.04.27-stable as the rollback tag
The audit script blocked CLAUDE.md and STATE_SNAPSHOT.md from existing
because they legitimately reference 02015066 in their documentation
('do NOT use 02015066, it has been blocklisted seven times').
Fix: identity.json now has a _documentation_exempt list, and the audit
script reads it. Files in the exempt list (CLAUDE.md, STATE_SNAPSHOT.md,
the script itself, identity.json itself, the GitHub Actions workflow)
can legitimately reference the blocked value for warning purposes
without failing the tripwire.
Result: tripwire now correctly distinguishes 'documentation about a
blocked value' from 'production use of a blocked value'.
Date stamp: 29-04-2026-1748 CHANGES: - Delete 30+ content-calendar output files from root (day-*.html, research-*.html) - Delete content-calendars/, content-calendar-data/, emails/ output folders - Delete render_status.json, skills-streamline-report.md, STATE_SNAPSHOT.md (scratch/working files) - Move Remotion render pipeline (src/, scripts/, package.json, tsconfig.json) into skills/remotion-video/render-pipeline/ - Delete duplicate website-builder/ at root (real skill lives in skills/website-builder/) RESULT: Root is now clean with .claude-plugin/, CLAUDE.md, README.md, assets/, index.html, skills/, .nojekyll. All 39 skills are clearly listed inside skills/.
Date stamp: 29-04-2026-1810 INFRASTRUCTURE FIXES: - Move scripts/verify_brand_identity.py back to repo root (was incorrectly buried under skills/remotion-video/render-pipeline/scripts/ in earlier commit) - Tripwire path expects <repo_root>/scripts/, this is now correct again - Move HeyGen-specific render scripts (heygen_render.py, render_monitor.py, batch_render.py) into skills/heygen-video/scripts/ where they belong - Delete dead-code dashboard QA scripts (unify_final.py, verify.py, _deprecated/) that referenced removed content-calendars/ CONTENT CONSOLIDATION: - Move skills/content-creation-engine/shared-references/data-contracts.md to skills/shared-references/data-contracts.md (truly shared location, used by 4 skills) - Update content-creation-engine/CLAUDE.md path reference - Update index.html link to data-contracts.md DOCUMENTATION: - Update CLAUDE.md to reflect post-reorg state (remove dead refs to STATE_SNAPSHOT.md, content-calendars/, day-2026-*.html that no longer exist) - Add note that DRE# 01466876 is correct, 02015066 is wrong (9th confirmation) - identity.json: clean exempt list, update history note VERIFICATION: - Tripwire (scripts/verify_brand_identity.py) PASSES — zero blocked values in repo
Date stamp: 29-04-2026-1825
OUTPUT INFRASTRUCTURE RESTORED:
- content-calendars/ (with .gitkeep) — output bin for single-topic dashboards
- content-calendar-data/ (with .gitkeep) — output bin for weekly calendar JSON
- emails/ (with .gitkeep) — output bin for skill-generated HTML emails
These were over-aggressively deleted in the earlier reorg; restoring as empty dirs so skills have somewhere to write next week's content.
DEAD CODE CLEANUP:
- Remove Rule 7 from content-creation-engine/SKILL.md (referenced unify_final.py which was a one-time April 2026 migration script, now deleted)
- Remove auto-unify subprocess call from single-topic-dashboard-builder.py
- Update branding.md to remove dead reference to scripts/unify_final.py
- Update Self-Check checklist (item 12 removed, item 13 renumbered)
Rationale: unify_final.py's docstring listed only one-time migration tasks ("reschedule April 20 to April 27", "strip old UNIFIED_FINAL_V1 stylesheet"). The script was already deprecated by design; the dependency in Rule 7 was outdated.
Tripwire: PASSES (zero blocked DRE values)
Date stamp: 29-04-2026-1910 PUBLISH TARGETS UPDATED: - cma-generator → cma-reports/cmas/CMA_[address].html (was: cma-reports/CMA_[address].html at root) - offer-analyzer → cma-reports/offers/Offer_[address].html (was: cma-reports/Offer_[address].html at root) - newsletter-generator references updated for the cma-integration handoff Existing root files in cma-reports stay there (URL compatibility for client-shared links). New content goes into proper subfolders going forward. BRAND-IDENTITY HARDENING (10th leak post-mortem): - Found the 02015066 leak: it was in cma-reports/Offer_828_Weeks_St.html (published 2026-04-29 22:05 UTC). Already fixed in that repo. - Added 'BRAND IDENTITY HARD RULE' warning at top of cma-generator/SKILL.md and offer-analyzer/SKILL.md instructing future sessions to read identity.json before writing any DRE/brand details - Updated CLAUDE.md with the post-mortem and a flagged audit gap (tripwire doesn't currently scan cma-reports) - Bumped 'blocklisted N separate times' counter to ten Tripwire: PASSES on skills repo
Date stamp: 29-04-2026-2030 ARCHITECTURE CHANGE — Graeham Watts confirmed Option B: The skills repo is now strictly source-code. All published outputs and skill caches go elsewhere: - Published outputs → Graehamwatts/cma-reports (with subfolders cmas/, offers/, disclosures/, newsletters/, blog-dashboards/) - Internal skill caching → <skill-folder>/outputs/ (skill-local, gitignored) DELETIONS FROM SKILLS REPO ROOT: - content-calendars/ (3 references redirected to cma-reports/blog-dashboards/) - content-calendar-data/ (4 references redirected to skill-local outputs/calendar-data/) - emails/ (3 references redirected to cma-reports/newsletters/) REFERENCE UPDATES (8 skills, 11 files): - skills/heygen-video/scripts/heygen_render.py - skills/shared-references/data-contracts.md - skills/content-calendar/SKILL.md - skills/content-creation-engine/SKILL.md + 4 sub-files - skills/html-email/SKILL.md - skills/copywriter/SKILL.md CLAUDE.md UPDATED: - New 'Option B architecture' section explains the repo-of-source-code-only rule - Output-type-to-location mapping table - Explicit 'do NOT add output bins to this repo' instruction Tripwire: PASSES (zero blocked DRE values)
…eports Earlier search-replace cascaded incorrectly when input strings were like 'Graehamwatts/skills/content-calendars/'. The replace produced 'Graehamwatts/skills/cma-reports/blog-dashboards/' but cma-reports is a SEPARATE repo (not nested in skills). Corrected to 'Graehamwatts/cma-reports/blog-dashboards/'.
…you"); humanizer pass mandatory on every CMA + email
…isting-call-sheet, meta-ads, obsidian-vault, property-underwriter, switchy-engine/qr, travel-hq, zips, job-search-engine) + skill updates Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts: # .gitignore # skills/cma-generator/references/past_client_mode.md # skills/farming-postcard/SKILL.md # skills/farming-postcard/references/cta-router.md # skills/farming-postcard/references/design-tokens.md # skills/farming-postcard/references/headline-library.md # skills/farming-postcard/references/option-cache.md # skills/farming-postcard/references/print-specs.md # skills/farming-postcard/references/schedule-log.md # skills/farming-postcard/scripts/send_options_email.py # skills/farming-postcard/templates/option-card.html # skills/farming-postcard/templates/options-email-template.html # skills/farming-postcard/templates/postcard-template.html # skills/heygen-elevenlabs-renderer/SKILL.md # skills/heygen-elevenlabs-renderer/scripts/render_video.py # skills/job-search-engine/SKILL.md # skills/listing-call-sheet/SKILL.md # skills/listing-call-sheet/assets/call-sheet-template.html # skills/listing-call-sheet/references/avatar-source-specs.md # skills/listing-call-sheet/references/clip-id-convention.md # skills/listing-call-sheet/references/distribution.md # skills/listing-call-sheet/references/locked-production-rules.md # skills/listing-call-sheet/references/packet-templates.md # skills/listing-call-sheet/references/recipients.md # skills/listing-call-sheet/references/shot-decomposition-rubric.md # skills/listing-call-sheet/references/shot-glossary.md # skills/meta-ads/SKILL.md # skills/meta-ads/references/tool-manifest.md # skills/shared-references/integrations.md # skills/switchy-engine/scripts/send_email.py # skills/travel-hq/SKILL.md # skills/travel-hq/references/commands.md
…cated) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… AGENTS.md, mass-delete guard script, finance-watch/identity/schedule skill updates Squashed from 5 churn commits (auto-syncs + wipe restores) to keep the heavy online_content_files/ binaries out of this source-only repo. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…2026 — MASTER (Auto)' (1zerR...), Sharon's 13 entity tabs merged in, old sheets renamed OLD, n8n Drive creds expired (Sheets cred OK) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pts reconciliation activated (daily 6:30am, ranges fixed) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nders from MASTER) + Closings tab Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ntent-calendar, cma-generator, higgsfield-video, humanizer, docx, offer-analyzer, ghl-crm-audit); add content-engine enforcement scripts (overlap check, topic-history writer, brand validator); routing-decision-tree; rewrite publishing doc to direct-git; retire remaining Composio refs; Windows-first paths in property-os-sync + transcript-repurposer; fix graeham-* frontmatter names Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tired) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ure-analyzer, newsletter-generator) -> direct git + brand validator Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…TP fallback Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…unters now explicit opt-in
…dict language unless asked
PCFS operation moved from Cowork to Claude Code 2026-06-10. Captures the post-rebuild truths SKILL.md predates: n8n.graehamwattsn8n.com via n8n-mcp, Actions By Date as the live schedule tab, the temp-workflow Sheet access pattern, verified GHL field IDs, and the non-negotiable sync/zero-guard rules. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…wire copywriter to load it Source: AI Marketing Academy 'Marketing-Psychology Claude Skill' super skill (June 2026). Adapted frontmatter + Local Adaptations section: loaders point at our real skills, brand identity from shared-references/identity.json, humanizer stays the final pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…put (full 5 steps for scripts, quick path for hooks/captions) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, archetypes 7-10, withdraw recycled June 15 options
Graeham flagged that emailed options kept recycling the same hooks. Audit
of the 6 mailed cards confirmed: archetype rotation alone missed repeated
CTAs (valuation on 4 of 6), repeated villain (Zillow on 3), and repeated
core claims ('I have buyers' twice). Library now tracks all four axes
with cooldowns; Workflow B enforces the check.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… + Notes&Caveats sections even on MLS runs; chart set = same as listing/buyer + monthsInv + newList required; fix contradictory Public Data Notice + Honest Caveats checklist items (root cause of Basswood 6/8 miss); plain opener per Graeham 2026-06-11
…older, push to GitHub, automation reads canonical SKILL.md, brand/banned-language compliance)
…-hint Context Hint Library, adapted for Graeham Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ly-owned home; unknown address = hold + title-plant lookup, never a former-home report
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes for SKILL.md
Bug fix: broken
sound-effects.mdreferenceThe
## Sound effectssection referenced./rules/sound-effects.md, but the actual file is namedsfx.md. This caused a broken link that would prevent agents from loading sound effects documentation.Fix: Changed reference to
./rules/sfx.md.Added missing rule entries to the index
The following 5 rule files existed in the
rules/directory but were not listed in the## How to usesection or the## Captionssection:display-captions.md- added to both Captions section and the full listimport-srt-captions.md- added to both Captions section and the full listtranscribe-captions.md- added to both Captions section and the full listsubtitles.md- added to the full listsfx.md(was listed assound-effects.md) - corrected and added to the full listaudio-visualization.md- added to the full list (was mentioned in the header section but missing from the index)