Agent Reference

The Kanban System

A complete guide to using the kanban board programmatically. Create projects, manage tasks, run autonomous sprints, and build self-improving pipelines.

01 Core Concepts

The kanban system is a Next.js app artifact published at /pub/main/kanban-v2/. It manages work through a hierarchy of projects, columns, and tasks, all backed by a shared SQLite database.

P

Projects

Top-level work containers. Each project has its own columns, tasks, settings, and agent mode configuration.

C

Columns

Workflow stages within a project. Typically: To Do, In Progress, Done. Customizable per project with definition-of-done rules.

T

Tasks

Individual work items with title, description, priority, labels, subtasks, acceptance criteria, tests, comments, and images.

D

Dependencies

Tasks can depend on other tasks. Blocked tasks show a "deps" badge. Auto Mode respects dependency ordering.

Database Tables

All data lives in the shared SQLite database. Key tables:

TablePurpose
kanban_projectsProject definitions with name, description, color, agent_mode
kanban_columnsColumns per project with position and color
kanban_tasksTasks with full metadata, agent_task_id for assignment tracking
kanban_subtasksOrdered subtask checklists per task
kanban_acceptance_criteriaVerifiable outcomes per task
kanban_testsManual or integration test definitions per task
kanban_commentsDiscussion thread per task
task_dependenciesDAG of task-to-task dependencies
kanban_settingsGlobal settings (auto_mode_enabled, etc.)
research_sessionsAI research sessions attached to tasks

02 API Reference

All endpoints are relative to the kanban artifact base URL. From agents running in the same system, use the Dashboard API proxy.

Base URL From agents: http://localhost:4000/pub/main/kanban-v2/api/
From browser: relative paths like api/projects

Projects

MethodEndpointDescription
GET/api/projectsList all projects
POST/api/projectsCreate a project {name, description, color}
PATCH/api/projects/[pid]Update a project
DEL/api/projects/[pid]Delete a project and all its tasks
GET/api/projects/[pid]/boardFull board state: columns + tasks

Tasks

MethodEndpointDescription
POST/api/tasksCreate a task {title, description, project_id, column_id, priority, labels, size_category}
PATCH/api/tasks/[id]Update task fields
DEL/api/tasks/[id]Delete a task
POST/api/tasks/[id]/moveMove to column {column_id, position}
POST/api/tasks/[id]/assign-agentSpawn an agent to work on this task
POST/api/tasks/[id]/unassign-agentRemove agent assignment
POST/api/tasks/[id]/auto-fillAI generates subtasks, tests, and acceptance criteria

Subtasks & Tests

MethodEndpointDescription
POST/api/tasks/[id]/subtasksAdd subtask {title}
PATCH/api/subtasks/[sid]Toggle done: {toggle: true}
POST/api/tasks/[id]/testsAdd test {title, type}
PATCH/api/tests/[tid]Update test status: {status: "passed"}
POST/api/tasks/[id]/acceptance-criteriaAdd criterion {title}
POST/api/tasks/[id]/commentsAdd comment {content}

Dependencies

MethodEndpointDescription
GET/api/tasks/[id]/dependenciesList task dependencies
POST/api/tasks/[id]/dependenciesAdd dependency {depends_on_task_id}
DEL/api/tasks/[id]/dependencies/[depId]Remove dependency
GET/api/dependencies/nextGet next unblocked task (for auto-mode)

Example: Create a Full Task

bash
# Create the task
curl -s -X POST "http://localhost:4000/pub/main/kanban-v2/api/tasks" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "[Build] Add search to web3-skills explorer",
    "description": "## Objective\nAdd fuzzy search...\n\n## Target Artifact\n/workspace/group/pub/web3-skills/",
    "project_id": 11,
    "column_id": 41,
    "priority": "high",
    "labels": "build, artifact, search",
    "size_category": "M"
  }'

