From 67bb1d185f475051b38c7683cb528d29fc71c9ee Mon Sep 17 00:00:00 2001 From: NicolasVD Date: Tue, 22 Sep 2026 18:26:57 +0200 Subject: [PATCH] feat(governance): align project metadata triad with native GitHub Projects v2 fields --- .agent/personas/p1-product-planner.md | 7 ++-- .agent/personas/p4-system-architect.md | 18 +++++----- .agent/rules/agent-lifecycle.md | 2 +- .agent/rules/backlog-planner.md | 36 +++++++++---------- .agent/sidecars/sync-issue-progress.mjs | 4 +-- .agent/skills/plan-issue/SKILL.md | 17 ++++----- .agent/skills/triage-feedback/SKILL.md | 8 ++--- .agent/templates/4-pillar-spec.md | 10 +++--- .agent/templates/crashlytics-triage-issue.md | 4 +-- .agent/templates/epic-spec.md | 5 +-- .github/ISSUE_TEMPLATE/crashlytics_triage.yml | 11 +++--- AGENTS.md | 16 ++++----- ARCHITECTURE.md | 2 +- kernel.config.json | 4 +-- 14 files changed, 73 insertions(+), 71 deletions(-) diff --git a/.agent/personas/p1-product-planner.md b/.agent/personas/p1-product-planner.md index e50cd73..11ff11f 100644 --- a/.agent/personas/p1-product-planner.md +++ b/.agent/personas/p1-product-planner.md @@ -65,9 +65,10 @@ Issues are immutable upon creation (**Rule A — Append-Only**). "labels": ["", "source:"] } ``` -Set at creation and never edited thereafter: -- **Business Value ⭐**: `Core Delight ⭐` · `Habit & Retention 🔁` · `Operational & Risk ⚙️` · `Exploratory 🧪` -- **Severity 🚨** (bugs & `source:crashlytics` only): `P0 - Blocker 💥` · `P1 - Major 🔴` · `P2 - Minor 🟠` · `P3 - Trivial 🟢` +Set at creation and assigned on GitHub Projects v2: +- **Priority**: `P0` (Blocker/Fatal) · `P1` (Major) · `P2` (Minor) +- **Estimate** (co-owned with P4): Numeric estimate in days or story points +- **Status**: `Backlog` ### 3. Milestone & Cycle Scoping - Create and scope GitHub Milestones (release boundaries). diff --git a/.agent/personas/p4-system-architect.md b/.agent/personas/p4-system-architect.md index caa9574..0e4dcbb 100644 --- a/.agent/personas/p4-system-architect.md +++ b/.agent/personas/p4-system-architect.md @@ -36,7 +36,7 @@ contracts: # P4 · System Architect — Tech Lead & Android Platform Architect ## Mission -Guarantee architectural integrity across the Android stack: Clean Architecture boundaries, offline-first resilience, cloud security, and concurrency. Assign `Tech Complexity`, enforce the **Architectural Split Mandate** for Epics, and surface breaking changes before implementation begins. +Guarantee architectural integrity across the Android stack: Clean Architecture boundaries, offline-first resilience, cloud security, and concurrency. Assign `Size` and `Estimate`, enforce the **Architectural Split Mandate** for Epics, and surface breaking changes before implementation begins. --- @@ -60,14 +60,16 @@ Rules: Room cache is always written first. Map network errors to `UiState.Error` ### 3. Firestore Security Rules Audit Apply least privilege. Validate via `node scripts/test-firestore-rules.mjs`. Disallow unauthenticated writes on user documents. Disallow unshared cross-user access. -### 4. Tech Complexity Assessment -- `XS - Low 🟢`: Isolated change, no schema delta (<½ day). -- `S - Medium 🟡`: Single-layer change, limited scope (½–1 day). -- `M - High 🟠`: Multi-layer change, Room migration, rule update (1–3 days). -- `L - Architectural 🔴`: New module, cross-system surface, breaking migration (3+ days). +### 4. Size & Effort Assessment +- `XS`: Isolated change, no schema delta (<½ day). +- `S`: Single-layer change, limited scope (½–1 day). +- `M`: Multi-layer change, Room migration, rule update (1–3 days). +- `L`: Multi-component or cross-cutting feature (3–5 days, Epic Gated). +- `XL`: Major system overhaul, multi-module, breaking migration (5+ days, Epic Gated). +Assign numeric `Estimate` (days or story points, co-owned with P1). ### 5. Architectural Split Mandate (Epic Gating) -When Tech Complexity is `L - Architectural 🔴`: +When Size is `L` or `XL`: - **Reject Monolithic PRs**: Strictly forbid single large branches or PRs. - **Decomposition DAG**: Produce a topological DAG of atomic child issues (< 300 diff lines each) referencing `parent: #` via `.agent/templates/epic-spec.md`. - Enforce trunk-based sequential delivery with `skip-release` for intermediate child PRs. @@ -84,7 +86,7 @@ Post as comment on GitHub Issue via `GitHubMCP:add_issue_comment`. ```markdown ### ⚙️ Pillar 3 · Technical Blueprint -**Tech Complexity**: · **Breaking Changes**: +**Size**: · **Estimate**: · **Breaking Changes**: #### Data Layer - Room entities: · Migration: diff --git a/.agent/rules/agent-lifecycle.md b/.agent/rules/agent-lifecycle.md index c4e83d2..a0e1326 100644 --- a/.agent/rules/agent-lifecycle.md +++ b/.agent/rules/agent-lifecycle.md @@ -70,7 +70,7 @@ Each persona contributes to the canonical 4-Pillar Spec posted via `GitHubMCP:ad - **P1 Product Planner** → User Story (Gherkin) & 3-State Access Matrix (Guest/Solo/Duo). - **P2 Design Lead** → Pillar 1: Material 3 tokens, WCAG 2.1 AAA, 4-state UI matrix, Roborazzi expectations (or explicit `N/A — No visual/UI changes`). - **P3 Privacy & Data Lead** → Pillar 2: Zero-PII telemetry, value bucketing, GDPR/AI Act compliance. -- **P4 System Architect** → Pillar 3: Room schema/DDL, Firestore rules delta, Clean MVI, infra locks (`AppDatabase.kt`, `firestore.rules`, `strings.xml`), Tech Complexity. +- **P4 System Architect** → Pillar 3: Room schema/DDL, Firestore rules delta, Clean MVI, infra locks (`AppDatabase.kt`, `firestore.rules`, `strings.xml`), Size & Estimate. ### Step 1.3 · Dual-Write Pattern & Gate 1.4 Approval (Rule 1.5) - **Canonical Remote Truth**: The sealed GitHub issue and its 4-Pillar comment serve as the authoritative project contract. diff --git a/.agent/rules/backlog-planner.md b/.agent/rules/backlog-planner.md index 4a8af3b..9c003ab 100644 --- a/.agent/rules/backlog-planner.md +++ b/.agent/rules/backlog-planner.md @@ -12,10 +12,10 @@ Detailed RBAC and deliverable formats are specified in each persona's manifest: | Persona | Manifest | Key Responsibilities | Key Outputs | |---|---|---|---| -| **P1 · Product Planner** | [`p1-product-planner.md`](../personas/p1-product-planner.md) | User stories, acceptance criteria, Business Value, Milestone ownership | Sealed Issue, Milestone assignment, Kanban linking | +| **P1 · Product Planner** | [`p1-product-planner.md`](../personas/p1-product-planner.md) | User stories, acceptance criteria, Priority, Milestone, Estimate | Sealed Issue, Milestone assignment, Kanban linking | | **P2 · Design Lead** | [`p2-design-lead.md`](../personas/p2-design-lead.md) | Material 3 token compliance, WCAG AAA, incremental screen diff policy | Pillar 1 (Design Spec) comment, Roborazzi list | | **P3 · Privacy & Data Lead** | [`p3-privacy-data.md`](../personas/p3-privacy-data.md) | Zero-PII telemetry enforcement, value bucketing, event schema taxonomy | Pillar 2 (Data & Privacy Spec) comment | -| **P4 · System Architect** | [`p4-system-architect.md`](../personas/p4-system-architect.md) | Clean Arch audit, Room local-first guarantee, Tech Complexity, infra locks | Pillar 3 (Technical Blueprint) comment | +| **P4 · System Architect** | [`p4-system-architect.md`](../personas/p4-system-architect.md) | Clean Arch audit, Room local-first guarantee, Size, Estimate, infra locks | Pillar 3 (Technical Blueprint) comment | --- @@ -28,17 +28,15 @@ Git Branch : /issue-- --- -## 3. Project Metadata Triad +## 3. Native GitHub Projects v2 Metadata -Set during Inception (Rule A: immutable post-creation, revisions via `add_issue_comment` only). +Configured on GitHub Projects v2 board. Revisions require an `add_issue_comment` rationale. -| Field | Owner | Allowed Values | +| Field | Owner | Allowed Values & Format | |---|---|---| -| **Business Value ⭐** | P1 (PM) | `Core Delight ⭐` · `Habit & Retention 🔁` · `Operational & Risk ⚙️` · `Exploratory 🧪` | -| **Tech Complexity 🧩** | P4 (Architect) | `XS - Low 🟢` (<½d) · `S - Medium 🟡` (½–1d) · `M - High 🟠` (1–3d) · `L - Architectural 🔴` (Epic) | -| **Severity 🚨** | P1 (PM, bugs only) | `P0 - Blocker 💥` · `P1 - Major 🔴` · `P2 - Minor 🟠` · `P3 - Trivial 🟢` | - -> `feature`, `enhancement`, `chore` tickets must NOT use `Severity`. +| **Priority** | P1 (PM) / Triage | `P0` (Blocker/Fatal) · `P1` (Major) · `P2` (Minor) | +| **Size** | P4 (Architect) | `XS` (<½d) · `S` (½–1d) · `M` (1–3d) · `L` (3–5d) · `XL` (>5d) | +| **Estimate** | P1 & P4 | Numeric estimate (days or story points) | --- @@ -54,8 +52,8 @@ Every task (feature, bug, refactor, chore, docs) requires: --- -### 🏛️ Rule 0.1 · Epic Gating (Tech Complexity: L) -Issues rated `L - Architectural 🔴` are classified as **Epics**. +### 🏛️ Rule 0.1 · Epic Gating (Size: L / XL) +Issues rated `Size: L` or `Size: XL` (or `Estimate >= 3d`) are classified as **Epics**. - **Zero Branch Guardrail**: Never branch or commit directly on an Epic issue. - **Sequential Decomposition**: P1 & P4 decompose Epics into atomic child issues (< 300 diff lines) referencing the parent (`parent: #`), merged sequentially to `main` (Trunk-Based) using [`.agent/templates/epic-spec.md`](../templates/epic-spec.md). - **Silent Merges (`skip-release`)**: Intermediate child PRs carry `skip-release`. @@ -69,7 +67,7 @@ Issues rated `L - Architectural 🔴` are classified as **Epics**. - `GitHubMCP:update_issue` targeting `title` or `body` is **strictly forbidden**. - Branch names and types are **immutable**: a `feat/issue--*` stays `feat/` even if Phase 2 reveals minor bugs. -- Metadata Triad fields (`Business Value`, `Tech Complexity`, `Severity`) are set during Inception; revisions require an `add_issue_comment`. +- Native project fields (`Priority`, `Size`, `Estimate`, `Status`) are set on the Project board; revisions require an explanatory `add_issue_comment` for auditability. - All scope changes, plan pivots, and discussions are appended via `GitHubMCP:add_issue_comment`. --- @@ -87,8 +85,8 @@ Every Issue and PR must be assigned to `@me` at creation. No unowned tickets. --- -### 📋 Rule 3 · Kanban Attachment, Cycle & Milestone Linking -**At `Backlog` creation**: Attach to project Kanban and assign Metadata Triad. +### 📋 Rule 3 · Kanban Attachment & Milestone Linking +**At `Backlog` creation**: Attach to project board and assign Priority, Size, Estimate, Status. **At `Ready` transition**: Link active Cycle and target Milestone: ```bash gh issue edit --milestone "" @@ -127,7 +125,7 @@ Acceptance: 0 errors · 0 warnings · 100% unit/Robolectric tests · 100% Firest ### 📱 Rule 8 · Observability Triage (Crashlytics) Format incident issues using [`.agent/templates/crashlytics-triage-issue.md`](../templates/crashlytics-triage-issue.md). -- Set `Severity 🚨` (P0 to P3). On PR merge, P6 triggers Dual-Sync closure. +- Set `Priority` (P0 to P2). On PR merge, P6 triggers Dual-Sync closure. --- @@ -172,13 +170,13 @@ User Request │ ▼ P1: Anti-duplication (GitHubMCP:search_issues) │ - ▼ P1: Create sealed Issue + assign Business Value + create/link Milestone + ▼ P1: Create sealed Issue + assign Priority/Estimate + link Milestone │ ▼ P1: Kanban attachment (Backlog) │ ├─▶ P2: Pillar 1 comment (Design Spec) ├─▶ P3: Pillar 2 comment (Data & Privacy Spec) - └─▶ P4: Pillar 3 comment (Technical Blueprint) + assign Tech Complexity + └─▶ P4: Pillar 3 comment (Technical Blueprint) + assign Size/Estimate │ ▼ P1: Cycle & Milestone linking → Kanban to Ready │ @@ -193,7 +191,7 @@ User Request | Status | Meaning | Next Step | |---|---|---| -| `Backlog` | Issue created, Metadata Triad pending | Run `/plan-issue` | +| `Backlog` | Issue created, native fields assigned | Run `/plan-issue` | | `Ready` | 4-Pillar plan validated, Cycle & Milestone linked | Create branch → code | | `In Progress` | Active branch, Cycle & Metadata set | Finish tests, push | | `In Review` | PR opened with Walkthrough (`Closes #`) | CI gate & review | diff --git a/.agent/sidecars/sync-issue-progress.mjs b/.agent/sidecars/sync-issue-progress.mjs index e4493af..61b3ec6 100755 --- a/.agent/sidecars/sync-issue-progress.mjs +++ b/.agent/sidecars/sync-issue-progress.mjs @@ -51,7 +51,7 @@ function setField(p, i, f, key, val) { try { console.log(`🔄 [SyncIssueProgress] Syncing #${issueNum}...`); - const q = `query($o:String!,$r:String!,$i:Int!,$p:Int!){repository(owner:$o,name:$r){issue(number:$i){id milestone{title}projectItems(first:5){nodes{id project{id}fieldValues(first:10){nodes{...on ProjectV2ItemFieldSingleSelectValue{name field{...on ProjectV2FieldCommon{name}}}...on ProjectV2ItemFieldIterationValue{title field{...on ProjectV2FieldCommon{name}}}}}}}}milestones(first:3,states:[OPEN],orderBy:{field:DUE_DATE,direction:ASC}){nodes{number title}}}user(login:$o){projectV2(number:$p){id fields(first:20){nodes{...on ProjectV2SingleSelectField{id name options{id name}}...on ProjectV2IterationField{id name configuration{iterations{id title startDate duration}}}}}}}}`; + const q = `query($o:String!,$r:String!,$i:Int!,$p:Int!){repository(owner:$o,name:$r){issue(number:$i){id milestone{title}projectItems(first:5){nodes{id project{id}}}}milestones(first:3,states:[OPEN],orderBy:{field:DUE_DATE,direction:ASC}){nodes{number title}}}user(login:$o){projectV2(number:$p){id fields(first:20){nodes{...on ProjectV2SingleSelectField{id name options{id name}}...on ProjectV2IterationField{id name configuration{iterations{id title startDate duration}}}}}}}}`; const data = gql(q, { o: owner, r: repo, i: issueNum, p: pNum }); const issue = data?.repository?.issue; @@ -82,7 +82,7 @@ try { } if (itemId && statusField) { - const inProgressOpt = statusField.options.find(o => o.name === 'In Progress'); + const inProgressOpt = statusField.options.find(o => o.name.toLowerCase() === 'in progress'); if (inProgressOpt) { console.log(`🎯 Setting Status -> In Progress...`); setField(project.id, itemId, statusField.id, 'singleSelectOptionId', inProgressOpt.id); diff --git a/.agent/skills/plan-issue/SKILL.md b/.agent/skills/plan-issue/SKILL.md index 088f159..983ce62 100644 --- a/.agent/skills/plan-issue/SKILL.md +++ b/.agent/skills/plan-issue/SKILL.md @@ -38,7 +38,7 @@ GitHubMCP:search_issues { "q": "repo:/ is:issue " } ``` If an open issue already covers the scope, switch to that issue or add context via comment. -### Step 3: Sealed Issue Creation & Metadata Triad (Persona 1) +### Step 3: Sealed Issue Creation & Native Project Metadata (Persona 1) If new, P1 creates the issue assigned strictly to `@me` (`@me`): ```json GitHubMCP:create_issue { @@ -50,10 +50,11 @@ GitHubMCP:create_issue { "assignees": ["@me"] } ``` -P1 assigns the **Metadata Triad**: -- `Business Value ⭐`: Low / Medium / High / Critical -- `Severity 🚨`: Low / Medium / High / Critical (bugs only, N/A for features) -- `Tech Complexity 🧩`: S / M / L (determined with P4) +P1 assigns the native **GitHub Projects v2 Metadata**: +- `Priority`: `P0` / `P1` / `P2` +- `Size`: `XS` / `S` / `M` / `L` / `XL` (determined with P4) +- `Estimate`: Numeric estimate in points or days (co-owned with P4) +- `Status`: `Backlog` ### Step 4: 4-Pillar Spec Orchestration & Conditional P2 Design Gate Consortium members populate [`.agent/templates/4-pillar-spec.md`](../../templates/4-pillar-spec.md) through contextual triage: @@ -63,10 +64,10 @@ Consortium members populate [`.agent/templates/4-pillar-spec.md`](../../template - **Non-UI Changes**: For pure backend, Room, Firestore rules, CI/CD, scripts, or chores, mark: `N/A — No visual/UI changes`. - **Explicit User Override**: If prompt explicitly requests to skip design (e.g. *"skip design"*), bypass P2 immediately. 3. **P3 (Privacy & Data Lead)**: Pillar 2 Data Spec (Zero-PII telemetry, event taxonomy, GDPR). -4. **P4 (System Architect)**: Pillar 3 Technical Blueprint (Room, Firestore, architecture boundaries, and `Tech Complexity 🧩`). +4. **P4 (System Architect)**: Pillar 3 Technical Blueprint (Room, Firestore, architecture boundaries, `Size` and `Estimate`). -### Step 4.1: Complexity L Route — Epic Decomposition (Rule 0.1) -If `Tech Complexity` is `L - Architectural 🔴` (new modules, Wear OS, breaking migrations): +### Step 4.1: Complexity L/XL Route — Epic Decomposition (Rule 0.1) +If `Size` is `L` or `XL` (or `Estimate >= 3d`): - **Classify as Epic**: Zero Branch Guardrail — strictly forbidden to branch or commit on this issue. - **Decompose**: P1 & P4 produce [`.agent/templates/epic-spec.md`](../../templates/epic-spec.md) detailing the child-issue DAG (< 300 diff lines each). - Intermediate child PRs carry the `skip-release` label. diff --git a/.agent/skills/triage-feedback/SKILL.md b/.agent/skills/triage-feedback/SKILL.md index 7d6de63..54ccd75 100644 --- a/.agent/skills/triage-feedback/SKILL.md +++ b/.agent/skills/triage-feedback/SKILL.md @@ -24,13 +24,13 @@ Standardizes the capture, multi-level deduplication, and integration of **fatal --- -## 🎯 1. Severity Qualification +## 🎯 1. Priority Qualification | Tier | Category | Source & Impact | Target Labels | Project Priority | |---|---|---|---|---| -| **CRITICAL** | Fatal Crash | Uncaught runtime crash | `["source:crashlytics", "bug"]` | `Critical 💥` | -| **HIGH** | Non-Fatal Error | Intercepted AI or sync failure | `["source:crashlytics", "bug"]` | `High 🔴` | -| **NORMAL** | Tester Feedback | Firebase App Distribution feedback | `["source:tester-feedback", "bug"\|"feature"]` | `High 🔴` or `Medium 🟠` | +| **CRITICAL** | Fatal Crash | Uncaught runtime crash | `["source:crashlytics", "bug"]` | `P0` | +| **HIGH** | Non-Fatal Error | Intercepted AI or sync failure | `["source:crashlytics", "bug"]` | `P1` | +| **NORMAL** | Tester Feedback | Firebase App Distribution feedback | `["source:tester-feedback", "bug"\|"feature"]` | `P1` or `P2` | --- diff --git a/.agent/templates/4-pillar-spec.md b/.agent/templates/4-pillar-spec.md index 86f0518..9800077 100644 --- a/.agent/templates/4-pillar-spec.md +++ b/.agent/templates/4-pillar-spec.md @@ -37,7 +37,7 @@ Feature: {{FEATURE_NAME}} - [ ] Zero regressions on existing Roborazzi snapshots. - [ ] `./scripts/quality-check.sh` exits 0. -**Metadata**: **Milestone**: `{{MILESTONE_NAME}}` · **Cycle**: `{{CYCLE_NAME}}` · **Business Value**: `{{BUSINESS_VALUE}}` +**Metadata**: **Milestone**: `{{MILESTONE_NAME}}` · **Priority**: `{{PRIORITY_P0_P1_P2}}` · **Size**: `{{SIZE_XS_TO_XL}}` · **Estimate**: `{{ESTIMATE}}` --- @@ -86,7 +86,7 @@ Feature: {{FEATURE_NAME}} ## Pillar 3 · Technical Blueprint (P4 — System Architect) -**Tech Complexity**: `{{XS_S_M_L}}` · **Breaking change**: `{{YES_NO}}` +**Size**: `{{XS_S_M_L_XL}}` · **Estimate**: `{{ESTIMATE}}` · **Breaking change**: `{{YES_NO}}` **Data layer**: - Room entity delta: `{{ENTITY_CHANGES}}` @@ -128,8 +128,8 @@ pr: {{PR_NUMBER_OR_NULL}} milestone: "{{MILESTONE_NAME}}" cycle: "{{CYCLE_NAME}}" metadata: - business_value: "{{BUSINESS_VALUE}}" - tech_complexity: "{{TECH_COMPLEXITY}}" - severity: {{SEVERITY_OR_NULL}} + priority: "{{PRIORITY}}" + size: "{{SIZE}}" + estimate: {{ESTIMATE}} --- ``` diff --git a/.agent/templates/crashlytics-triage-issue.md b/.agent/templates/crashlytics-triage-issue.md index 3df54a5..b61ccfc 100644 --- a/.agent/templates/crashlytics-triage-issue.md +++ b/.agent/templates/crashlytics-triage-issue.md @@ -5,9 +5,9 @@ usage: Use as the body for GitHubMCP:create_issue when triaging a Firebase Crash labels: ["bug", "source:crashlytics"] --- -## 🚨 Severity: {{P0_BLOCKER|P1_MAJOR|P2_MINOR|P3_TRIVIAL}} +## 🚨 Priority: {{P0|P1|P2}} -> **Severity guide**: `P0 - Blocker 💥` = app crash / data loss / security breach · `P1 - Major 🔴` = core feature broken, no workaround · `P2 - Minor 🟠` = degraded UX, workaround exists · `P3 - Trivial 🟢` = cosmetic / logging +> **Priority guide**: `P0` = app crash / data loss / security breach · `P1` = core feature broken, no workaround · `P2` = degraded UX, workaround exists --- diff --git a/.agent/templates/epic-spec.md b/.agent/templates/epic-spec.md index e7a6971..556b10c 100644 --- a/.agent/templates/epic-spec.md +++ b/.agent/templates/epic-spec.md @@ -16,8 +16,9 @@ guardrail: Zero Branch on Epic — child issues must be created for implementati ## 🎯 1. Vision & Strategic Objectives - **Goal**: {{EPIC_GOAL_SUMMARY}} -- **Business Value ⭐**: {{BUSINESS_VALUE}} -- **Tech Complexity 🧩**: `L - Architectural 🔴` +- **Priority**: {{PRIORITY_P0_P1_P2}} +- **Size**: `{{SIZE_L_OR_XL}}` (Epic Gated) +- **Estimate**: {{ESTIMATE_DAYS_OR_POINTS}} - **Target Milestone**: `{{MILESTONE_NAME}}` --- diff --git a/.github/ISSUE_TEMPLATE/crashlytics_triage.yml b/.github/ISSUE_TEMPLATE/crashlytics_triage.yml index 595bcde..d4bb8da 100644 --- a/.github/ISSUE_TEMPLATE/crashlytics_triage.yml +++ b/.github/ISSUE_TEMPLATE/crashlytics_triage.yml @@ -9,15 +9,14 @@ body: ### 🚨 Firebase Crashlytics Incident Triage This issue follows the structured triage format mapped to `.agent/templates/crashlytics-triage-issue.md`. - type: dropdown - id: severity + id: priority attributes: - label: Severity 🚨 + label: Priority description: Assess blast radius and operational impact. options: - - "P0 - Blocker 💥 (App crash / data loss / security breach)" - - "P1 - Major 🔴 (Core feature broken, no workaround)" - - "P2 - Minor 🟠 (Degraded UX, workaround exists)" - - "P3 - Trivial 🟢 (Cosmetic / logging)" + - "P0 (App crash / data loss / security breach)" + - "P1 (Core feature broken, no workaround)" + - "P2 (Degraded UX, workaround exists)" validations: required: true - type: input diff --git a/AGENTS.md b/AGENTS.md index 9513fb8..1304dee 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,7 +29,7 @@ flowchart LR 1. **Phase 1 — Inception (Personas 1–4)**: - Activates **Persona 1 (Product Planner)**: anti-duplicate search via `GitHubMCP:search_issues`. - - P1 calls `GitHubMCP:create_issue` to seal the tracking issue assigned to `@me` with Metadata Triad. + - P1 calls `GitHubMCP:create_issue` to seal the tracking issue assigned to `@me` with native GitHub Projects v2 metadata (`Priority`, `Size`, `Estimate`). - P1 orchestrates the canonical 4-Pillar Spec comment via `GitHubMCP:add_issue_comment`. - **Dual-Write Pattern**: Mirrors the spec locally into `implementation_plan.md` artifact (`RequestFeedback: true`, `UserFacing: true`) for IDE alignment. - **Gate 1.4 Verification (STOP & WAIT)**: Strict halt. Zero branches or code edits before explicit written approval. @@ -57,10 +57,10 @@ Pillar 1 (Design Spec) enforcement is contextual and adaptive: | Persona | Manifest | Role & Deliverables | Metadata Ownership | |---|---|---|---| -| **P1 · Product Planner** | [p1-product-planner.md](.agent/personas/p1-product-planner.md) | User Stories (Gherkin), 3-State Access Matrix, Milestones, Backlog hygiene | `Business Value ⭐`, `Severity 🚨` | +| **P1 · Product Planner** | [p1-product-planner.md](.agent/personas/p1-product-planner.md) | User Stories (Gherkin), 3-State Access Matrix, Milestones, Backlog hygiene | `Priority`, `Estimate` (co-owner) | | **P2 · Design Lead** | [p2-design-lead.md](.agent/personas/p2-design-lead.md) | Material 3 tokens, WCAG AAA, 4-state UI matrix, Stitch MCP sync | Pillar 1 Design Spec | | **P3 · Privacy & Data** | [p3-privacy-data.md](.agent/personas/p3-privacy-data.md) | Zero-PII telemetry, event taxonomy, GDPR/AI Act compliance | Pillar 2 Data Spec | -| **P4 · System Architect** | [p4-system-architect.md](.agent/personas/p4-system-architect.md) | Clean Arch, Room DDL, boundary audit, Epic DAG decomposition | `Tech Complexity 🧩` (XS/S/M/L) | +| **P4 · System Architect** | [p4-system-architect.md](.agent/personas/p4-system-architect.md) | Clean Arch, Room DDL, boundary audit, Epic DAG decomposition | `Size` (XS/S/M/L/XL), `Estimate` (co-owner) | | **P5 · Software Engineer** | [p5-software-engineer.md](.agent/personas/p5-software-engineer.md) | Kotlin/Compose implementation, Clean MVI, Zero Hardcoded Strings | Working code, atomic commits | | **P6 · Release Manager** | [p6-release-manager.md](.agent/personas/p6-release-manager.md) | Quality Airbag, PR walkthrough, Milestone release train, Crashlytics sync | PR Lifecycle, Tier 1/2 releases | @@ -70,7 +70,7 @@ Pillar 1 (Design Spec) enforcement is contextual and adaptive: 1. **Rule 0 (Issue-First)**: Zero code, branch, or PR without a prior sealed GitHub Issue. 2. **Rule A (Append-Only Immutability)**: Issue title and body are READ-ONLY once created. Revisions appended via comments. -3. **Rule 0.1 (Epic Gating)**: Issues with `Tech Complexity: L` require decomposition into atomic child issues (< 300 diff lines) via [`.agent/templates/epic-spec.md`](.agent/templates/epic-spec.md). Zero branching on Epics. +3. **Rule 0.1 (Epic Gating)**: Issues evaluated as `Size: L` or `Size: XL` require decomposition into atomic child issues (< 300 diff lines) via [`.agent/templates/epic-spec.md`](.agent/templates/epic-spec.md). Zero branching on Epics. 4. **WIP = 1**: Exactly 1 issue `In Progress` and at most 1 PR `In Review` at any time. 5. **Dual-Write Pattern**: Canonical spec resides on GitHub Issue; mirrored to local `implementation_plan.md` for IDE harmony. 6. **Zero Auto-Merge**: The agent never merges autonomously without human confirmation. @@ -90,10 +90,10 @@ Pillar 1 (Design Spec) enforcement is contextual and adaptive: - **Sources**: `source:crashlytics`, `source:tester-feedback`, `source:internal`. - **CI Control**: `skip-release` (omits APK build for docs, governance, and intermediate Epic tasks). -### 3.2 Project Metadata Triad -- **Business Value ⭐** (P1): `Core Delight ⭐` · `Habit & Retention 🔁` · `Operational & Risk ⚙️` · `Exploratory 🧪` -- **Tech Complexity 🧩** (P4): `XS - Low 🟢` (<½d) · `S - Medium 🟡` (½–1d) · `M - High 🟠` (1–3d) · `L - Architectural 🔴` (Epic) -- **Severity 🚨** (P1 — bugs only): `P0 - Blocker 💥` · `P1 - Major 🔴` · `P2 - Minor 🟠` · `P3 - Trivial 🟢` +### 3.2 Native GitHub Projects v2 Metadata +- **Priority** (P1): `P0` (Blocker/Fatal) · `P1` (Major) · `P2` (Minor) +- **Size** (P4): `XS` (<½d) · `S` (½–1d) · `M` (1–3d) · `L` (3–5d, Epic Gated) · `XL` (>5d, Epic Gated) +- **Estimate** (P1/P4): Numeric estimate in days or story points ### 3.3 Kanban Lifecycle `Backlog` (Created) $\to$ `Ready` (Plan Approved) $\to$ `In Progress` (Branch Active) $\to$ `In Review` (PR Open) $\to$ `Done` (Merged). diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 56307bc..d2c1e42 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -98,6 +98,6 @@ The framework installs runtime safety hooks directly intercepting agent tool exe 1. **Rule 0 (Issue-First)**: Every branch and PR must originate from an existing, sealed GitHub Issue. 2. **Rule A (Append-Only Immutability)**: Issue titles and initial descriptions are append-only. Scope modifications are recorded via comments. -3. **Rule 0.1 (Epic Gating)**: Issues evaluated as `Tech Complexity: L` must be decomposed into atomic child tasks (< 300 LOC) before implementation. +3. **Rule 0.1 (Epic Gating)**: Issues evaluated as `Size: L` or `Size: XL` must be decomposed into atomic child tasks (< 300 LOC) before implementation. 4. **WIP = 1**: Strictly one issue in progress and at most one PR under review at any time. 5. **Zero Auto-Merge**: The agent halts at Gate 3.5 and never merges autonomously. diff --git a/kernel.config.json b/kernel.config.json index e257962..dfbc649 100644 --- a/kernel.config.json +++ b/kernel.config.json @@ -23,8 +23,8 @@ "designAssetPath": "" }, "githubProject": { - "enabled": false, - "projectNumber": 1 + "enabled": true, + "projectNumber": 2 }, "airbag": { "checkCommand": "./scripts/quality-check.sh",