Canvas Health Check
Audit the canvas knowledge base for quality, consistency, and completeness. The canvas is Mycelium's source of truth -- its quality directly determines agent output quality (Raschka: "context quality = model quality").
When to Use
- Before any diamond phase transition (called automatically by
/mycelium:diamond-assess) - After a period of inactivity (>7 days since last canvas update)
- When agent output quality seems to degrade
- After onboarding a new team member (ensures canvas is self-explanatory)
- Proactively: run periodically to catch silent drift
Workflow
-
Load project configuration:
- Read
.claude/diamonds/active.ymlforproduct_typeandproject_type - Read
${CLAUDE_PLUGIN_ROOT}/engine/canvas-guidance.ymlfor required/recommended/optional files per project type
- Read
-
Check file presence:
- For each required canvas file: does it exist? Is it non-empty (>50 bytes)?
- For each recommended canvas file: does it exist? Flag as gap if missing.
- Report:
N/M required files present, K recommended files missing
-
Check
_metablocks:- For each existing canvas file, check for
_meta:block - Flag missing
_metablocks - Flag
last_validatedolder than 30 days (staleness warning) - Flag
versionfield missing or at 0
- For each existing canvas file, check for
-
Check confidence consistency:
- Gather all
confidence:values across canvas files - Flag confidence > 0.5 with
evidence_type: speculationorevidence_type: assumption - Flag confidence > 0.7 with fewer than 2 evidence sources
- Flag confidence values that haven't changed across git history (anchored confidence anti-pattern)
- Cross-check against
.claude/diamonds/active.ymlconfidence
- Gather all
-
Check evidence type consistency:
- Every canvas file with
evidence_type:should have it set to one of:interview,survey,analytics,experiment,speculation,assumption,mocked_persona - Flag unknown evidence types
- Flag
evidence_type: interviewwhen only mocked personas were used (honesty check) - Every
source_class:value should be one of:external_human,external_data,internal_stakeholder,internal_desk,internal_simulated— flag unknown values - Flag
internal_stakeholderevidence with confidence > 0.5 that hasvalidated: falseor novalidatedfield — stakeholder beliefs should not carry high confidence without external validation (Brown: organizational mythology) - Flag L2 opportunity canvas entries where ALL evidence is
internal_stakeholderorinternal_desk— no external human voice heard (Spool: secondhand research insufficient)
- Every canvas file with
-
Check for orphaned references:
- Canvas files that reference other canvas files (e.g., jobs-to-be-done.yml referencing opportunities.yml) -- verify the referenced file exists
- Diamond references to canvas files -- verify they exist
-
Check evidence freshness (evidence decay):
- Scan all
provenanceblocks across canvas files forvalidated_atorcaptured_attimestamps - Compare against staleness thresholds from
${CLAUDE_PLUGIN_ROOT}/engine/evidence-decay.md:- User needs/interviews: 90 days
- Competitive intelligence: 90 days
- Strategic assumptions: 180 days
- Technical feasibility: 120 days
- DORA/delivery metrics: 30 days
- Flag evidence past threshold as warning; past 3x threshold as critical
- Suggest refresh actions: "Evidence in [file] is [N] days old. Run
/mycelium:user-interviewor/mycelium:log-evidenceto refresh." - Note: corrections and patterns do NOT decay — process learnings are timeless
- Scan all
7b. Check metric snapshot freshness (v0.14):
- If
.claude/jit-tooling/active-metrics.ymlexists, for eachstatus: activesource:- Find the newest snapshot in
.claude/evals/metrics/<source>/. - If >7 days old: warning ("[source] snapshot is [N] days old — run
/mycelium:metrics-pullto refresh"). - If >30 days old: critical (evidence this stale is worse than no metric reference — anchors old state).
- If missing entirely: info-level ("No snapshots yet for [source]. Run
/mycelium:metrics-pull.").
- Find the newest snapshot in
- Also check per-adapter freshness: for each adapter file in
${CLAUDE_PLUGIN_ROOT}/jit-tooling/metrics-adapters/, iflast_known_workingis >180 days old, flag as warning suggesting regeneration viametrics-adapters/GENERATING.md. - Source: v0.14 metrics harvesting. Metric evidence has a faster staleness curve than interview evidence because the underlying data changes continuously.
- Check cross-reference integrity (leaf lifecycle):
- Every GIST idea with
source_leaf_id→ verify that leaf exists inopportunities.yml(and not inarchived-solutions.ymlwithout the GIST being shelved) - Every service entry with
gist_id→ verify that GIST idea exists - Every threat model entry with
solution_id→ verify that solution exists - Every go-to-market
feedback_loopentry withsource_leaf_id→ verify leaf exists - Flag broken references as warnings ("Zombie Solution" anti-pattern)
- Every GIST idea with
8b. Check scenario health (Hoskins):
- If
.claude/canvas/scenarios.ymlexists:- Every scenario must have all four Hoskins elements populated (persona, means, motive, simulation) — flag incomplete scenarios
- Every scenario must have
lifecycle.born_atset — flag if missing (orphan scenario with no origin) - Every scenario with
confidence > 0.5must have evidence sources — flag unsupported confidence - Every scenario referenced in
lifecycle.designed_against[]→ verify the solution exists inopportunities.ymlorgist.yml - Every scenario referenced in
lifecycle.tested_against[]→ verify test date is not in the future - Flag scenarios with
status: draftolder than 30 days (stale draft — either promote or discard)
- If
.claude/canvas/scenarios.ymldoes NOT exist but project_type requires it (per ${CLAUDE_PLUGIN_ROOT}/engine/canvas-guidance.yml): flag as warning
8c. Human-task reconciliation (added v0.31.3, closes the evidence/status/consent decoupling drift — corrections.md 2026-05-28):
The failure this catches: a fact about a human-task lives in 2+ places (the task status, the evidence file it produced, the contributor's consent registry) and only the salient one gets updated, so the canvas silently drifts from reality. Three sub-checks over .claude/canvas/human-tasks.yml#pending_tasks:
- (a) Status-vs-activity staleness: for each task whose
statusis non-terminal (NOTcompleted/abandoned/stalled), compute the latest activity date acrossupdated_at,touch_log[].date, andpartial_findings[].date. If the latest is >21 days ago (or no activity date at all), flag: "ht-XXX untouched [N]d while still[status]— decide: markstalled, markabandoned, or nudge the contact. Abandonment is a non-event; nothing else will surface this." (The session-start hook flags this at 14d for awareness; canvas-health is the deeper 21d decision prompt.) - (b) Evidence-exists-but-task-open: for each non-terminal task, check whether it has already produced evidence — i.e. it has a populated
partial_findingsblock, OR itscanvas_refsresolve to real evidence entries in purpose.yml/user-needs.yml dated at/after the task's activity. If evidence exists but the task is still open, flag: "ht-XXX has captured evidence (partial_findings / linked purpose.yml entry) but status is[status]— close it (completed) or record why it stays open. Logging evidence and closing the source task are separate steps; this catches the gap." Recommend/mycelium:log-evidenceshould be closing the task going forward. - (c) Consent-registry sync (best-effort; cross-source): if an attribution registry is available (
$MYCELIUM_ATTRIBUTION_REGISTRYor a private companion repo's.claude/memory/attribution-registry.yml), compare each contributor'sconsentvalue there a