# Add subtasks
curl -s -X POST "http://localhost:4000/pub/main/kanban-v2/api/tasks/735/subtasks" \
  -H "Content-Type: application/json" \
  -d '{"title": "Implement fuzzy search index"}'

# Add a dependency (depends on task 724)
curl -s -X POST "http://localhost:4000/pub/main/kanban-v2/api/tasks/735/dependencies" \
  -H "Content-Type: application/json" \
  -d '{"depends_on_task_id": 724}'

# Assign an AI agent to work on it
curl -s -X POST "http://localhost:4000/pub/main/kanban-v2/api/tasks/735/assign-agent"

03 Task Lifecycle

To Do ───────────> In Progress ───────────> Done │ Task created │ Agent assigned │ Task moved │ Description written │ Subtasks progressed │ Results in description │ Dependencies set │ Tests executed │ Auto-mode picks next │ Subtasks added │ Comments logged │ Knowledge synthesized

Task Fields

Moving Tasks

Move a task between columns using the move endpoint. This is how agents signal completion:

bash
# Move task 721 to "Done" column (column_id 43)
curl -s -X POST "http://localhost:4000/pub/main/kanban-v2/api/tasks/721/move" \
  -H "Content-Type: application/json" \
  -d '{"column_id": 43, "position": 0}'
Agent completion pattern When an agent finishes a task, it should: (1) update the task description with results, (2) mark all subtasks done, (3) move the task to Done, (4) add a comment summarizing what was accomplished.

04 Agent Assignment

Assigning an agent to a task spawns a scheduled task that runs in the group's context. The agent reads the task description as its instructions.

How It Works

  1. Call POST /api/tasks/[id]/assign-agent
  2. The kanban server creates a scheduled task via the Dashboard API
  3. The task description becomes the agent's prompt
  4. The agent runs autonomously and interacts with the kanban API to update progress
  5. When done, the agent moves the task to Done

Agent Prompt Structure

The agent receives a structured prompt built from the task. Write task descriptions that work as agent instructions:

task description template
## Objective
What the agent should accomplish in one sentence.

## Context
Background knowledge. Reference vault notes, previous tasks, existing code.

## Tasks
1. Specific step with file paths
2. Another step with expected output
3. Final step with verification

## Target Artifact
Path to the artifact this task modifies.
Include restart_artifact instructions.

## Acceptance Criteria
- Verifiable outcome 1
- Verifiable outcome 2
- Verifiable outcome 3
Agent scope Agents run in the group's context with access to the workspace, database, and platform tools. They can read/write files, call APIs, and publish artifacts. Write task descriptions accordingly — be specific about file paths and expected outputs.

05 Dependencies & Ordering

Dependencies create a directed acyclic graph (DAG) that enforces execution order. A task is "blocked" if any of its dependencies are not in the Done column.

#720 Discovery └──> #721 Task Designer (depends on 720) └──> #722 Review (depends on 721) └──> #723 Vault Synthesis (depends on 722) └──> #724 Categorize (depends on 723) └──> #725 Build Artifact (depends on 724) └──> #726 Sprint 2 Designer (depends on 725)

Setting Dependencies via DB

You can also set dependencies directly via the database for bulk operations:

sql
-- Add sequential dependencies for tasks 727-733
INSERT INTO task_dependencies (task_id, depends_on_task_id)
VALUES (728, 727), (729, 728), (730, 729),
       (731, 730), (732, 731), (733, 732);

Checking Blocked Status

bash
# Get the next unblocked task for a project
curl -s "http://localhost:4000/pub/main/kanban-v2/api/dependencies/next?project_id=11"

# Check which tasks are blocked
curl -s "http://localhost:4000/pub/main/kanban-v2/api/dependencies/blocked?project_id=11"

06 Auto Mode

Auto Mode automatically assigns an agent to the next unblocked task when the current one completes. Combined with dependencies, this creates a fully autonomous pipeline.

Enabling Auto Mode

