Portfolio Readiness Summary — 2026-04-22
One-screen roll-up of all 6 property scorecards + knowledge-layer freshness audit. Every number here is verifiable against the linked per-property scorecard in knowledge/readiness/reports/.
Scores at a glance
| Property | Score | Status | P0 | P1 | P2 | Scorecard |
|---|---|---|---|---|---|---|
| cwa | 33% | NOT READY | 0 | 7 | 3 | cwa-20260422-2152.md |
| pewsearch | 33% | NOT READY | 0 | 7 | 4 | pewsearch-20260422-1746.md |
| itw | 56% | NOT READY | 0 | 5 | 4 | itw-20260422-2154.md |
| sermonwise | 11% | NOT READY | 0 | 7 | 5 | sermonwise-20260422-1746.md |
| sharewise | N/A | COMING SOON | 3 | 2 | 1 | sharewise-20260422-1745.md |
| pro-website | 67% | NOT READY | 0 | 5 | 3 | pro-website-20260422-1145.md |
Portfolio totals: 0 production P0s, 31 P1s, 19 P2s across 5 live properties + 1 coming-soon.
Pro Website is +1pt vs the 2026-04-18 scorecard (66% → 67%). No regressions; one small improvement.
Methodology caveats — read before acting
Scores are conservatively low this run. Most subagents could not execute:
- Playwright viewport runs — Bash execution denied in subagent sessions. Dimension 2 scored WARN (spec-file presence only) rather than PASS.
- Supabase MCP queries — requires browser-based OAuth that wasn't available headlessly. Dimension 6 (drift) and parts of D3 (knowledge) couldn't run the actual SQL.
moderation_violations.reviewedcolumn does not exist — the skill's dimension 6 query (defined inC:/dev/.claude/skills/ensure-solid/SKILL.md) is broken across ALL properties. This is a skill-level bug, not a property issue. Fix: querymoderation_eventsor add areviewedcolumn tomoderation_violations.
Implication: true scores are likely in the 55-70% band once a session with Bash + MCP can run the checks. The relative ranking across properties is still meaningful — pro-website genuinely leads, sermonwise genuinely trails.
Cross-property patterns
Pattern 1: Registry has 87% last_run: null coverage
From the freshness audit: 26 of 30 registry entries have never been recorded as run. Two have last_break newer than last_run. This means:
- The critical-path gate CI workflow works in theory but has no baseline to compare against
- Every subagent scored dimension 1 conservatively because "no green run on record" reads the same as "broken"
Highest-leverage single action: run the existing Playwright specs once against production and let the skill stamp last_run fields. One 30-min session, lifts multiple P1s.
Pattern 2: Critical-path gate is silently bypassed
The freshness audit found that stripe-live-checkout and stripe-e2e-validation-monthly both declare code_files that don't exist in the repo (src/app/checkout/, src/lib/stripe/). The .github/workflows/critical-path-gate.yml workflow matches PR file-changes against these paths — since nothing matches, the gate never triggers. The CI gate meant to prevent another Hope Community billing failure is currently inert.
Urgency: HIGH — this is armed, looks green, but isn't actually guarding anything.
Pattern 3: cwa-pro-website.md acceptance spec still DRAFT
Pro Website is live with paying customers and 3 critical-path registry entries (cwa-pro-website-onboard, cwa-pro-website-render-ssr, cwa-pro-website-admin-edit). All 3 point to an acceptance spec that explicitly says "pending founder interview — DRAFT." Per CLAUDE.md rule #17, this is a hard gate. 30-45 min founder interview unblocks the full Pro Website readiness column.
Pattern 4: Marketing funnel wiring has drift
- CWA:
cwa.yamlsays MailerLite groupcwa-leads, code usescwa-newsletter. New leads may be dropping into the wrong segment. - ITW: similar — direct API key deprecated in favor of CWA proxy, but
itw.yamlstill references legacy config. - Sermonwise: no welcome email automation at all after signup.
Pattern 5: Stripe price ID drift in docs vs canonical source
- SermonWise:
PRICING.mdannual price ID is stale vspricing.yaml(consolidated 2026-04-14). If Vercel ENV pulls from the stale file, annual charges go to the wrong price. - CWA:
cwa.yamlvoice_suite_monthly/bundle_suite_monthlydon't matchstripe-prices.ts.
Root cause: pricing.yaml is canonical but PRICING.md + readiness YAMLs have diverged.
Pattern 6: Per-property acceptance specs go stale in waves
Freshness audit: 8 acceptance specs will cross the 30-day staleness line between April 26-29. They all anchor on the 2026-03-27 through 2026-04-01 interview series. A single follow-up interview round can refresh most of them at once.
Top 10 punch list (portfolio-ordered)
Prioritized by blast radius × effort, not chronological FA-number.
- Fix
stripe-live-checkoutcode_files paths — unlocks the actual critical-path gate. 5 min edit toregistry.yaml. Highest leverage item on the board. (Freshness audit, finding #4) - Run existing Playwright specs once and stamp
last_run— closes ~6 "never run green" P1s across all 4 live products. Single ~30 min session. (Freshness audit Pattern 1) - Complete
cwa-pro-website.mdfounder interview — unblocks 3 Pro Website critical-path gates. 30-45 min. (FA-054 / pro-website P1) - Fix FA-046 Pro Website auth hole — cancelled customers still have dashboard access. Tombstone view at
admin/[token]/page.tsx. One PR, low risk. (pro-website P1) - Re-sync
product_knowledgefromproducts.yaml+policies.yaml— chatbot + voice agent read stale product data at runtime. Runpnpm derivein a session that has Supabase MCP auth. (FA-064-cwa) - Reconcile MailerLite group names — CWA + ITW both have drift between
.yamlconfig and live code. (FA-066) - Fix skill's dimension-6 SQL:
moderation_violations.revieweddoesn't exist — editC:/dev/.claude/skills/ensure-solid/SKILL.mdto query the correct table/column. Unblocks dim 6 scoring across every property. (New finding, cross-cutting) — NOTE: remediation session attempted this but Edit was blocked on.claude/skills/path; awaiting founder permission. - Add 3 missing registry entries:
itw-signup,sermonwise-signup-checkout,sermonwise-generate. ✅ DONE 2026-04-22 — all 3 added toknowledge/tests/registry.yaml. (Freshness audit, finding #5) - SermonWise help page 404 —
sermonwise.ai/helpreturns 404 while the product is live at $19.95/mo. Create a help surface with a canonical KB pointer. (FA-076-sermonwise — renumbered from FA-060) - Post-mortem: refresh
pewsearch-premium.mdtouchpoints 3, 4, 13 — still describe pre-decouple Pro Website claim flow. Stale since 2026-04-18. (pewsearch P1-07)
Housekeeping: duplicate FA numbering
The parallel subagents each appended to FOUNDER_ACTIONS.md concurrently, so the following numbers were used by TWO different action items:
- FA-060 — (sermonwise help 404) AND (pewsearch critical-path run) → ✅ SermonWise item renumbered FA-076
- FA-062 — (cwa chatbot never run) AND (sermonwise no welcome email) → ✅ SermonWise item renumbered FA-077
- FA-063 — (cwa cancelled/trial-expired journeys) AND (sermonwise acceptance spec stale) → ✅ SermonWise item renumbered FA-078
- FA-064 — (cwa product_knowledge drift) AND (sermonwise annual price ID) → ✅ SermonWise item renumbered FA-079
Resolved 2026-04-22 by remediation session 1. Redirect stubs left at the old positions in FOUNDER_ACTIONS.md pointing to the new numbers.
Fix: add a allocate_fa_number() helper to the skill that reserves a block up front and hands out numbers to subagents, so concurrent runs don't collide.
Coming soon: ShareWiseAI
Full scorecard: sharewise-20260422-1745.md
Go-live blockers (declared, not newly discovered):
- P0 oauth-integrations — 762-line
social-oauth.tswritten; platform developer apps not registered; env vars missing in Vercel - P0 stripe-live-products — Live-mode Stripe products not created
- P0 publisher-service — Scheduling/publish queue untested E2E against live platforms
- P1 pilot-customers — Zero alpha customers
- P1 acceptance specs — 0 specs in
knowledge/acceptance/; both critical journeys haveregistry_entry: null - P2 FA-021 —
social-smoke.spec.tsexcluded from CI (pre-existing)
Not urgent — coming-soon status is honest here.
Freshness audit highlights
Full report: freshness-audit-20260422-1751.md
- Registry (30 entries): 26 stale (last_run: null), 2 with open breaks, 5 with dangling
code_filespointers - Acceptance specs (17 files): 0 stale today, but 8 cross the 30-day line by April 29 (refresh window)
- Journey docs (3 files): 13 journeys declared in readiness YAMLs have NO
.mdinknowledge/journeys/— major documentation gap
Recommended refresh targets (in order):
cwa-pro-website.md(DRAFT) — highest single-doc leveragestripe-live-checkoutcode_files paths — fix makes the billing gate actually triggerpewsearch-pro-website.md— 25 days old, pre-decouple- Run
stripe-live-checkoutspec and record green — closes a known billing P0 vulnerability - Add the 3 missing registry entries (ITW + SermonWise)
Freshness auditor estimates: 8 specific fixes clear ~80% of downstream /ensure-solid P1 failures.
What's next (recommended sequencing)
Session 1 — 30 min, CI unblock:
- Fix
stripe-live-checkoutcode_files paths (item #1) - Fix skill's
moderation_violations.reviewedquery (item #7) - Add 3 missing registry entries (item #8)
- Renumber duplicate FA items
Session 2 — 1-2 hrs, run the tests:
- Run existing Playwright specs against production, stamp
last_run(item #2) - Re-sync
product_knowledge(item #5)
Session 3 — 45 min, founder-gated:
- Complete
cwa-pro-website.mdfounder interview (item #3)
Session 4 — 1 hr, bug fixes:
- FA-046 Pro Website auth hole (item #4)
- MailerLite group name reconciliation (item #6)
- SermonWise help page (item #9)
After these four sessions, expect portfolio average to move from ~40% to ~75%. A second full /ensure-solid all run will prove it.
Run metadata
- Orchestrator: Claude Code
/ensure-solid all - Subagents dispatched: 7 (6 property scorecards + 1 freshness audit), all
model: sonnet, all read-only - Total wall-clock: ~15 minutes parallel (vs. ~90 minutes serial)
- MCP servers used:
churchwiseai-knowledge(read),supabase(partial — OAuth limitation) - Bash tool availability: inconsistent across subagent sessions — most checks graded conservatively
- ACTIVE_WORK.md entry: released at 17:46 (sermonwise completion marker; full run synthesized after itw returned at 22:00+)
- No code was edited. No DB writes. No deploys. No Stripe changes.