The Canopy Method

Vocabulary

The canonical glossary for the Canopy Method. Every methodology doc, every marketing-site page, every CLI prompt obeys this file. The custom regex CI check (scripts/check-vocabulary.cjs) enforces it.

If a term appears here as banned, do not use it in prose. If a concept needs a name, use the preferred term. Vocabulary drift is how methodologies die — Scrum became unrecognizable because its words lost their meaning. Canopy does not negotiate on its words.


Preferred Terms

Term Definition Where Used
Outcome A result that delivers value. The atomic unit of work. Described as a state ("Customers can book online"), not an action ("Build booking API"). OUTCOMES.md, METHOD.md
Issue A defect, gap, or unexpected behavior surfaced during Build or after Ship. Carries a diagnostic_state enum (open, investigating, reproduced, isolated, fix_proposed, resolved). BUGS.md, FLOW-AND-SIGNAL.md
Decision A choice that needs to be made, framed as a question with alternatives, reversibility, and (when decided) rationale. Blocks Outcomes when unresolved. DECISIONS.md, METHOD.md
Context Captured knowledge — business rules, constraints, design principles, prompt patterns — that informs Build and Decide. Read before any work. CONTEXT.md, METHOD.md
Signal Lightweight progress visibility. Activity feeds, lead-time charts, throughput rollups. Replaces standups and burn-downs. FLOW-AND-SIGNAL.md, METHOD.md
Invariant A constraint that must hold across all Outcomes (HIPAA, brand-voice, audit-trail, pre-deploy smoke gate). First-class primitive, enforced not documented. INVARIANTS.md
Initiative Cross-cutting work larger than an Outcome but smaller than a Phase. Groups Outcomes that share an architectural thread. INITIATIVES.md
CrossClanDependency A paired-lifecycle dependency between two clans (provider + consumer). Prevents one-sided drift. CROSS-CLAN.md
LivingProcess An always-on Alpha process where the running process IS part of the work (Cortex Nexus, Jungle Obsidian). Council-tier construct. LIVING-PROCESS.md
Now / Next / Later The three priorities. Replaces P0/P1/P2/P3/P4/P5 and Critical/High/Medium/Low entirely. METHOD.md, OUTCOMES.md
Define / Build / Review / Ship / Done The five flow stages. Plus awaiting_approval (v2.0) as a gated transition. FLOW-AND-SIGNAL.md
awaiting_approval Flow stage between Review and Ship when an Outcome carries gate: human-required. Snake_case is canonical. FLOW-AND-SIGNAL.md
Lead time Elapsed time from Define-start to Done. Canopy's primary flow metric. FLOW-AND-SIGNAL.md
Throughput Count of Outcomes shipped per unit time. Replaces velocity. FLOW-AND-SIGNAL.md
Pulse A periodic Signal digest. Generated, not assembled. FLOW-AND-SIGNAL.md
Owner One human name accountable for an Outcome. Never a team, never multiple names. OUTCOMES.md, METHOD.md
Success criteria 2-5 testable assertions that prove an Outcome is done. Written before Build starts. OUTCOMES.md
Alpha The owner-of-record for a clan; the agent through which a clan speaks. METHOD.md, LIVING-PROCESS.md
Clan A scoped portfolio (project, product, team). Has an Alpha, may contain Outcomes / Initiatives / Invariants. METHOD.md, PORTFOLIO.md
Cross-Clan Dependency Report Workspace-level report (Phase 18 / REP-01) listing all CrossClanDependencies with aging buckets, by-state counts, and sync-failed callouts. FLOW-AND-SIGNAL.md
Stakeholder Briefing Workspace-level report (Phase 18 / REP-02) — three audience variants (technical / business / regulatory) over the same period of project signal. AI-generated narrative per variant. FLOW-AND-SIGNAL.md
Invariant Health Dashboard Workspace-level report (Phase 18 / REP-03) — pass / fail / unknown across every standing constraint with recent violations and stalest checks. The Signal-layer surface for invariants; Phase 13's project-scoped page redirects here. FLOW-AND-SIGNAL.md, INVARIANTS.md
Approval Gate Queue Workspace-level report (Phase 18 / REP-04) — outcomes in awaiting_approval with throughput metrics, aging buckets, and override rate. Phase 17's basic queue redirects here. FLOW-AND-SIGNAL.md
Risk Heat-Map Workspace-level report (Phase 18 / REP-05) — cross-primitive Attention Alerts prioritized by weighted severity formula across Invariants, CrossClanDependencies, blocked Outcomes, stuck Outcomes, and LivingProcesses. FLOW-AND-SIGNAL.md
Team-adoption CLI The create-canopy-project npm package — scaffolds the Canopy Method (methodology docs, .canopy/ skeleton, CLAUDE.md) into a project root, then runs a 5-minute interactive tutorial. Sibling to canopy-cc. Method-only — does NOT scaffold .jungle/, .brain/, or .clan-alpha/. METHOD.md
canopy-cc Sibling npm package — installs slash-commands into AI coding agents (Claude Code / OpenCode / Gemini / Codex). Reads the methodology docs scaffolded by the team-adoption CLI. METHOD.md