via API
# Toggle auto mode on
curl -s -X POST "http://localhost:4000/pub/main/kanban-v2/api/auto-mode/toggle" \
  -H "Content-Type: application/json" \
  -d '{"enabled": true}'

# Check status
curl -s "http://localhost:4000/pub/main/kanban-v2/api/auto-mode/status"
Agent completes task #721 └──> Auto Mode checks dependencies └──> #722 is now unblocked └──> Agent spawned for #722 └──> #722 completes └──> Auto Mode checks again...
Set it and forget it With Auto Mode enabled and proper dependencies set, you can kick off a sprint by assigning just the first task. The rest of the pipeline runs autonomously.

07 Research Engine

The kanban board includes a built-in research engine that can run multi-round AI research sessions attached to tasks. Research findings can be converted into new tasks.

S

Sessions

A research session runs N rounds of AI analysis on a prompt, accumulating findings across rounds.

F

Findings

Each round produces typed findings: insights, action items, questions, recommendations, risks, opportunities.

P

Proposals

Findings can generate task proposals. Accept them to create kanban tasks automatically.

T

Templates

Reusable research prompt templates. Fork, customize, and share across projects.

Research Patterns

08 Recursive Task Resolution

The most powerful pattern in the kanban system: tasks that create tasks. A task-designer task is like a Promise — unresolved at write time, it synthesizes all prior work just-in-time when executed.

The Promise Analogy

Traditional task: "Fix login bug in auth.js line 42" Fully resolved at write time. Brittle. Promise task: "Read Sprint 1 outputs, design Sprint 2 tasks" Unresolved at write time. Resolves JIT with full context. Self-correcting. Adaptive.

Task Type Taxonomy

D

Discovery

Data producers. Audit, research, enumerate. Output: structured reports that downstream tasks consume.

T

Task Designer

Promise resolvers. Read accumulated context, create N implementation tasks with full descriptions.

I

Implementation

Resolved work. Created by task-designers with precise file paths and acceptance criteria.

R

Review

Quality gates. Audit all sprint outputs, flag gaps, validate architecture.

V

Vault Synthesis

Knowledge consolidation. Process learnings into permanent vault notes.

M

Meta / Sprint Designer

Self-replication. Reads EVERYTHING from the current sprint, creates the next one.

The Self-Improving Loop

Sprint N: [Discovery] -> [Task Designer] -> [Impl 1..N] -> [Review] -> [Vault] -> [Sprint N+1 Designer] | Sprint N+1: v [Discovery+] -> [Task Designer] -> [Impl 1..N] -> [Review] -> [Vault] -> [Sprint N+2 Designer] Each sprint has strictly more context than the previous one. The project improves itself because later sprints learn from earlier ones.

Artifact Accumulation

Promise tasks become even more powerful when every task targets the same artifact:

Sprint 1: Create web3-skills artifact with basic filtering -> Express app + skills-taxonomy.json + grid view Sprint 2: Task-Designer reads Sprint 1 artifact, creates: -> "Add capability vector visualization" -> "Add skill comparison view" -> "Add search functionality" Each task enhances the SAME artifact Sprint 3: Has full context of Sprint 1 + 2 artifact -> "Add integration testing" -> "Add user annotations" Artifact grows richer with each sprint
Anti-pattern: Resolving too early Never manually create Sprint 3 tasks during Sprint 1. The whole point is deferred resolution — let the Sprint 2 meta-task create Sprint 3 tasks with full context from Sprint 2's outputs.

09 Expansion Tasks

Beyond the standard task types, Expansion tasks are a higher-order pattern. They don't just continue a project — they reimagine it. An expansion task takes the current state of an artifact and asks: what could this become?

Three Expansion Modes

G

Goal-Driven

Takes explicit goals as input. "Add multi-chain support." "Make it work for DAOs." The expansion task reads the current artifact and designs tasks to reach the goal.

S

Synthesized

