Scope Management
Intro
A Scope is a named, bounded container that groups related entities — a sprint, a milestone, a project, a release, a quarter. WorkItems, Processes, and Bindings reference scopes to say "I apply within this container."
MCP server. This skill ships a self-contained MCP server at
mcp/server.py(PEP 723 script — requiresuvand Python ≥ 3.10 on PATH). Agent harnesses reach its tools by reading a single MCP config file at startup, so the contents ofmcp/mcp-config.jsonmust be merged into the harness's MCP config and placed at the harness-specific path before this skill is usable. If processkit was installed by an installer, that wiring is the installer's responsibility; if processkit was installed manually, the project owner must do it by hand.
Overview
Kinds of scopes
| kind | Example |
|---|---|
sprint |
2-week iteration boundary |
milestone |
Named delivery target |
quarter |
Calendar quarter for OKRs |
project |
Long-lived initiative |
release |
A specific release version |
other |
Custom boundary |
Shape
---
apiVersion: processkit.projectious.work/v1
kind: Scope
metadata:
id: SCOPE-sprint-42
created: 2026-04-01T00:00:00Z
spec:
name: "Sprint 42"
kind: sprint
state: active
starts_at: 2026-04-01
ends_at: 2026-04-14
description: "Two weeks focused on the lint command and docs-site bootstrap."
goals:
- "Ship aibox lint v1"
- "Publish processkit docs-site"
---
Workflow
- Pick an ID:
SCOPE-<short-name>(e.g.,SCOPE-sprint-42,SCOPE-q2-2026). - Set
kindandstate(planned/active/completed/cancelled). - Set
starts_at/ends_atfor time-bounded scopes. - Write goals as concrete, testable bullet points.
- Save to
context/scopes/, logscope.created.
Using scopes
Reference via spec.scope: SCOPE-... on WorkItems, or use a Binding
(type: work-scope) when the scope relationship is temporal and an item
can move in or out of scope during its lifetime.
Gotchas
Agent-specific failure modes — provider-neutral pause-and-self-check items:
- Treating a Scope like a folder. Scope is a conceptual container, not a directory. Don't move files based on scope membership; reference the SCOPE-ID from entities and let the index resolve membership.
- Creating overlapping Scopes that double-count work. "Sprint 42" and "Q2 OKRs" can both contain the same workitem, but be explicit about which is the primary scope vs which is a secondary categorization. Otherwise reports double-count.
- Using
spec.scopedirectly when membership is temporal. If a workitem moves into and out of a sprint over its lifetime, use a Binding (type: work-scope) instead of pinningspec.scope. The Binding carriesvalid_from/valid_until; the field doesn't. - Forgetting to transition Scope state. Scopes have a
lifecycle:
planned → active → completed → cancelled. A Scope that saysstate: activefor six months past its end date poisons every "what's the current sprint" query. - Hallucinating SCOPE-IDs. When asked to add work to "the
current sprint", call
list_scopes(state: active)first. Don't inventSCOPE-sprint-42if it doesn't exist — create it explicitly viacreate_scope. - Reusing a Scope across different timeframes. "Sprint 42" in
Q2 2025 and "Sprint 42" in Q2 2026 are different Scopes — same
number, different time. Use distinct IDs
(
SCOPE-2025-Q2-sprint-42andSCOPE-2026-Q2-sprint-42) so history is unambiguous. - Naming scopes ambiguously. "Q1" without a year is meaningless in three months. Always include the year and the kind in the name; the ID can stay short.
Full reference
Fields
| Field | Type | Notes |
|---|---|---|
name |
string | Human-readable. Shown in listings. |
kind |
enum | sprint/milestone/quarter/project/release/other |
state |
enum | planned/active/completed/cancelled |
starts_at |
date | Optional. For time-bounded scopes. |
ends_at |
date | Optional. |
goals |
list[string] | Concrete outcomes expected. |
description |
string | Longer context. |
parent |
string | Optional parent scope (quarter → sprint). |
Nested scopes
A sprint can be nested within a quarter via spec.parent. Queries resolve
transitively: "all work in Q2 2026" includes all sprints that sit inside it.
Closing a scope
When a scope ends:
- Set
state: completed. - Log
scope.completed. - Do not delete the file — historical WorkItems reference it.
- Optionally write a retrospective DecisionRecord linked via
spec.related_decisions.