Preferred Field Names

Canonical field names for method primitives. Every surface — DB schema, Zod validators in @canopy/shared, tRPC router, web UI, methodology docs, CLI prompts — uses these names. The cross-surface CI gate (npm run check:cross-surface) enforces presence on every surface.

DB and methodology docs use snake_case. TypeScript code uses camelCase of the same name. No surface invents an alias.

Outcome fields (Phase 12 / Phase 17)

Canonical (snake_case) TypeScript (camelCase) Type Defined in
kind kind enum OUTCOMES.md
is_retroactive isRetroactive boolean OUTCOMES.md
blocked_on blockedOn enum (nullable) OUTCOMES.md
gate gate jsonb (nullable) OUTCOMES.md (Phase 17)
gate_required gateRequired boolean OUTCOMES.md (Phase 17)
gate_approver_user_id gateApproverUserId text (nullable) OUTCOMES.md (Phase 17)

Issue fields (Phase 12)

Canonical (snake_case) TypeScript (camelCase) Type Defined in
diagnostic_state diagnosticState enum BUGS.md
investigation_notes investigationNotes text (nullable) BUGS.md
owner_uncertain ownerUncertain boolean BUGS.md

Milestone / Phase fields (Phase 12)

Canonical (snake_case) TypeScript (camelCase) Type Defined in
calendar_anchor calendarAnchor date (nullable) FLOW-AND-SIGNAL.md

Outcome.kind enum values

feature, infra, compliance, content, research, refactor, performance, operations. Default: feature. See OUTCOMES.md ## Outcome.kind for full semantics + rendering matrix.

Outcome.blocked_on enum values

internal, external_party. Nullable (NULL when not blocked). See OUTCOMES.md ## Outcome.blocked_on.

Issue.diagnostic_state enum values

triage, investigating, likely_resolved, awaiting_evidence, misdiagnosed, not_our_bug. Default: triage. See BUGS.md ## diagnostic_state enum.

Invariant fields (Phase 13)

Canonical (snake_case) TypeScript (camelCase) Type Defined in
scope scope enum INVARIANTS.md
enforcement enforcement enum INVARIANTS.md
auto_link_tags autoLinkTags string[] INVARIANTS.md
health_status healthStatus enum INVARIANTS.md
last_checked_at lastCheckedAt timestamptz (nullable) INVARIANTS.md
last_violation_at lastViolationAt timestamptz (nullable) INVARIANTS.md
last_violation_details lastViolationDetails text (nullable) INVARIANTS.md
violation_count_30d violationCount30d integer INVARIANTS.md

Invariant.scope enum values

workspace, project, clan_wide. Required. See INVARIANTS.md ### scope enum.

Invariant.enforcement enum values

compile, deploy, ai_verified, manual. Required. See INVARIANTS.md ### enforcement enum. Snake_case is canonical (Postgres enum constraint); the prose form AI-verified is acceptable in narrative text but DB / API / CLI use ai_verified.

Invariant.health_status enum values

passing, failing, unknown. Default: unknown. Computed, never user-set. See INVARIANTS.md ### health_status enum.

Initiative fields (Phase 14)

Canonical (snake_case) TypeScript (camelCase) Type Defined in
status status enum INITIATIVES.md
goal goal text INITIATIVES.md
success_criteria successCriteria string[] INITIATIVES.md
spans_phases spansPhases bool INITIATIVES.md
completed_at completedAt timestamptz (nullable) INITIATIVES.md

Initiative.status enum values