No goals given — the agent synthesizes them. It reads the artifact, vault notes, user feedback, and research findings to identify the highest-value expansion direction.

R

Reimagined

The most creative mode. The agent challenges the artifact's fundamental assumptions. What if we rebuilt this with a different architecture? What if we merged it with another artifact?

Expansion Task Template

task description
## Objective
[Expand / Refine / Reimagine] the {artifact-name} artifact.

## Expansion Mode
[goal-driven | synthesized | reimagined]

## Goals (if goal-driven)
- Goal 1: ...
- Goal 2: ...

## Context Sources (read all before designing)
- Current artifact: /workspace/group/pub/{artifact-name}/
- Vault notes: search vault for related knowledge
- Research findings: check research_findings table for this project
- User feedback: check kanban_comments on completed tasks
- Shared vault: vault_search_shared("{domain}") for cross-group insights

## Tasks
1. Read and analyze the current artifact thoroughly
2. If synthesized mode: identify 3-5 expansion directions, rank by value
3. If reimagined mode: challenge 3 core assumptions, propose alternatives
4. Design 8-12 implementation tasks for the chosen direction
5. Each task must target the existing artifact (not create a new one)
6. Include a backup task BEFORE any destructive changes
7. End with a new expansion task for the next cycle

## Acceptance Criteria
- Expansion direction justified with evidence from context sources
- All new tasks reference the target artifact
- Backup created before any architectural changes
- Next expansion task created at the end

How Expansion Differs from Sprint Design

Sprint Designer: Reads sprint outputs -> Creates next sprint Continues the current trajectory Linear progression Expansion Task: Reads EVERYTHING (artifact + vault + research + feedback) Questions the trajectory itself Can pivot, expand scope, merge artifacts, or simplify Reimagine Task: Reads everything + challenges assumptions Can propose architectural rewrites MUST create backup first

The Expansion Cycle

Expansion tasks create a second loop on top of the sprint loop:

Inner loop (sprints): Sprint 1 -> Sprint 2 -> Sprint 3 -> Expansion -> Sprint 4 -> Sprint 5 -> ... | v Re-evaluates direction Synthesizes new goals May pivot the project Creates backup first Designs Sprint 4 with potentially new scope
When to use each expansion mode Goal-driven: User gives you a clear direction. "Add voting to ideaLabs." No ambiguity.
Synthesized: After 3+ sprints with no user direction. The agent decides what's most valuable.
Reimagined: When the artifact feels stale, or research reveals a fundamentally better approach. Always backup first.

Expansion + Artifact Merging

The most powerful expansion pattern: merging two artifacts into one. When an expansion task notices that two artifacts serve overlapping purposes, it can propose a merge:

example: merge proposal
## Expansion: Merge web3-skills into idealabs
The web3-skills explorer (52 skills, filtering, taxonomy) would be
more valuable embedded in the ideaLabs platform as a "capabilities"
tab that links skills to hackathon ideas.

## Merge Plan
1. backup_artifact_db(name="web3-skills")
2. backup_artifact_db(name="idealabs")
3. Copy web3-skills data into idealabs schema
4. Build "Capabilities" tab in idealabs UI
5. Redirect web3-skills to idealabs/capabilities
6. Unpublish standalone web3-skills after verification

10 Platform Safety & Backup

Every task that modifies an artifact should include safety checkpoints. Emblem:build provides backup, restore, and cross-publish tools that agents should use proactively.

Backup Capabilities

B

Database Backup

backup_artifact_db(name) — dumps all declared tables to .emblem_build/db-backup.sql. Idempotent, re-runnable.

R

Database Restore

restore_artifact_db(name) — applies backup SQL. Validates against package.json manifest. Schema-only mode available.

P

Cross-Publish

cross_publish_artifact(peer_id, name, ...) — push artifact + data to a remote Emblem:build instance.

E

Export Project

GET /api/projects/[pid]/export — export full project state (tasks, subtasks, deps) as JSON.

Table Registration (Required)

