Tiers & approval gates

Every command declares a tier in its frontmatter. Tiers decide whether a command runs directly, asks once, or opens a full gate with alternatives.

The three tiers

LIGHT

<5k tokens

Runs directly. No gate. Safe reads, status checks, small utilities.

Examples:

  • /hub:status
  • /hub:help
  • /hub:ledger
  • /hub:preview

MEDIUM

~10k–60k

One-line preview + y/n/tweak prompt. Single-agent dispatch.

Examples:

  • /hub:debug
  • /hub:plan
  • /hub:brainstorm
  • /hub:test generate

HEAVY

~40k–250k

Full gate: planned agents, skills, token estimate, MoSCoW scope, ≥2 alternatives.

Examples:

  • /hub:create
  • /hub:enhance
  • /hub:deploy
  • /hub:orchestrate

What the HEAVY gate looks like

Before any HEAVY command runs, the model shows a block like this and waits for approval:

HEAVY — /hub:create "Next.js SaaS with Stripe"

Planned agents:
  - hub:project-planner      (plan.md, task graph)
  - hub:backend-specialist   (API routes, webhooks)
  - hub:frontend-specialist  (landing, dashboard, pricing)
  - hub:database-architect   (schema for users + subscriptions)
  - hub:devops-engineer      (Vercel + Stripe CLI config)

Skills loaded:
  nextjs-react-expert, tailwind-patterns, api-patterns,
  database-design, deployment-procedures, clean-code

Token estimate:  ~140k   (P50: ~110k, P95: ~190k)
Session budget:  OK (6.2M / 10M)

MoSCoW scope:
  MUST  — landing, checkout, webhook, dashboard skeleton
  SHOULD — pricing tiers, password reset
  COULD — email confirmations, audit log
  WON'T — SSO, team invites (left for /hub:enhance later)

Lighter alternatives:
  A) /hub:enhance   — if you already have a Next.js base
  B) /hub:plan only — ship the plan first, build tomorrow

Proceed? [y/n/tweak]

Bypassing gates

Pass --yes or -y as the first argument after the command. Usage still logs to .hub/usage.json.

/hub:create -y "Next.js SaaS with Stripe"

Where tiers come from

Each command file (commands/<name>.md) declares its tier in the frontmatter. The approval-gate skill reads that field, renders the correct gate, and appends a row to the usage log. You can hand-override by editing the frontmatter, but the declared tier should reflect real observed spend.

The /hub:ledger by-tiercommand shows observed token spend per tier in your project. If a command's observed tier is consistently different from declared, that's a contribution worth sending upstream.