planning, active, paused, shipped, abandoned. Default: planning. See INITIATIVES.md ### status enum. The v7.0 spec (Phase 14 CONTEXT.md) refines the original 3-value enum (active / completed / cancelled) to this 5-value form to capture in-progress states (planning, paused) and use clearer ship-vs-abandon terminology. An Initiative does not move through Flow stages — the Outcomes inside it do.

LivingProcess fields (Phase 15)

Canonical (snake_case) TypeScript (camelCase) Type Defined in
type type enum LIVING-PROCESS.md
runtime_location runtimeLocation text LIVING-PROCESS.md
current_state currentState enum LIVING-PROCESS.md
last_deploy_at lastDeployAt timestamptz (nullable) LIVING-PROCESS.md
last_deploy_version lastDeployVersion text (nullable) LIVING-PROCESS.md
consumption_metrics consumptionMetrics jsonb (free-form) LIVING-PROCESS.md
health_status healthStatus enum LIVING-PROCESS.md
health_last_checked_at healthLastCheckedAt timestamptz (nullable) LIVING-PROCESS.md
external_monitoring_url externalMonitoringUrl text (nullable) LIVING-PROCESS.md

LivingProcess.type enum values

agent, service, scheduler, webhook_handler, nexus. See LIVING-PROCESS.md ### type enum.

LivingProcess.current_state enum values

running, degraded, stopped, unknown. Default: unknown. See LIVING-PROCESS.md ### current_state enum. The v7.0 spec (Phase 15 CONTEXT.md) refines LIVING-PROCESS.md's original draft (running/stopped/restarting/crashed/unknown) to this 4-value form — degraded captures partial-failure operational signal more usefully than separate restarting/crashed states (those are usually transient and observable elsewhere).

LivingProcess.health_status enum values

healthy, warning, critical, unknown. Default: unknown. Computed from external monitoring (fed via recordHealthCheck). See LIVING-PROCESS.md ### health_status enum. The v7.0 spec (Phase 15 CONTEXT.md) refines LIVING-PROCESS.md's original draft (healthy/degraded/unhealthy/unknown) to the standard severity ladder (healthy / warning / critical / unknown) used by external monitoring tools (Grafana, Datadog), matching what operators read elsewhere.

CrossClanDependency fields (Phase 16)

Canonical (snake_case) TypeScript (camelCase) Type Defined in
sync_id syncId text (nullable) CROSS-CLAN.md
originating_clan_id originatingClanId text CROSS-CLAN.md
target_clan_id targetClanId text CROSS-CLAN.md
direction direction enum CROSS-CLAN.md
state state enum CROSS-CLAN.md
acceptance_criteria acceptanceCriteria text (nullable) CROSS-CLAN.md
last_sync_at lastSyncAt timestamptz (nullable) CROSS-CLAN.md
last_sync_error lastSyncError text (nullable) CROSS-CLAN.md

CrossClanDependency.direction enum values

outgoing, incoming. See CROSS-CLAN.md ### direction enum. The same logical dependency lives in both clans with mirrored direction values — joined cross-clan by sync_id. outgoing = this workspace is the originator; incoming = another clan filed against us.

CrossClanDependency.state enum values

requested, in_progress_by_them, delivered, acked, done, cancelled, sync_failed. Default: requested. See CROSS-CLAN.md ### state enum. The v7.0 spec (Phase 16 CONTEXT.md) refines the original 5-state draft (REQUESTED → IN_PROGRESS_BY_THEM → DELIVERED → ACKED → DONE plus a separate sync_status enum) into a 7-state form with cancelled as an explicit terminal and sync_failed folded into the primary state machine as a first-class recoverable error. The FSM guard in @canopy/shared/src/utils/cross-clan-fsm.ts enforces legal transitions; done and cancelled are strictly terminal; sync_failed returns to a valid prior state on Retry Sync.

This section is the spec. When a future phase (13-17) adds a primitive, it extends this section with the new primitive's field table. The cross-surface CI gate (scripts/check-cross-surface-fields.cjs FIELDS_CONFIG) then scans every named field across every surface.


Banned Terms

Every banned term has a preferred Canopy equivalent and a one-line rationale. If the rule is wrong for your case, use the HTML comment ignore markers (see Exemption Rules). Do not silently break the rule.

Banned Preferred Why