Before backup/restore works, tables must be registered in the artifact's package.json:

package.json
{
  "name": "my-artifact",
  "emblem_build": {
    "tables": [
      {
        "name": "items",
        "schema": "CREATE TABLE IF NOT EXISTS items (id TEXT PRIMARY KEY, name TEXT, data TEXT, created_at TEXT DEFAULT (datetime('now')))"
      }
    ]
  }
}
No manifest = no backup backup_artifact_db refuses to run if emblem_build.tables is missing or empty. Always register tables first. Tables not listed are invisible to backup/restore.

When to Backup

SituationActionCommand
Before risky schema migrationFull backupbackup_artifact_db(name="my-app")
Before expansion/reimagine taskFull backupbackup_artifact_db(name="my-app")
Before merging artifactsBackup BOTH artifactsTwo backup calls
Before cross-publishingBackup to ship data with artifactbackup_artifact_db then cross_publish_artifact
After successful sprintCheckpoint backupbackup_artifact_db(name="my-app")
Shipping schema only (fresh start)Schema-only backupbackup_artifact_db(name="my-app", schema_only=true)

Rollback Pattern

If something goes wrong during a sprint or expansion:

rollback workflow
# 1. Before risky work — create checkpoint
backup_artifact_db(name="web3-skills")

# 2. Do the risky work...
#    (schema migration, data transform, etc.)

# 3. If something broke — rollback
restore_artifact_db(name="web3-skills")
restart_artifact(name="web3-skills")

# 4. If everything worked — backup the new state
backup_artifact_db(name="web3-skills")

Cross-Publishing for Redundancy

For critical artifacts, cross-publish to a linked peer as an off-site backup:

cross-publish workflow
# 1. Backup database to include data in the push
backup_artifact_db(name="web3-skills")

# 2. Check available peers
list_peer_links()

# 3. Push to remote peer
cross_publish_artifact(
  peer_id="peer-xxx",
  name="web3-skills",
  source_path="pub/web3-skills",
  type="app",
  entry_point="node server.js",
  is_public=true
)

# Remote restores db-backup.sql automatically on boot

Safety Checklist for Tasks

Every task description that modifies an artifact should include these safety steps:

Include in every implementation task
  1. Read the current artifact state before making changes
  2. Run backup_artifact_db before schema changes or data migrations
  3. Make changes incrementally — verify after each step
  4. Run restart_artifact and verify the artifact loads
  5. Run backup_artifact_db again after successful changes (new checkpoint)
  6. Add a comment to the task documenting what changed

Kanban Project Export

Export an entire project's state for archival, migration, or cross-instance transfer:

bash
# Export full project state as JSON
curl -s "http://localhost:4000/pub/main/kanban-v2/api/projects/11/export" \
  | jq . > /workspace/group/backups/recursiveWeb3-export.json

# Includes: project metadata, columns, tasks, subtasks,
# acceptance criteria, tests, comments, dependencies,
# research sessions, findings, proposals

Vault as Backup Context

The vault provides semantic backup — even if an artifact is lost, vault notes preserve the knowledge that built it:

Artifact = code + data + UI (recoverable from backup) Vault = decisions + patterns + learnings (semantic context) Kanban = task history + comments + research (process record) Together, these three give you full recovery capability: • Restore artifact from db backup • Rebuild artifact using vault knowledge + kanban task history • Reproduce decisions from research session findings

11 Database Patterns

Every artifact that persists data uses the shared SQLite database. Understanding how to design, document, and manage schemas is critical for building reliable artifacts.

Access Methods

M

MCP Tools (Agents)

db_schema(), db_query(sql), db_execute(sql) — direct access for agents. Use for schema setup, ad-hoc queries, and migrations.

A

Dashboard API (Apps)

GET /api/db/{group}/database/query?sql=... and POST /api/db/{group}/database/execute — server-side only, never from browser.

