|
| 1 | +# Crystal Projects v2 — canonical schema and views |
| 2 | + |
| 3 | +The Crystal mission portfolio is materialised as a single GitHub Projects v2 |
| 4 | +board: **Crystal Missions** at https://github.com/users/Malakof/projects/1. |
| 5 | +This document is the canonical reference for the project's custom fields, |
| 6 | +canonical views, and policies. |
| 7 | + |
| 8 | +> **Status**: v1.0.2 — schema codified, views to be created via UI per |
| 9 | +> §2 below. Auto-sync from paperclip kernel will land in v1.1.0. |
| 10 | +
|
| 11 | +## 1. Custom fields |
| 12 | + |
| 13 | +| Field | Type | Values | |
| 14 | +|---|---|---| |
| 15 | +| Title | text (default) | issue title | |
| 16 | +| Status | single-select (default) | Todo, In Progress, Done | |
| 17 | +| Mission code | text | `<REPO_PREFIX>-<TYPE>-<NUM>` (see [`README.md §3.1`](./README.md#31-mission-codes)) | |
| 18 | +| Priority | single-select | `p0`, `p1`, `p2`, `p3` | |
| 19 | +| Type | single-select | `epic`, `feature`, `bug`, `chore`, `docs`, `refactor`, `spike`, `test` | |
| 20 | +| Stream | single-select | `atlas`, `beacon`, `forge`, `compass` | |
| 21 | +| Runtime | single-select | `claude`, `codex`, `openhands` | |
| 22 | +| Release | text | `v1.0.0`, `v1.0-rc1`, `v2.0`, free form | |
| 23 | +| Repository | text (default) | auto from issue source | |
| 24 | +| Labels | text (default) | mirrored from the issue | |
| 25 | +| Linked pull requests | default | auto | |
| 26 | +| Milestone | default | auto | |
| 27 | +| Parent issue | default | auto | |
| 28 | +| Sub-issues progress | default | auto | |
| 29 | + |
| 30 | +Fields named in the canonical taxonomy mirror the labels documented in |
| 31 | +[`labels.yaml`](./labels.yaml). When the paperclip kernel projection is |
| 32 | +enabled (v1.1.0+), values are written by the kernel and **never edited |
| 33 | +manually**. |
| 34 | + |
| 35 | +## 2. Canonical views |
| 36 | + |
| 37 | +These six views are the supported lenses on the project. They are created |
| 38 | +manually via the GitHub UI today; v1.1.0 will provide a script to apply |
| 39 | +them via GraphQL. |
| 40 | + |
| 41 | +### View 1 — Operations Kanban (`Status`) |
| 42 | + |
| 43 | +- **Layout**: Board |
| 44 | +- **Group by**: Status |
| 45 | +- **Sort**: Priority ascending (p0 first) |
| 46 | +- **Columns shown**: Title, Mission code, Priority, Type, Repository, |
| 47 | + Assignees |
| 48 | +- **Filter**: `is:open` AND (`Type` is not `epic`) |
| 49 | +- **Purpose**: daily ops view of in-flight work, excludes EPICs which |
| 50 | + are tracked separately (see View 4). |
| 51 | + |
| 52 | +### View 2 — Priority × Stream (table) |
| 53 | + |
| 54 | +- **Layout**: Table |
| 55 | +- **Group by**: Priority |
| 56 | +- **Sort**: Stream then Mission code |
| 57 | +- **Columns shown**: Title, Mission code, Type, Stream, Runtime, Status, |
| 58 | + Repository |
| 59 | +- **Filter**: `is:open` |
| 60 | +- **Purpose**: portfolio-wide capacity planning. |
| 61 | + |
| 62 | +### View 3 — Release Roadmap |
| 63 | + |
| 64 | +- **Layout**: Roadmap (or Table grouped by Release if Roadmap not available) |
| 65 | +- **Group by**: Release |
| 66 | +- **Filter**: `Release` is not empty |
| 67 | +- **Purpose**: cross-repo release readiness at a glance. |
| 68 | + |
| 69 | +### View 4 — EPIC tree (Hierarchy) |
| 70 | + |
| 71 | +- **Layout**: Table |
| 72 | +- **Filter**: `Type` is `epic` OR `Parent issue` is not empty |
| 73 | +- **Group by**: Parent issue (if available) else Repository |
| 74 | +- **Sort**: Priority |
| 75 | +- **Purpose**: track every EPIC and its native sub-issues progress. |
| 76 | + |
| 77 | +### View 5 — Per Runtime (load balance) |
| 78 | + |
| 79 | +- **Layout**: Board |
| 80 | +- **Group by**: Runtime |
| 81 | +- **Filter**: `is:open` AND `Status` is not `Done` |
| 82 | +- **Sort**: Priority then Mission code |
| 83 | +- **Purpose**: see what each runtime (Claude, Codex, OpenHands) is |
| 84 | + currently working on. |
| 85 | + |
| 86 | +### View 6 — Triage queue |
| 87 | + |
| 88 | +- **Layout**: Table |
| 89 | +- **Filter**: label `status:triage` OR labels are empty (no `priority:p*` |
| 90 | + AND no `type:*`) |
| 91 | +- **Sort**: created date descending |
| 92 | +- **Purpose**: catch issues that need product/impl triage. |
| 93 | + |
| 94 | +## 3. Field assignment rules |
| 95 | + |
| 96 | +| Source | Fields written | When | |
| 97 | +|---|---|---| |
| 98 | +| Issue creator (human) | Title, Type, Priority, Repository (auto) | At creation via ISSUE_TEMPLATE | |
| 99 | +| Paperclip kernel (v1.1.0+) | Mission code, Status, Stream, Runtime | On every mission stage transition | |
| 100 | +| Dark factory ingestion | Mission code (if not set), Type=epic on parents | At `epic-plan` ingestion | |
| 101 | +| GitHub auto | Linked pull requests, Sub-issues progress, Milestone, Parent issue | Continuously | |
| 102 | + |
| 103 | +**Don't edit manually** what the kernel projects (Mission code, Stream, |
| 104 | +Runtime, Status when kernel-driven). Manual edits will be overwritten on |
| 105 | +the next projection. |
| 106 | + |
| 107 | +## 4. Issue intake into the project |
| 108 | + |
| 109 | +For new repos onboarded after v1.0.2, ensure they are listed in |
| 110 | +`scripts/import-issues-to-project.py:REPOS`. New issues created from the |
| 111 | +provided ISSUE_TEMPLATE forms are automatically eligible for the project |
| 112 | +once added (manually for now via `gh project item-add`, automatically in |
| 113 | +v1.1.0). |
| 114 | + |
| 115 | +## 5. Coming in v1.1.0 |
| 116 | + |
| 117 | +- Kernel-side projection: paperclip writes to Mission code / Stream / |
| 118 | + Runtime / Status on every stage transition. |
| 119 | +- GraphQL view definitions: views above codified as JSON, applied via |
| 120 | + `scripts/setup-project-views.py`. |
| 121 | +- `Crystal status` field added to extend the default `Status` with the |
| 122 | + fine-grained `triage`, `ready`, `blocked`, `needs-human` states. |
0 commit comments