| task | Outcome | Outcomes describe results; tasks describe actions. Different ontology. | | ticket | Issue | "Ticket" is Jira/Linear/Zendesk heritage; Canopy uses Issue. | | story | Outcome | Scrum heritage; Canopy does not have stories. | | user story | Outcome | Same as story. The "as a X I want Y" template is a writing crutch, not a primitive. | | epic | Initiative | Scrum heritage; Canopy uses Initiative for cross-cutting work. | | sprint | (no equivalent) | Canopy is continuous flow. There is no time-box. | | backlog | Later | "Backlog" implies infinite queue; Later is a deliberate priority. | | standup | Signal activity feed | Daily ceremonies cost more than they signal. The activity feed is async. | | stand-up | Signal activity feed | Same as standup. | | stand up | Signal activity feed | Same as standup. | | retro | Decision Log review | "Retro" is a Scrum ceremony. The Decision Log is the audit trail. | | retrospective | Decision Log review | Same as retro. | | velocity | throughput | Velocity invites comparison and gaming; throughput is just a count. | | story point | (no equivalent) | Canopy does not estimate effort. Lead time is the measurement. | | story points | (no equivalent) | Same. | | definition of done | success criteria | Per-Outcome success criteria replace a global definition of done. | | P0 | Now | Canopy uses Now/Next/Later. | | P1 | Now | Same. | | P2 | Next | Same. | | P3 | Later | Same. | | P4 | Later | Same. | | P5 | Later | Same. | | Critical | Now | Severity tiers collapse to Now/Next/Later. | | High | Now | Same. | | Medium | Next | Same. | | Low | Later | Same. | | awaiting-approval | awaiting_approval | Snake_case is canonical. Kebab-case drifts in. | | Awaiting Approval | awaiting_approval | Same. Title-case is for headings, not stage names. | | AwaitingApproval | awaiting_approval | Same. CamelCase is for type identifiers, not stage names. | | awaitingApproval | awaiting_approval | Same. | | value-add | (state the actual value) | "Value-add" is consultant filler. Name the actual value. | | low-hanging fruit | (name the actual work) | Consultant filler. Name the Outcome. | | synergy | (name the actual interaction) | Consultant filler. Describe what actually couples. | | deliverable | Outcome | "Deliverable" is consultant heritage; Canopy uses Outcome. |


Exemption Rules

Some legitimate uses require a banned term. Wrap them with ignore markers so the CI check skips the region. Two marker styles are supported:

Markdown / HTML — use in .md and .mdx files:

<!-- vocab-ignore-start -->
Anti-pattern: Build booking API → Customers can book appointments online
<!-- vocab-ignore-end -->

JS / TS / TSX — use in .ts and .tsx files where HTML comments are invalid:

/* vocab-ignore-start */
const painPoints = [
  { title: "Sprints waste time", desc: "..." },
];
/* vocab-ignore-end */

Two canonical exemption cases:

1. Anti-pattern callouts. The "❌ Build booking API → ✅ Customers can book appointments online" pattern in OUTCOMES.md needs to show the banned word ("Build booking API") in order to teach the rewrite. Wrap the bad-side examples.

2. Third-party tool names. When quoting "Jira ticket", "Linear issue", "Scrum sprint" as proper nouns referring to the external tool, wrap the quote. Do not silently rewrite proper nouns; just exempt them.

Fenced code blocks (```...```) are skipped automatically — literal code samples do not need vocabulary discipline.

Two files are self-exempt and never checked: VOCABULARY.md (contains the banned terms in the banned-terms column by design) and PORTFOLIO.md (may quote third-party tool names without ceremony).


How It's Enforced

A custom Node script (scripts/check-vocabulary.cjs) reads this file's ## Banned Terms table, derives a regex set, walks docs/methodology/ and apps/site/app/, and exits non-zero on hits. Run locally:

npm run check:vocab

The same script runs in CI as the docs↔site drift gate (one CI step, two purposes). If you add a new banned term and existing docs trip it, fix the docs in the same commit — the gate never ships broken to main.

No external linter (Vale, alex) — yet. The custom regex is sufficient for v1. When the rule set outgrows regex, revisit.


Adding a New Banned Term

  1. Add a row to ## Banned Terms above. Include the preferred equivalent and a one-line "Why".
  2. Ensure the preferred equivalent appears in ## Preferred Terms above. If it is a new concept, add it.
  3. Run npm run check:vocab to verify no existing docs trip the new rule. If they do, fix them in the same commit. Do not land a banned-term addition with existing violations — the gate must stay green.

Source of truth: this file. If METHOD.md or any other doc contradicts what is here, this file wins for the vocabulary question. For methodology semantics, METHOD.md still wins.