Never access the .db file directly No sqlite3 CLI, no direct file reads. Always use MCP tools (agents) or Dashboard API (app servers). Direct access causes locking issues and bypasses access controls.

Schema Design Principles

Documenting Schemas

Every artifact's schema should be documented in three places:

1. package.json emblem_build.tables — machine-readable manifest Required for backup/restore. Source of truth. 2. Vault note vault/Notes/{artifact}-database-schema.md Human-readable documentation with rationale. Why each table exists. Relationships. Queries. 3. Task comments Comments on tasks that modified the schema. Changelog: what changed, why, migration SQL.

Schema Documentation Template

vault note template
---
description: Database schema for {artifact-name} — {N} tables covering {domain}
topics: [platform, database, {artifact-name}]
---

# {Artifact Name} Database Schema

## Overview
Brief description of what data the artifact manages and why.

## Tables

### {table_name}
Purpose: What this table stores and why.
Relationships: FK to {other_table}, referenced by {other_table}.

| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER PK | Auto-increment primary key |
| name | TEXT NOT NULL | Display name |
| created_at | TEXT | ISO timestamp, defaults to now |

Key queries:
- List active items: `SELECT * FROM {table} WHERE status = 'active'`
- Count by category: `SELECT category, COUNT(*) FROM {table} GROUP BY category`

### {next_table}
...

## Migrations
| Date | Change | SQL |
|------|--------|-----|
| 2026-04-19 | Added status column | `ALTER TABLE items ADD COLUMN status TEXT DEFAULT 'active'` |

## Relationships Diagram
{table_a} 1──N {table_b} (via table_a_id FK)
{table_b} 1──N {table_c} (via table_b_id FK, CASCADE)

Migration Patterns

SQLite has limited ALTER TABLE support. Use these patterns:

safe migration patterns
# Adding a column (safe, always works)
db_execute("ALTER TABLE items ADD COLUMN status TEXT DEFAULT 'active'")

# Adding an index (safe)
db_execute("CREATE INDEX IF NOT EXISTS idx_items_status ON items(status)")

# Renaming a column (SQLite 3.25+)
db_execute("ALTER TABLE items RENAME COLUMN old_name TO new_name")

# Complex migration (recreate table)
# 1. Backup first!
backup_artifact_db(name="my-app")

# 2. Create new table with desired schema
db_execute("CREATE TABLE items_new (id INTEGER PRIMARY KEY, ...)")

# 3. Copy data
db_execute("INSERT INTO items_new SELECT ... FROM items")

# 4. Swap tables
db_execute("DROP TABLE items")
db_execute("ALTER TABLE items_new RENAME TO items")

# 5. Verify and backup new state
backup_artifact_db(name="my-app")

The Dashboard API Pattern (App Artifacts)

Published app artifacts access the database through the Dashboard API. The browser talks to your server, your server talks to the API:

Browser ──fetch('api/items')──> Your Server (PORT) ──fetch(DASHBOARD_BASE)──> Dashboard API ──> SQLite NEVER this: Browser ──fetch('/api/db/...')──> Dashboard API ← CORS error, security risk Browser ──sqlite3 ...──> .db file directly ← locking, no auth
server.js — database proxy pattern
const API = process.env.DASHBOARD_BASE || 'http://localhost:4000';
const TOKEN = process.env.DASHBOARD_TOKEN;
const GROUP = process.env.ARTIFACT_GROUP || 'main';

// Read endpoint
app.get('/api/items', async (req, res) => {
  const sql = 'SELECT * FROM items WHERE status = ? ORDER BY created_at DESC LIMIT 50';
  const r = await fetch(
    `${API}/api/db/${GROUP}/database/query?sql=${encodeURIComponent(sql)}¶ms=${encodeURIComponent(JSON.stringify(['active']))}`,
    { headers: { Authorization: `Bearer ${TOKEN}` } }
  );
  const data = await r.json();
  res.json(data.rows || []);
});

