Jira Backlog Seed Implementation Plan¶
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Seed the PHON Jira project with 8 Workstreams and 32 seed tickets per the 2026-04-18 design spec, then publish a conventions page to Confluence and save a memory reference.
Architecture: All work happens via the Atlassian MCP — no repo code changes. The project PHON exists (cloudId 7a1f4095-96d2-458f-9a92-11413f425d84, project PHONOLEX, key PHON). Task 0 is a set of manual admin steps in the Jira UI (extending the workflow, adding Components, documenting label convention). Tasks 1-9 create the Workstreams and their seed tickets via createJiraIssue. Task 10 adds blockedBy dependency links. Task 11 publishes the conventions doc on Confluence. Task 12 verifies and saves a memory reference.
Tech Stack: Atlassian Jira Cloud, Atlassian Confluence Cloud, Atlassian MCP plugin (mcp__plugin_atlassian_atlassian__* tools). No repo code changes.
Reference spec: docs/superpowers/specs/2026-04-18-jira-backlog-seed-design.md
Constants:
- cloudId: 7a1f4095-96d2-458f-9a92-11413f425d84
- Jira project key: PHON
- Confluence space: PHONOLEX (space ID 24215555, home page 24215656)
- Runbooks section page ID: 24346625
Issue creation contract¶
Every createJiraIssue call uses contentFormat: "markdown" and sets fields as follows.
For a Workstream:
mcp__plugin_atlassian_atlassian__createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Workstream",
summary=<Workstream name>,
contentFormat="markdown",
description=<Workstream description>,
additional_fields={}
)
For a Task or Bug under a Workstream:
mcp__plugin_atlassian_atlassian__createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName=<"Task" or "Bug">,
summary=<Ticket summary>,
contentFormat="markdown",
description=<Ticket description (can be empty or brief)>,
additional_fields={
"parent": {"key": "<Workstream key, e.g., PHON-1>"},
"priority": {"name": "<Lowest|Low|Medium|High|Highest>"},
"labels": [<label strings>],
"components": [{"name": "<component>"}, ...]
}
)
Fallback if parent does not work for Workstream→Task¶
Next-gen Jira Cloud projects usually accept parent for hierarchy-1→hierarchy-0 relationships. If the MCP returns an error for parent on a Task (e.g., "parent is not supported for this issue type"), fall back to createIssueLink with link type "is child of" or equivalent — discover the valid link types via getIssueLinkTypes first. Record the fallback approach in the task report so subsequent tasks use the same method consistently.
Key assignment¶
PHON is currently empty. Issues are assigned keys in creation order: PHON-1, PHON-2, etc. This plan assumes Workstreams are created first (Task 1), so they will be PHON-1 through PHON-8. If any other issues are created in PHON before this plan runs, keys will shift — the executor should capture the actual returned key from each createJiraIssue response and use those keys in subsequent tasks.
Task 0: Manual Jira admin setup (user, via Jira UI)¶
The MCP does not expose project admin. The user performs these steps in the Jira UI before running Tasks 1+.
- [ ] Step 1: Confirm Bug issue type is available
Already done per this brainstorm. Verify in Project settings → Issue types that Bug appears alongside Workstream, Task, Sub-task.
- [ ] Step 2: Extend the workflow lifecycle
Default business-project workflow is typically To Do → In Progress → Done. Extend to the full lifecycle:
Backlog → To Do → In Progress → In Review → Blocked → Done
Path: Project settings → Workflows → Edit the default workflow. Add the three missing states (Backlog, In Review, Blocked) with transitions from/to logical neighbors.
- [ ] Step 3: Add the nine Components
Path: Project settings → Components. Add:
web-apiweb-frontendgenerationgovernorsdatafeaturestokenizerops-
docs -
[ ] Step 4: Set default priority
Path: Project settings → Priorities. Confirm default for new issues is Medium.
- [ ] Step 5: Report completion
In the task report, state: - Bug type confirmed present - Workflow extended (or was already in place) - Components created (list them) - Default priority confirmed
Task 1: Create the 8 Workstreams¶
Create all 8 Workstreams as top-level issues in PHON. Capture each Workstream's Jira key (PHON-N) from the response and record it in the task report — subsequent tasks reference these keys.
- [ ] Step 1: Create Workstream PHON-1 — Legal & compliance cleanup
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Workstream",
summary="Legal & compliance cleanup",
contentFormat="markdown",
description="Direct fallout from the Confluence knowledge base audit. Reconciles package license declarations, records legal facts (trademark, domain registrar), and conducts an OSS dependency license review. Owner: admin."
)
Record returned key (expected: PHON-1).
- [ ] Step 2: Create Workstream PHON-2 — Dataset inventory completion
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Workstream",
summary="Dataset inventory completion",
contentFormat="markdown",
description="Backfill unknown license / redistribution fields on the Confluence Dataset inventory page (24 of 38 rows flagged Unknown). Resolve orphan datasets present on disk but not consumed by the active pipeline. Retire or update data/README.md."
)
Record returned key.
- [ ] Step 3: Create Workstream PHON-3 — Governed Generation quality
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Workstream",
summary="Governed Generation quality",
contentFormat="markdown",
description="Known product defects and regressions in the constrained generation engine (T5Gemma + governor). Covers mid-word hyphen leaks, contrastive pair coverage undershoot, and text-quality regression when excluding specific phonemes."
)
Record returned key.
- [ ] Step 4: Create Workstream PHON-4 — Governed Generation UI polish
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Workstream",
summary="Governed Generation UI polish",
contentFormat="markdown",
description="In-flight frontend improvements for the Governed Generation tool: OutputCard redesign, chip-click compliance lens, and related UX refinements."
)
Record returned key.
- [ ] Step 5: Create Workstream PHON-5 — Production validation & v5.1 prep
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Workstream",
summary="Production validation & v5.1 prep",
contentFormat="markdown",
description="Validate v5.x changes on staging across all seven tools, triage any issues into PHON-3/PHON-4, then cut the v5.1.0 release."
)
Record returned key.
- [ ] Step 6: Create Workstream PHON-6 — Collaborator onboarding
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Workstream",
summary="Collaborator onboarding",
contentFormat="markdown",
description="Preparation for incoming collaborators: runbook, access grants, good-first-issue seeding, contractor engagement terms, and an ADR backfill for work they should know about (Bayesian-learned phoneme feature vectors)."
)
Record returned key.
- [ ] Step 7: Create Workstream PHON-7 — Operations maturity
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Workstream",
summary="Operations maturity",
contentFormat="markdown",
description="Close the gaps surfaced on the Confluence Environments and deploy topology page: unverified plan tiers, missing deploy/release/rotation runbooks, no centralized alerting."
)
Record returned key.
- [ ] Step 8: Create Workstream PHON-8 — Content Catalog MVP
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Workstream",
summary="Content Catalog MVP",
contentFormat="markdown",
description="The third face of PhonoLex. Batch-generated compliant content with a searchable catalog. Unblocked now that the generator and governor are production-usable. Initial tickets are planning-phase (spec, use cases, storage target, local-compute time budget). Implementation tickets decompose from the spec."
)
Record returned key.
- [ ] Step 9: Verify all 8 Workstreams exist
Run:
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND issuetype = "Workstream"',
fields=["summary", "status"],
maxResults=20
)
Expected: 8 results, each with status Backlog (or the default for new issues in this workflow).
Record the mapping of Workstream name → Jira key for use in Tasks 2-9. Subsequent tasks refer to the Workstreams by their descriptive names; substitute the correct keys.
Task 2: Seed PHON-1 · Legal & compliance cleanup tickets¶
Create 4 Tasks under the Legal & compliance Workstream. Use the Workstream key captured in Task 1 (expected PHON-1) in the parent field.
- [ ] Step 1: Create "Reconcile package licenses" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Reconcile package license declarations across monorepo",
contentFormat="markdown",
description="Root `LICENSE` and root `pyproject.toml` say Proprietary, but `packages/data/`, `packages/features/`, and `packages/governors/` declare `CC-BY-SA-3.0`; root `package.json` and `packages/tokenizer/` declare `Apache-2.0`. These are fundamentally incompatible. Decide the canonical stance (Proprietary per CLAUDE.md and the root LICENSE is the current memory default), update all inconsistent manifests to match, and record the decision on the Confluence Legal page.\n\n**Audit source:** Confluence Dataset inventory build, 2026-04-18.",
additional_fields={
"parent": {"key": "PHON-1"},
"priority": {"name": "High"},
"labels": ["compliance"],
"components": [{"name": "docs"}, {"name": "ops"}]
}
)
- [ ] Step 2: Create "Research domain registrar" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Research and record domain registrar for phonolex.com",
contentFormat="markdown",
description="Not captured anywhere in the repo. Record registrar name, renewal cadence, and account ownership on the Confluence People & Relationships page (24346663) under Vendors.",
additional_fields={
"parent": {"key": "PHON-1"},
"priority": {"name": "Low"},
"labels": ["audit"],
"components": [{"name": "docs"}]
}
)
- [ ] Step 3: Create "Decide trademark strategy" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Decide trademark strategy for \"PhonoLex\" name",
contentFormat="markdown",
description="Currently not formally registered. Decide whether to register a trademark (in what jurisdiction(s)) or explicitly rely on common-law mark. Record as an ADR on Confluence Decisions (24281128).",
additional_fields={
"parent": {"key": "PHON-1"},
"priority": {"name": "Low"},
"labels": ["compliance"],
"components": [{"name": "docs"}]
}
)
- [ ] Step 4: Create "OSS dependency license review" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Conduct OSS dependency license review",
contentFormat="markdown",
description="Walk all Python manifests (root + per-package `pyproject.toml`) and JS manifests (`package.json`, `packages/web/*/package.json`). Identify copyleft (LGPL, AGPL) and attribution-required (BSD, MIT, Apache-2.0) obligations. Document findings on Confluence Legal page. Flag any incompatibilities with the Proprietary stance.",
additional_fields={
"parent": {"key": "PHON-1"},
"priority": {"name": "Medium"},
"labels": ["compliance"],
"components": [{"name": "docs"}]
}
)
- [ ] Step 5: Verify all 4 tickets landed under PHON-1
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND parent = PHON-1',
fields=["summary", "priority", "labels", "components"],
maxResults=20
)
Expected: 4 results. Confirm priorities and labels match the spec.
Task 3: Seed PHON-2 · Dataset inventory completion tickets¶
Create 4 Tasks under the Dataset inventory Workstream (expected parent: PHON-2).
- [ ] Step 1: Create "Backfill 24 Unknown license rows" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Backfill license and redistribution fields for 24 Unknown rows on Dataset inventory",
contentFormat="markdown",
description="24 of 38 rows on the Confluence Dataset inventory page (24412161) are flagged `Unknown — needs research`. Research each upstream (paper, website, original distribution) to fill in License, Attribution required, Redistribution allowed, and Version / Year. Update the page via `updateConfluencePage`.",
additional_fields={
"parent": {"key": "PHON-2"},
"priority": {"name": "Medium"},
"labels": ["audit", "compliance"],
"components": [{"name": "data"}, {"name": "docs"}]
}
)
- [ ] Step 2: Create "Resolve orphan datasets" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Resolve orphan datasets in data/",
contentFormat="markdown",
description="SWOW, IPhOD, SIGMORPHON 2022, and UniSegments are present in `data/` but not consumed by `packages/data/` loaders. Decide per dataset: wire into the active pipeline, keep as reference-only (documented on Confluence), or remove from the repo. Update the Confluence Dataset inventory to reflect the decision.",
additional_fields={
"parent": {"key": "PHON-2"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "data"}]
}
)
- [ ] Step 3: Create "Retire or update data/README.md" Task (good-first-issue)
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Retire or fully update data/README.md",
contentFormat="markdown",
description="`data/README.md` currently lists only CMU, Phoible, and mappings — out of sync with actual directory contents (norms/, vocab/, morphynet/, scowl/, morphology/). Now superseded by the Confluence Dataset inventory page (24412161). Decide: delete and point to Confluence, or rewrite as a one-paragraph index that links to the Confluence page. Good first issue — low risk, concrete, touches one file.",
additional_fields={
"parent": {"key": "PHON-2"},
"priority": {"name": "Low"},
"labels": ["good-first-issue"],
"components": [{"name": "docs"}]
}
)
- [ ] Step 4: Create "Prioritize CYP-LEX / Hillenbrand / Roget's license research" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Prioritize license research for CYP-LEX, Hillenbrand, and Roget's Thesaurus",
contentFormat="markdown",
description="These three datasets were flagged as the highest-priority audit targets by the Dataset inventory build — their license fields are Unknown and their upstreams require dedicated research (not just a LICENSE file lookup). Block this subset of the PHON-2 backfill behind dedicated investigation.",
additional_fields={
"parent": {"key": "PHON-2"},
"priority": {"name": "Medium"},
"labels": ["audit"],
"components": [{"name": "data"}, {"name": "docs"}]
}
)
- [ ] Step 5: Verify tickets landed under PHON-2
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND parent = PHON-2',
fields=["summary", "priority", "labels", "components"],
maxResults=20
)
Expected: 4 results.
Task 4: Seed PHON-3 · Governed Generation quality tickets¶
Create 3 Bugs and 1 Task under the Governed Generation quality Workstream (expected parent: PHON-3). Note: Bug type must be available from Task 0 — if it is not, stop and report.
- [ ] Step 1: Create "Mid-word hyphen leak" Bug
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Bug",
summary="Mid-word hyphens leak through trie steering",
contentFormat="markdown",
description="Hallucinated compound words with internal hyphens (e.g., 'Dust-en') escape the trie's ban check. The trie is tagged on whole-word tokens; mid-word hyphens split into subword tokens that the trie doesn't gate cleanly.\n\n**Files to investigate:**\n- `packages/governors/src/phonolex_governors/generation/trie.py`\n- `packages/governors/src/phonolex_governors/generation/reranker.py`",
additional_fields={
"parent": {"key": "PHON-3"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "governors"}, {"name": "generation"}]
}
)
- [ ] Step 2: Create "Contrastive pair coverage undershoots" Bug
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Bug",
summary="Contrastive pair coverage undershoots target (5-10% observed vs 15% target)",
contentFormat="markdown",
description="Per project memory: contrastive pairs achieve 5-10% coverage when the boost is set to target 15%. Prompt instruction ('use both words from at least two of these pairs') helps but adaptive boost alone cannot force 12 words to 15% coverage. Investigate whether the coverage controller, the boost ceiling, or the pair-sampling strategy is the binding constraint.",
additional_fields={
"parent": {"key": "PHON-3"},
"priority": {"name": "Low"},
"labels": [],
"components": [{"name": "governors"}]
}
)
- [ ] Step 3: Create "Exclude /ɹ/ text quality regression" Bug
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Bug",
summary="Excluding /ɹ/ causes text quality regression (missing PunctuationBoost)",
contentFormat="markdown",
description="Per project memory (2026-04-15): excluding /ɹ/ technically works (no /ɹ/-words appear) but prose quality regresses — the generator produces run-on sentences without clean stops. PunctuationBoost behavior needs restoration so sentence-ending tokens are still boosted appropriately when a common phoneme is excluded.\n\n**Files to investigate:**\n- `packages/governors/src/phonolex_governors/generation/reranker.py`\n- `packages/governors/src/phonolex_governors/generation/punctuation_boost.py` (if present)",
additional_fields={
"parent": {"key": "PHON-3"},
"priority": {"name": "High"},
"labels": [],
"components": [{"name": "governors"}]
}
)
- [ ] Step 4: Create "Restrictive-combo UI disclaimer" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Add UI disclaimer for restrictive constraint combinations",
contentFormat="markdown",
description="When the user combines restrictive constraints (e.g., AoA ≤ 5 + exclude /ɹ/), the surviving vocabulary can drop to ~1% and output quality degrades. Surface a disclaimer in the Governed Generation tool when the combined constraint survival rate drops below a threshold (e.g., 5%), suggesting the user relax at least one constraint.",
additional_fields={
"parent": {"key": "PHON-3"},
"priority": {"name": "Medium"},
"labels": ["ux"],
"components": [{"name": "web-frontend"}]
}
)
- [ ] Step 5: Verify tickets landed under PHON-3
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND parent = PHON-3',
fields=["summary", "issuetype", "priority", "labels", "components"],
maxResults=20
)
Expected: 4 results (3 Bugs, 1 Task).
Task 5: Seed PHON-4 · Governed Generation UI polish tickets¶
Create 2 Tasks under the UI polish Workstream (expected parent: PHON-4).
- [ ] Step 1: Create "OutputCard analysis redesign" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="OutputCard analysis redesign — merge compliance and Text Analysis into shared WordHighlighter",
contentFormat="markdown",
description="Plan exists at `docs/superpowers/plans/2026-04-17-output-card-analysis-redesign.md`. Unifies the compliance visualization and the Text Analysis property overlay into a single `WordHighlighter` component with always-on violation underlines and a property overlay toggle.",
additional_fields={
"parent": {"key": "PHON-4"},
"priority": {"name": "Medium"},
"labels": ["ux"],
"components": [{"name": "web-frontend"}]
}
)
- [ ] Step 2: Create "Chip-click compliance lens" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Chip-click compliance lens",
contentFormat="markdown",
description="Clicking a constraint chip in the Governed Generation tool should filter the compliance view to that specific constraint, hiding other constraint violations. Useful for diagnosing why a particular constraint failed without wading through all compliance info at once.",
additional_fields={
"parent": {"key": "PHON-4"},
"priority": {"name": "Low"},
"labels": ["ux"],
"components": [{"name": "web-frontend"}]
}
)
- [ ] Step 3: Verify tickets landed under PHON-4
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND parent = PHON-4',
fields=["summary", "priority", "labels", "components"],
maxResults=10
)
Expected: 2 results.
Task 6: Seed PHON-5 · Production validation & v5.1 prep tickets¶
Create 4 Tasks under the validation Workstream (expected parent: PHON-5).
- [ ] Step 1: Create "End-to-end validation pass" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="End-to-end validation pass on staging for all seven tools",
contentFormat="markdown",
description="Exercise each tool on staging: Custom Word Lists, Text Analysis, Contrastive Sets, Sound Similarity, Lookup, Governed Generation, and the Content Catalog placeholder. Confirm no regressions vs production. Triage any failures into PHON-3 (generation) or PHON-4 (UI).\n\n**Staging URLs:**\n- Frontend: https://develop.phonolex.pages.dev\n- API: https://staging-api.phonolex.com",
additional_fields={
"parent": {"key": "PHON-5"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "web-frontend"}, {"name": "web-api"}]
}
)
- [ ] Step 2: Create "Validate generation cold-start flow" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Validate governed generation cold-start flow on staging RunPod endpoint",
contentFormat="markdown",
description="Confirm the cold-start path works end-to-end on staging: first request takes ~60s (expected), subsequent requests are hot. Verify cold-start user-facing messaging appears correctly. Check Workers → RunPod proxying and SSE streaming through the warm-up window.",
additional_fields={
"parent": {"key": "PHON-5"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "generation"}, {"name": "ops"}]
}
)
- [ ] Step 3: Create "Collect staging issues; triage" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Collect issues surfaced during staging validation; triage into PHON-3 / PHON-4",
contentFormat="markdown",
description="As the validation passes (prior two tickets) surface issues, file them as new Bugs or Tasks under PHON-3 (generation quality), PHON-4 (UI polish), or PHON-7 (ops) as appropriate. Close this ticket when triage is complete and no untriaged issues remain.",
additional_fields={
"parent": {"key": "PHON-5"},
"priority": {"name": "Low"},
"labels": [],
"components": [{"name": "ops"}]
}
)
- [ ] Step 4: Create "Cut v5.1.0 release" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Cut v5.1.0 release",
contentFormat="markdown",
description="After staging validation signs off and blocking bugs in PHON-3 are resolved or deferred: tag v5.1.0, update `AppHeader.tsx` chip + drawers, update `package.json` and `pyproject.toml` version fields, update CHANGELOG, deploy to production via the `main`-branch workflow. See the existing version-bump memory/feedback for the full checklist.",
additional_fields={
"parent": {"key": "PHON-5"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "ops"}]
}
)
- [ ] Step 5: Verify tickets landed under PHON-5
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND parent = PHON-5',
fields=["summary", "priority", "labels", "components"],
maxResults=10
)
Expected: 4 results.
Task 7: Seed PHON-6 · Collaborator onboarding tickets¶
Create 5 Tasks under the onboarding Workstream (expected parent: PHON-6).
- [ ] Step 1: Create "Onboarding runbook" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Write \"Onboarding a collaborator\" runbook in Confluence Runbooks",
contentFormat="markdown",
description="Full end-to-end runbook: Atlassian access request, GitHub access grant, local dev environment setup (uv, Python, Node, wrangler, model weights), repo orientation tour, where the code lives, how the pipeline works, how to run tests, how PRs flow through develop → main. First-day checklist at the top.\n\n**Target location:** Confluence Runbooks (24346625) — as a child page.",
additional_fields={
"parent": {"key": "PHON-6"},
"priority": {"name": "High"},
"labels": [],
"components": [{"name": "docs"}, {"name": "ops"}]
}
)
- [ ] Step 2: Create "Grant access" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Grant Atlassian and GitHub access to incoming collaborators",
contentFormat="markdown",
description="Manual setup per collaborator: Atlassian invite (Developer role on Jira, edit on Confluence), GitHub repo invite (write access to neumanns-workshop/PhonoLex), Cloudflare read-only access if they need to view deploy logs. Blocked by the onboarding runbook being complete (so they have orientation docs waiting for them).",
additional_fields={
"parent": {"key": "PHON-6"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "ops"}]
}
)
- [ ] Step 3: Create "Seed good-first-issues" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Seed 3-5 good-first-issue labeled tickets across the backlog",
contentFormat="markdown",
description="Current seed includes two good-first-issue tickets (PHON-2 data/README retirement, PHON-7 plan-tier documentation). Add 1-3 more scoped for first-week pickup. Criteria: low risk, concrete outcome, touches one or two files, doesn't require deep system knowledge.",
additional_fields={
"parent": {"key": "PHON-6"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "docs"}]
}
)
- [ ] Step 4: Create "Contractor engagement terms" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Record contractor engagement terms in Confluence Legal",
contentFormat="markdown",
description="Scope, compensation structure, IP assignment, confidentiality, duration, and termination terms for each contractor engagement. Record on the Confluence Legal & Licensing page (24182786) or a child page titled \"Contractor engagements.\" Template the terms once so future engagements reuse them.",
additional_fields={
"parent": {"key": "PHON-6"},
"priority": {"name": "Medium"},
"labels": ["compliance"],
"components": [{"name": "docs"}]
}
)
- [ ] Step 5: Create "ADR 004 backfill" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Write ADR 004 — Bayesian-learned phoneme feature vectors (backfill)",
contentFormat="markdown",
description="The learned feature-vector work is complete (`packages/features/`) but the decision is not yet on record in Confluence Decisions. Backfill ADR 004 covering: why learned vectors replaced theory-assigned features, the Bayesian-inference approach (Hayes 2009 → Beta prior → PyMC model → composite trajectories), validation metrics (voicing, clustering, clinical), and the r=0.987 cosine correlation vs theory-assigned features.\n\n**Target location:** Confluence Decisions (24281128) as a child page, titled `ADR 004: Bayesian-learned phoneme feature vectors`.\n\n**Repo references:** `packages/features/src/phonolex_features/` (model, evidence, composite, validate, run), the features README, and the pyproject.toml.",
additional_fields={
"parent": {"key": "PHON-6"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "docs"}, {"name": "features"}]
}
)
- [ ] Step 6: Verify tickets landed under PHON-6
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND parent = PHON-6',
fields=["summary", "priority", "labels", "components"],
maxResults=10
)
Expected: 5 results.
Task 8: Seed PHON-7 · Operations maturity tickets¶
Create 5 Tasks under the Ops Workstream (expected parent: PHON-7).
- [ ] Step 1: Create "Document plan tiers" Task (good-first-issue)
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Document actual Cloudflare, RunPod, and D1 plan tiers on Environments page",
contentFormat="markdown",
description="The Confluence Environments and deploy topology page (24510465) has several fields currently marked unverified: Cloudflare Workers plan tier (Free vs Paid), RunPod GPU SKU in use, D1 plan tier. Log into each provider's billing console, record the actual plan, and update the page. Good first issue — concrete, self-contained, touches one Confluence page.",
additional_fields={
"parent": {"key": "PHON-7"},
"priority": {"name": "Low"},
"labels": ["audit", "good-first-issue"],
"components": [{"name": "docs"}, {"name": "ops"}]
}
)
- [ ] Step 2: Create "Deploy to staging runbook" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Write \"Deploy to staging\" runbook in Confluence Runbooks",
contentFormat="markdown",
description="Step-by-step procedure: branch from `main`, PR into `develop`, wait for CI green, merge, verify the staging deploy workflow ran green, validate on `develop.phonolex.pages.dev` and `staging-api.phonolex.com`. Include rollback procedure if the deploy fails mid-way. Target: Confluence Runbooks (24346625).",
additional_fields={
"parent": {"key": "PHON-7"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "docs"}, {"name": "ops"}]
}
)
- [ ] Step 3: Create "Cut release runbook" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Write \"Cut a production release\" runbook in Confluence Runbooks",
contentFormat="markdown",
description="Step-by-step procedure: version bump (AppHeader chip, drawers, package.json, pyproject.toml per the memory checklist), CHANGELOG update, PR `develop` → `main`, monitor prod deploy workflow, smoke-test production URLs, tag the release, announce. Target: Confluence Runbooks (24346625).",
additional_fields={
"parent": {"key": "PHON-7"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "docs"}, {"name": "ops"}]
}
)
- [ ] Step 4: Create "Rotate a secret runbook" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Write \"Rotate a secret\" runbook in Confluence Runbooks",
contentFormat="markdown",
description="The Environments page (24510465) lists every secret (Cloudflare API token, HF token, RunPod API key, etc.) but no rotation procedure exists. For each secret: how to generate a new value at the provider, how to update it in GitHub Actions / wrangler / RunPod env, how to verify the old value no longer works. Record the rotation date on the Environments page after each rotation. Target: Confluence Runbooks (24346625).",
additional_fields={
"parent": {"key": "PHON-7"},
"priority": {"name": "Medium"},
"labels": ["security"],
"components": [{"name": "docs"}, {"name": "ops"}]
}
)
- [ ] Step 5: Create "Investigate centralized alerting" Task (spike)
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Investigate centralized alerting for RunPod and Workers errors",
contentFormat="markdown",
description="Currently no centralized paging. Consider options: Cloudflare Workers alerts, Sentry, Datadog, BetterStack, or a minimal Discord / email webhook. Time-boxed spike — produce a short written recommendation with estimated cost, then file a follow-up Task if worth pursuing.",
additional_fields={
"parent": {"key": "PHON-7"},
"priority": {"name": "Low"},
"labels": ["spike"],
"components": [{"name": "ops"}]
}
)
- [ ] Step 6: Verify tickets landed under PHON-7
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND parent = PHON-7',
fields=["summary", "priority", "labels", "components"],
maxResults=10
)
Expected: 5 results.
Task 9: Seed PHON-8 · Content Catalog MVP tickets¶
Create 4 Tasks under the Content Catalog Workstream (expected parent: PHON-8). All four are planning-phase; implementation tickets decompose from the spec ticket later.
- [ ] Step 1: Create "Content Catalog MVP spec" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Write Content Catalog MVP spec",
contentFormat="markdown",
description="End-to-end design: entry schema (what's a catalog entry — a passage + metadata?), metadata fields (constraint set used, compliance stats, reading level, target sounds, use case tags), search fields, batch generation pipeline (orchestration, idempotency, resume semantics), storage target (separate ticket), UI surface (new tool page vs extension of existing). Target: `docs/superpowers/specs/YYYY-MM-DD-content-catalog-mvp-design.md`.",
additional_fields={
"parent": {"key": "PHON-8"},
"priority": {"name": "High"},
"labels": [],
"components": [{"name": "docs"}]
}
)
- [ ] Step 2: Create "Use case brainstorm" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Brainstorm initial Content Catalog use cases with representative targets",
contentFormat="markdown",
description="Three-to-five concrete use cases that the MVP must serve: articulation therapy templates (target sound + reading level), level-graded reading passages (AoA bounds), contrastive-set passages (minimal pair / maximal opposition). For each: who uses it, what parameters they pick, what a good output looks like. Feeds the spec ticket.",
additional_fields={
"parent": {"key": "PHON-8"},
"priority": {"name": "Medium"},
"labels": ["ux"],
"components": [{"name": "docs"}]
}
)
- [ ] Step 3: Create "Local-compute time budget" Task
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Estimate local-compute time budget for first batch generation run",
contentFormat="markdown",
description="Generation compute is free — it runs on the operator's local MPS hardware. The constraints are wall-clock time and local-machine availability, not dollars. Estimate: target corpus size (hundreds? thousands of passages?) × per-generation wall time on local hardware × overhead. Compare serial vs overnight-batch feasibility. Feeds the spec ticket.",
additional_fields={
"parent": {"key": "PHON-8"},
"priority": {"name": "Medium"},
"labels": [],
"components": [{"name": "ops"}, {"name": "generation"}]
}
)
- [ ] Step 4: Create "Decide storage target" Task (spike)
createJiraIssue(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
projectKey="PHON",
issueTypeName="Task",
summary="Decide Content Catalog storage target",
contentFormat="markdown",
description="Three candidates: (a) extend D1 with catalog tables, (b) use Cloudflare R2 for text blobs with D1 index, (c) static-file generation (catalog is a static build artifact committed to the repo and served by Cloudflare Pages). Trade-offs: D1 keeps everything in one place but adds write load; R2 separates blobs from index; static generation is simplest if the catalog is mostly read-only. Time-boxed spike producing a recommendation. Feeds the spec ticket.",
additional_fields={
"parent": {"key": "PHON-8"},
"priority": {"name": "Medium"},
"labels": ["spike"],
"components": [{"name": "ops"}]
}
)
- [ ] Step 5: Verify tickets landed under PHON-8
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND parent = PHON-8',
fields=["summary", "priority", "labels", "components"],
maxResults=10
)
Expected: 4 results.
Task 10: Create dependency links (blockedBy)¶
Capture the clearest ticket-level dependencies as Jira issue links. Use createIssueLink with a "Blocks" link type (or "is blocked by" depending on the direction; discover valid types with getIssueLinkTypes first).
- [ ] Step 1: Discover valid link types
mcp__plugin_atlassian_atlassian__getIssueLinkTypes(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84"
)
Record the correct link type name (commonly "Blocks" with inward "is blocked by" and outward "blocks").
- [ ] Step 2: Create "Cut v5.1.0 release" blockedBy validation tickets
Find the issue keys for:
- "End-to-end validation pass on staging for all seven tools" (under PHON-5)
- "Validate governed generation cold-start flow on staging RunPod endpoint" (under PHON-5)
- "Cut v5.1.0 release" (under PHON-5)
Use searchJiraIssuesUsingJql with specific summary searches if the keys were not captured from Task 6.
Then create two issue links — Cut v5.1.0 release is blocked by the two validation tasks:
mcp__plugin_atlassian_atlassian__createIssueLink(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
inwardIssueKey="<Cut v5.1.0 key>",
outwardIssueKey="<End-to-end validation pass key>",
linkType="Blocks"
)
(Link type direction: outwardIssueKey blocks inwardIssueKey. Adjust if the link type discovered in Step 1 reverses the semantics.)
Repeat for the cold-start validation ticket.
- [ ] Step 3: Create "Grant access" blockedBy "Onboarding runbook"
Find the PHON-6 ticket keys for:
- "Write \"Onboarding a collaborator\" runbook in Confluence Runbooks"
- "Grant Atlassian and GitHub access to incoming collaborators"
Create the issue link — Grant access is blocked by Onboarding runbook.
- [ ] Step 4: Create PHON-8 "Decide storage target" blockedBy "Content Catalog MVP spec"
The storage-target decision is actually informed by the spec, not a blocker of it. So the direction is: the spec gates the storage decision. Create: Decide storage target is blocked by Write Content Catalog MVP spec.
Actually rethink: spec and storage-target are often iterated together. If a strict dependency feels wrong, skip this link and record the decision in the task report.
- [ ] Step 5: Verify links created
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON AND issueLinkType = "is blocked by"',
fields=["summary", "issuelinks"],
maxResults=20
)
Expected: 2-3 tickets show is blocked by relationships.
Task 11: Publish Jira conventions page on Confluence¶
Create a single Confluence page documenting the Jira conventions so collaborators can reference them.
- [ ] Step 1: Compose the page content
The page codifies the conventions from the spec: hierarchy (Workstream → Task|Bug → Sub-task), nine Components mapped to monorepo packages, eight-label taxonomy, default priority Medium, no estimation, unassigned = up for grabs, six-state workflow, Developer role for collaborators. Keep it ~400-600 words, scannable, tabular where useful.
- [ ] Step 2: Create the page under Runbooks
mcp__plugin_atlassian_atlassian__createConfluencePage(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
spaceId="24215555",
parentId="24346625", # Runbooks section
title="Jira conventions (PhonoLex project)",
contentFormat="markdown",
body=<composed content>
)
Record returned page ID.
- [ ] Step 3: Verify
mcp__plugin_atlassian_atlassian__getConfluencePage(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
pageId=<returned page ID>,
contentFormat="markdown"
)
Confirm title matches and parent is 24346625.
Task 12: Final verification and memory save¶
- [ ] Step 1: Verify all Workstreams and tickets exist
searchJiraIssuesUsingJql(
cloudId="7a1f4095-96d2-458f-9a92-11413f425d84",
jql='project = PHON ORDER BY created ASC',
fields=["summary", "issuetype", "priority", "labels", "components", "parent"],
maxResults=50
)
Expected: 40 total issues (8 Workstreams + 32 tickets — 4 + 4 + 4 + 2 + 4 + 5 + 5 + 4 = 32).
Verify:
- 8 Workstreams
- 3 Bugs (all under PHON-3)
- 29 Tasks
- At least 3 tickets labeled good-first-issue
- [ ] Step 2: Save a reference memory
Write to /Users/jneumann/.claude/projects/-Users-jneumann-Repos-PhonoLex/memory/reference_jira_backlog.md:
---
name: Jira PHON project backlog
description: Starter Workstreams and conventions for the PhonoLex Jira project; companion to the Confluence KB
type: reference
---
**Jira site:** `neumannsworkshop.atlassian.net`
**cloudId:** `7a1f4095-96d2-458f-9a92-11413f425d84`
**Project:** `PHON` (PhonoLex)
## Conventions
- Hierarchy: Workstream → Task | Bug → Sub-task
- Components = monorepo packages (web-api, web-frontend, generation, governors, data, features, tokenizer, ops, docs)
- Labels: bug, compliance, audit, ux, perf, security, spike, good-first-issue
- Default priority: Medium
- Workflow: Backlog → To Do → In Progress → In Review → Blocked → Done
- Unassigned = up for grabs
- Confluence conventions page: <page ID from Task 11>
## Starter Workstreams
- PHON-1 Legal & compliance cleanup
- PHON-2 Dataset inventory completion
- PHON-3 Governed Generation quality
- PHON-4 Governed Generation UI polish
- PHON-5 Production validation & v5.1 prep
- PHON-6 Collaborator onboarding
- PHON-7 Operations maturity
- PHON-8 Content Catalog MVP
## Reference docs
- Design spec: docs/superpowers/specs/2026-04-18-jira-backlog-seed-design.md
- Implementation plan: docs/superpowers/plans/2026-04-18-jira-backlog-seed.md
Update MEMORY.md to add this reference under the References section.
- [ ] Step 3: Historian-test spot check
Pick two random tickets, read their summary + description, and confirm: is the ticket actionable? Is the context in the description enough for a collaborator to pick it up? If either feels weak, flag in the task report.
- [ ] Step 4: Open a PR
The spec and plan commits are already on docs/confluence-kb-design. If the Confluence KB PR has already been opened, either (a) push this branch as-is so it extends the existing PR, or (b) open a follow-up PR on a new branch. Prefer (a) for narrative coherence — both specs are "stand up Neumann's Workshop ops tooling."
Self-review notes¶
- Spec coverage: Every spec section maps to a task.
- Conventions (hierarchy, components, labels, priority, workflow, assignment) → Task 0 (manual admin) + Task 11 (Confluence conventions page).
- 8 Workstreams → Task 1.
- 32 seed tickets by Workstream → Tasks 2-9.
- Dependency links → Task 10.
- Success criteria 1-5 → verified in Task 12.
- Template-ability is documented in the spec and reinforced by Task 11's conventions page.
- No placeholder content: Every ticket has a complete summary, description, priority, labels, and components. Steps include exact tool-call payloads. Placeholders like
{Cut v5.1.0 key}in Task 10 are runtime values captured from earlier tool responses, not content placeholders. - Type consistency: All Workstream keys are referenced consistently (
PHON-1throughPHON-8in creation order). Task 1 Step 9 notes the key-shift risk if other issues are created in PHON before this plan runs. - Scope: Single plan — seed a fresh backlog. No code changes.