Authoritative programme issue: #645 Durable decision ledger:
UPSTREAM_PORTS.mdPhase 0 PR: #651 Optional mirror: GitHub Project #1
The ledger records durable upstream decisions and evidence. Issue #645 is the authoritative operational index, with #646–#650 as its work-package sub-issues. GitHub issue state, labels, sub-issue relationships, dependency relationships, and linked pull requests show live execution.
Project #1 may mirror this structure later when write access is available, but it is never a gate or a source of truth. A project-field or project-card change cannot replace an issue relationship or ledger update.
Phase 0 is complete only when all of these conditions are verified:
- PR #651 is merged.
- Issues #646 through #650 are linked as sub-issues of #645.
- Relevant programme issues and pull requests have the labels required below.
- PR #638 is closed as superseded and links to
UPSTREAM_PORTS.mdas the replacement strategy.
Issue #645 stays open for the full programme. Runtime packages do not begin before the Phase 0 exit is verified unless #645 records a narrow exception.
| Item | Relationship | Role | Dependency or status rule |
|---|---|---|---|
| #645 | Parent programme issue | Authoritative operational index | Remains open until the full programme is complete |
| #646 | Sub-issue of #645 | Built-image smoke gate | Starts after Phase 0; blocks dependent platform and data packages |
| #647 | Sub-issue of #645 | uv, lockfile, CI, lint, and Docker | Blocked by #646; no dependency upgrades during conversion |
| #658 | Sub-issue of #647 | uv dependency source and lock foundation | Blocked by #646; supplies the base for #659 |
| #659 | Sub-issue of #647 | Locked App Tests and standalone lint workflow | Blocked by #658; supplies the base for #660 |
| #660 | Sub-issue of #647 | Docker, local tooling, and repository-documentation cutover | Blocked by #659 and #670; completes the no-upgrade codebase conversion |
| #669 | Sub-issue of #647 | Publish the matching GitHub Wiki commands | Blocked by #660; #647 remains open until this separately authorized follow-up is published |
| #670 | Sub-issue of #647 | Resolve the fail-closed aiohttp security audit | Blocks #660; keep all three advisories unsuppressed and review the dependency change independently |
| #648 | Sub-issue of #645 | Datetime/calendar integrity and import-date fixes | Blocked by #646; final runtime semantics precede audit and migrations |
| #649 | Sub-issue of #645 | MAL, AniList, and Open Library correctness | Blocked by #646; AniList unknown dates coordinate with #648 |
| #650 | Sub-issue of #645 | Identity audit, repair, and constraints | Blocked by #646 and relevant #648 semantics |
| #597 | Related coordination issue | Reusable deployment preflight | Relates to #646; not a child unless its scope is explicitly moved into #645 |
| #639 | Related evidence issue | Cross-provider episode/calendar duplicate regression | Relates to #650; remains independently closeable |
| #390 | Related evidence issue | Existing CI/Ruff signal | Relates to #647; preserve or deliberately replace its chosen policy |
| #512 | Related coordination issue | Low-tier performance/startup audit | Receives evidence from #646 and #647; not a child by default |
Closed issues remain evidence rather than active children. Relevant examples include #30, #36, #246, #295, #379, #529, #557, #559, #593, #604, #620, and #623.
| Pull request | Programme relationship |
|---|---|
| #651 | Phase 0 ledger and governance; linked to #645 and required for the Phase 0 exit |
| #653 | Independent first-run query-budget repair; narrow Phase 0 exception recorded on #645 |
| #654 | Independent CI pull request; linked to #645 and related to #390, with no code dependency on #651 or #653 |
| #656 | Built-image smoke gate; bottom layer of the #647 delivery stack |
| #663 | uv dependency and lock foundation; stacked on #656 |
| #665 | Locked CI and lint workflows; stacked on #663 |
| #638 | Superseded merge/cherry-pick strategy; close with a link to the semantic-resolution ledger |
- Give each active work-package issue exactly one
priority: P0throughpriority: P3label and the applicablearea:*labels. Addbug,technical debt, ordocumentationonly when it describes the work. - Give implementation pull requests
triage: linked PRand the area and priority labels of the work they deliver. At Phase 0 exit, verify the relevant labels on #645–#650 and the independent #651, #653, and #654 pull requests. - Use sub-issues only for work owned by #645. Use native blocked-by/blocks relationships for sequencing and related links for coordination or evidence; do not turn #597, #639, #390, or #512 into children solely for visibility.
- Keep an issue open while accepted scope remains. Close a work-package issue only after its merged pull requests and validation evidence are recorded in
UPSTREAM_PORTS.md; keep #645 open until every programme outcome is terminal. - Do not close a concrete bug because a broader package exists. Keep closed historical issues closed and use them as evidence.
- When a decision changes, update
UPSTREAM_PORTS.md; issue state and labels are operational metadata, not durable decision evidence. - After each upstream review, create or link scoped issues only for accepted Pending work. Do not create execution issues for merge commits, release bumps, generated churn, discarded implementations, or individual dependency-bot commits.
Use GitHub's native stacked pull requests, currently a public preview, through GitHub's official gh stack extension only for genuine code dependencies. Do not create a stack merely to couple reviews of otherwise independent work.
- Keep every stack in the Floppy repository. The bottom pull request targets
latest; each higher pull request targets the branch immediately below it. Every layer must satisfy the same branch rules and CI gates. - Merge bottom-up, either one layer at a time or as a contiguous group starting at the lowest unmerged layer. Use the supported cascading rebase and automatic retargeting when lower layers change or merge.
- Keep stacks short and reviewable: the default maximum is three layers unless a documented dependency requires more.
- The #656 → #663 → #665 → #660 delivery is the recorded temporary four-layer exception: the repository's workflow guard requires CI-only changes to remain separate while each later layer genuinely consumes the earlier uv foundation.
- PRs #651, #653, and #654 remain independent because none has a code dependency on another.
- Candidate stacks are #646 smoke gate -> the dependent #647 uv/Docker adaptation; #648 runtime semantics -> read-only audit -> migrations; and #650 audit -> repair -> constraint. MAL and Open Library fixes remain independent; AniList may stack on the #648 unknown-date layer when it depends on those semantics.
- Each layer still requires the user's separate merge authorization. Never use a stack to merge Yamtrack history, and never merge a contiguous group unless every included layer has been authorized.
- Merge #651, verify the Phase 0 issue relationships and labels, and close #638 as superseded; keep #645 open.
- Review #653 and #654 independently under their own authorization and validation gates.
- Complete #646.
- Complete #647 in order: #658 lock foundation, #659 locked CI, independently resolve the unsuppressed #670 security blocker, complete the no-upgrade #660 Docker/tooling/repository-documentation cutover, then publish the separately authorized #669 Wiki update. Keep #647 open until #669 is published.
- Land isolated correctness fixes within #648 and #649, then their larger staged packages.
- Complete the audit/repair/constraint sequence in #650.
- Create focused issues for deferred product work only when its ledger trigger fires.