// Write endpoint
app.post('/api/items', express.json(), async (req, res) => {
  const sql = 'INSERT INTO items (name, category) VALUES (?, ?)';
  const r = await fetch(`${API}/api/db/${GROUP}/database/execute`, {
    method: 'POST',
    headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({ sql, params: [req.body.name, req.body.category] })
  });
  res.json(await r.json());
});
Always use relative URLs in browser code fetch('api/items') not fetch('/api/items'). Your artifact is served at /pub/{group}/{name}/ and the proxy strips that prefix. Absolute paths bypass your server entirely.

Schema Discovery

When working with an unfamiliar artifact, discover its schema:

discovery workflow
# 1. Inspect the artifact (shows registered tables)
inspect_artifact(name="kanban-v2")

# 2. Get full schema from the database
db_schema()

# 3. Check package.json for the manifest
cat /workspace/group/kanban-v2/package.json | jq '.emblem_build.tables'

# 4. Run sample queries to understand the data
db_query("SELECT COUNT(*) as n, typeof(id) as id_type FROM kanban_tasks")
db_query("SELECT sql FROM sqlite_master WHERE type='table' AND name LIKE 'kanban_%'")

12 Best Practices

Writing Task Descriptions

Task descriptions are agent instructions. The better they are, the better agents perform.

Sprint Sizing

Dependency Design

The Golden Rule

Every task should leave the artifact better than it found it Don't produce reports that sit in the vault — produce reports AND update the artifact. Discovery finds 52 skills? Update the artifact's data. Review finds a gap? Fix it in the artifact. Vault synthesis extracts patterns? Add a "patterns" page to the artifact. Backup the artifact before risky changes. Backup it again after successful changes. Document what you changed in a task comment.

Tasks Creating Tasks

Tasks are allowed — and encouraged — to create other tasks. This is what makes the system recursive. But there are rules about when a task should spawn new tasks to protect sprint velocity.

Default Behavior

By default, when an agent discovers additional work during a task, it should:

  1. Log the finding as a comment on the current task
  2. Create a new task in the To Do column tagged for the next sprint
  3. Continue working on its current task without scope creep

This prevents sprint blowout. A discovery task that finds 5 unexpected issues should not spawn 5 urgent tasks mid-sprint — it should document them and let the next sprint's task-designer prioritize them with full context.

Project Notes as Permission Grants

Project notes (kanban_project_notes) can grant agents explicit permission to create tasks for the current sprint. This is the escape hatch for critical issues.

project note example
## Task Creation Policy

### Immediate (current sprint)
Agents may create and assign tasks in the current sprint ONLY for:
- Security vulnerabilities discovered during implementation
- Broken dependencies that block other tasks
- Data loss risks that need immediate mitigation

These tasks should be tagged "hotfix" and sized XS or S.

### Deferred (next sprint)
ALL other discovered work goes to the next sprint:
- Feature ideas discovered during implementation
- Refactoring opportunities
- Nice-to-have improvements
- Non-blocking bugs

Tag these "discovered, sprint-N+1" so the next task-designer
can incorporate them with full context.
Velocity protection A sprint planned for 10 tasks that balloons to 25 mid-sprint is a failed sprint. The whole point of deferred resolution is that future sprints absorb discovered work with context. An agent that spawns immediate tasks for every issue it finds is doing waterfall planning inside an agile sprint. Use the project notes to define what qualifies as "immediate" — everything else waits.

The Task Creation Decision Tree

Agent discovers additional work during a task ├── Is it a security/data-loss/blocking issue? │ ├── YES: Check project notes for permission │ │ ├── Permission granted: Create hotfix task, current sprint │ │ └── No permission: Comment on task, flag for human review │ └── NO: ├── Is it directly related to the current task? │ ├── YES: Add as a subtask on the current task │ └── NO: └── Create task tagged "discovered, sprint-N+1" Add to To Do column for next sprint's task-designer Log the discovery as a comment on current task