22 KiB
22 KiB
Task: Write Pi runtime hard-cutover implementation spec
Identity
- Task ID: 20260822-pi-runtime-spec-b6e2c9a4
- Mode: Feature
- Branch: codex/20260822-pi-runtime-spec-b6e2c9a4-pi-runtime-spec
- Worktree: D:\Datas\OthersProjects\makelore-pi-runtime-spec-b6e2c9a4
- Base commit:
fba68e86d9 - Owner: codex
- Status: Ready for integration
Scope
- Convert the approved OpenCode-to-Pi hard-cutover design into a normative, implementation-ready specification.
- Define product behavior, architecture and ownership boundaries, runtime and process contracts, data schemas, Host API and Renderer protocols, migration, packaging, performance, observability, verification, and Definition of Done.
- Produce an associated dependency ticket graph with explicit ready frontiers, ownership areas, outputs, and acceptance criteria suitable for a later implementation run.
- Track task-scoped qualification results against that graph without promoting
partial platform evidence into a
PI-000Go decision. - Apply the user's 2026-08-22 scope amendment: Phase-0 platform qualification is
Windows x64 + Linux x64; macOS x64/arm64 is Explicitly Waived / Deferred for
PI-000only and moves to mandatoryPI-150release validation. - Apply the user's later 2026-08-22 Provider-risk decision: real external
Provider Account/protocol and real-provider two-worker qualification are
Explicitly Waived / Accepted Risk, never Pass; retain packaged loopback/
provider-shaped evidence with
realTurnVerified=false. - Documentation only: do not change product code, dependencies, canonical memory, runtime behavior, or external issue/PR state.
Intent And Constraints
- Pi is the sole target coding runtime. Do not retain an OpenCode fallback, feature flag, compatibility Adapter, old Host API facade, or dual runtime.
- Preserve
.niancode/project.json, stable Agent IDs, existing app/protocol/ storage compatibility identifiers, and Main ownership of runtime, provider, secret, file, and system access. - Keep Pi wire types and session paths out of Renderer; specify a Makelore-owned Snapshot/Patch contract and deep Main-owned runtime Module.
- Treat packaged runtime qualification, packaged provider-shaped compatibility/ concurrency/abort, and resource budgets as a blocking Phase-0 gate rather than assumed facts.
- Treat
QG-004/QG-005as explicit human waivers, not Pass: the user accepts the unverified real Provider Account protocol compatibility and real two-worker provider overlap/isolation risks, so external credentials are no longer aPI-000,PI-150, or release blocker. - Make first-Conversation Composer readiness independent of runtime and metadata readiness; distinguish local runtime overhead from Provider latency.
- Specify old OpenCode Session handling as backup plus non-continuation, not as compatibility behavior.
- The named
implement-specskill assumes an existing spec and tickets. For this request, use its execution-graph discipline to create the missing spec and tickets, but do not start implementation, create a PR, or create subagents. The user explicitly prohibited subagents.
Project Context Loaded
- The
maintain-project-docsConcurrent Task Gate and Planning Gate passed in the isolated worktree above at basefba68e8. - The main worktree remains owned by a blocked OpenCode model-switch integration task and contains a separately owned untracked task record; neither is modified here.
- Required canonical positioning/current-state/decision/architecture/domain/ evidence/reflection/commitment records and the relevant Pi/OpenCode peer task records were read before writing.
- No accepted ADR conflicts with the hard-cutover proposal. Current OpenCode behavior is integrated state that a future Pi implementation will supersede.
- The canonical project-positioning document remains a placeholder, so product scope is taken only from repository guidance and confirmed current state.
- Gate result: Passed.
- Human scope decision: on 2026-08-22 the user explicitly accepted deferring
macOS x64/arm64 qualification from
PI-000toPI-150. This does not create macOS Pass evidence and does not waive the final cross-platform release gate. - Human Provider-risk decision: on 2026-08-22 the user explicitly accepted the
missing real external Provider compatibility, concurrency and isolation
evidence.
QG-004/QG-005are Explicitly Waived / Accepted Risk, not Pass;QG-007remains Pending / not triggered because a waiver is not a failure.
Plan
- Translate the detailed design into normative requirements and stable product contracts without copying vendor wire types into public interfaces.
- Define schemas, lifecycle/state rules, event mapping, migration, packaging, performance budgets, failure behavior, and traceable acceptance criteria.
- Build a dependency ticket graph whose initial ready frontier begins with the packaged Pi qualification gate and whose terminal ticket proves zero OpenCode runtime residue.
- Validate cross-references, dependency closure, Markdown structure, task ownership, and project-documentation gates.
Outcome
- Added the normative implementation specification
.project-docs/10-decisions/proposals/20260822-pi-runtime-spec-b6e2c9a4__pi-runtime-cutover-spec.md. - Added the associated execution graph
.project-docs/10-decisions/proposals/20260822-pi-runtime-spec-b6e2c9a4__pi-runtime-cutover-tickets.md. - The Spec defines 134 unique normative requirements across 19 groups for the hard cutover, product behavior, Main/Renderer boundary, schema v2, Provider and managed resources, Pi process/RPC/worker pool, extensions, Snapshot/Patch event projection, Host API, changes/browser, migration, packaging, observability, performance, recovery, verification, and Definition of Done.
- The ticket document defines 18 bounded tickets and 31 dependency edges. The
graph is acyclic, its initial ready frontier is only
PI-000, and every ticket includes dependencies, ownership, required work, acceptance, and verification. - Packaged Pi qualification is a blocking gate. If RPC, packaged provider-shaped contract/concurrency/abort, resource use, or cold/warm budgets fail, the implementation must stop and amend the architecture before product migration; it cannot add an OpenCode fallback or dual RPC/SDK production path. Missing explicitly waived real external Provider evidence is not a confirmed failure.
- The first-Conversation correction is a hard UX requirement: project/partner/ Conversation creation is local-only, Composer editability is independent of runtime/metadata readiness, and local preparation has bounded, observable failure instead of minute-long disabled state.
- No product code, dependencies, external tickets, PR, canonical project memory, or runtime behavior changed. No subagents were created.
- Synchronized the first
PI-000implementation result from task20260822-pi-runtime-qualification-c52e8a14into the ticket graph. The final planning state is Done with explicit waivers: the exact Pi 0.84.2 identity, Windows x64 and WSL2 Linux x64 workspace/staged/controlled packaged RPC/ session/process/closure behavior, four-protocol packaged loopback, provider-shaped overlap/abort and local budgets have evidence. Real external turns for all four protocols remain missing and are Accepted Risk, not Pass. - Synchronized the controlled Electron Builder
app.asarand four-protocol loopback results. The packaged seam resolves all 130 Windows-applicable production packages and six runtime assets, passes cold/warm budgets and leaves no process residue. The loopback matrix proves request/SSE/image/ header/model/environment-credential plumbing plus provider-shaped overlap and abort isolation, but is explicitly not real Provider Account evidence. - Synchronized the WSL2 Ubuntu 24.04 Linux x64 evidence. Workspace, staged
closure, and controlled Electron Builder
dir/app.asarall meet the local cold/warm budgets; the controlled artifact resolves 131 applicable packages, six runtime assets and unpacked native assets, and leaves no Pi process residue. Linux packaged loopback overlap was 292/290/277/288 ms for the four protocols, with exactly four POSTs per protocol and abort isolation passing. - Interpreted the accepted
QG-002wording narrowly and explicitly: it requires a Linux packaged app seam but does not state a non-WSL kernel, compositor, AppImage, or deb requirement. The WSL2 controlled artifact therefore counts as PI-000 Linux seam evidence with a recorded limitation; final Linux release formats remainPI-150evidence and are not claimed here. - Synchronized the macOS packaged-resource preflight defect and fix. The old
artifact-side derivation would resolve
<app>/Contents/MacOS/resources/app.asar; the actual location is<app>/Contents/Resources/app.asar. The outer platform-awarepackagedResourcesDirectory()now computes the directory once and passes it throughPI_PROBE_RESOURCES_DIRECTORY, so the closure inspector no longer derives it independently. - Kept macOS explicitly unqualified. A darwin path test and a Windows actual controlled-packaged regression establish the fix and absence of a Windows regression, but neither is a macOS x64/arm64 execution sample.
- Applied the user's 2026-08-22 amendment: macOS x64/arm64 is now Explicitly
Waived / Deferred for
PI-000, not Pass. Workspace/staged/controlled packaged/loopback/metrics move toPI-150, where both architectures remain mandatory. The user accepted the risk of later packaging/native/resource/ performance defects and release-stage rework; the risk was not eliminated. - Clarified the pre-existing artifact wording:
PI-000proves the controlled packaged qualification artifact on Windows/Linux, whilePI-150owns final product artifacts. The controlled probe is not the final bundler. - After the later Provider waiver and a full PI-000/DAG audit, marked
PI-000Done with explicit waivers and advanced the exact Ready Frontier toPI-010,PI-020, andPI-030. The published shrinkwrap/devDependencies mismatch remains an explicitPI-030permanent-staging constraint rather than final packaging proof; it is work owned by the now-ready ticket, not an unresolved PI-000 gate. - Bound the final planning documents to the verified PI-000 implementation
baseline
2bc423ebc58589307442ebdaf1c81d83ec9dc2d5(feat: qualify Pi runtime cutover foundation). The implementation task isready_for_integration, its worktree is clean, and the PI-010 task20260822-pi-conversation-contracts-a61d9c42has been created from that exact commit with statusplanning. - Corrected two stale planning statements before final commit: the Spec now records the user's implementation authorization instead of saying it awaits acceptance, and PI-040 now verifies Provider catalog behavior with packaged provider-shaped fixtures rather than making waived real-account prompts a hard acceptance requirement.
Verification
- Read the complete source design and the relevant Pi evaluation, concurrency, message-mapping, first-session diagnosis, and current OpenCode integration task records after passing the planning gate.
- Requirement audit: 134 definitions, 134 unique IDs, no duplicate definitions; all 19 requirement groups appear in the ticket traceability section.
- Ticket graph audit: 18 declared nodes, 31 edges, all graph nodes have matching
detail sections, no missing dependencies, and a complete acyclic topological
order from
PI-000throughPI-160. - Ticket shape audit: every ticket contains Objective, Dependencies, Owns, Required work, Acceptance, and Verification.
- Markdown code fences are balanced: 34 in the Spec and 4 in the ticket graph.
- Placeholder scan found no unfinished TODO/TBD/template markers; the literal
todo/todosoccurrences only describe intentional removal of the old API. - Trailing-whitespace/final-newline check passed for all three owned files.
- Task-scoped
git diff --no-index --checkproduced only expected LF-to-CRLF notices and no whitespace errors. check_project_docs.py: passed.check_doc_drift.py --task-id 20260822-pi-runtime-spec-b6e2c9a4: passed and reported only the two task-scoped proposal files and this task record.- Product tests were intentionally not run because this task changes only task-scoped documentation and no product behavior.
- Read the complete source task record and task-scoped evidence for
20260822-pi-runtime-qualification-c52e8a14. Its Markdown status isCompleted — Done with explicit waivers, the ownership registry reportsready_for_integration, and its clean worktree is at verified commit2bc423ebc58589307442ebdaf1c81d83ec9dc2d5. - Rechecked the qualification result against
PI-000Acceptance and Stop condition: every non-waived requirement is satisfied by Windows/WSL2-Linux controlled packaged evidence. Real Provider Accounts/turn concurrency remain unverified Accepted Risk; macOS remains unqualified and mandatory atPI-150. - Reviewed the controlled packaged evidence: 5 cold samples reported p50/p95/max 668/682/682 ms, 5 warm samples 660/663/663 ms, 10 RSS samples 138404/141320/141320 KiB, and exit 16/18/18 ms. Session/reopen/failure/local overlap/abort/stdin-close passed with no controlled artifact or Pi RPC process residue.
- Reviewed all four packaged loopback protocol contracts: each made exactly
four POSTs
and passed base URL/path, protocol credential header, custom header, model,
PNG image, two-worker settled overlap, one-worker abort isolation, and clean
stdin close. The final tightened rerun reported overlap of
304/309/290/297 ms. No external Provider request or cost occurred, so the
normative
QG-004andQG-005are Explicitly Waived / Accepted Risk, not Pass. Under the user-amended Phase-0 platform scope,QG-002,QG-003, andQG-006are Pass for Windows x64 + Linux x64; macOS remains Explicitly Waived / Deferred, not Pass. - Verified that the implementation report fields now match this amended
planning contract.
buildMissingEvidence()reports Phase-0 aggregation as Windows x64 + Linux x64, labels macOS x64/arm64 as user-deferred toPI-150, and retains the four missing real-provider protocol samples. The focused test asserts that exact wording; the final implementation task records 9 focused tests, scoped ESLint, typecheck, and a 1-sample actual probe as passing. The retained missing samples andrealTurnVerified=falsenow document Accepted Risk rather than a blocker. The 18-node/31-edge DAG is unchanged;PI-000Done unlocksPI-010,PI-020, andPI-030. - Recorded the Provider URL rule discovered by the fixture: Anthropic receives
the Provider root and appends
/v1/messages; OpenAI-style protocols receive a/v1base and appendchat/completionsorresponses. - Reviewed the Linux 5+5 samples: workspace cold/warm p95 853/437 ms, staged 428/440 ms, controlled packaged 545/569 ms; respective RSS p95 values were 170388/175956/181928 KiB and exit p95 values 8/8/7 ms. All 131 applicable Linux packages and six runtime assets resolved, including unpacked native assets, with no residual artifact/Pi RPC process.
- Reviewed the Linux packaged loopback matrix: exactly four POSTs per protocol, overlap 292/290/277/288 ms, correct path/auth/custom-header/model/image, abort isolation and clean exit. The accompanying 7 tests, scoped ESLint, typecheck, and 1-sample integration probe passed in the implementation task.
- Corrected the planning QG status table to use the normative Spec numbering:
QG-003is dependency closure,QG-004Provider Accounts,QG-005real provider concurrency,QG-006metrics, andQG-007the SDK-switch stop condition. The implementation evidence's task-local labels are retained only as source context and do not redefine the Spec. - Reviewed the portability-fix verification: 8 focused tests passed, including
darwin executable →
Contents/Resources; scoped ESLint and typecheck passed. The post-fix Windows 1-sample controlled packaged regression reported cold/ warm ready 650/641 ms, with all 130 applicable packages, six runtime assets, and unpacked native assets present. - Reviewed the execution-environment inventory: there is no repository CI
definition, macOS runner/SSH host, GitLab runner CLI, or Provider credential
environment variable. The missing Provider environment is now Accepted Risk
and non-blocking; the missing macOS environment remains a deferred
PI-150release gap. - Post-sync graph audit still reports 18 nodes, 31 edges, only
PI-000at indegree zero, and a complete acyclic topology; no dependency edge changed. - Scope-amendment audit preserved all 18 nodes and 31 edges. The Ready Frontier
after
PI-000Done is exactlyPI-010,PI-020,PI-030; all other nodes retain at least one unfinished dependency. - Post-amendment requirement audit still reports 134 definitions, 134 unique
IDs, and no duplicates. The ticket audit reports 18 Mermaid nodes, 18 detail
sections, 31 edges, only
PI-000at indegree zero, and all 18 nodes visited by the acyclic topology check. - Post-amendment contradiction scan found no remaining statement that treats
missing macOS evidence as a
PI-000blocker or Pass. The Spec and tickets consistently make the waiver Phase-0-only andPI-150release-blocking. - Provider-waiver audit found no remaining proposal statement requiring a real
external Provider Account/credential to close
PI-000or release. The exact accepted risks are auth/endpoint/proxy/rate-limit/response variance; real base URL/header/environment credential/model/image compatibility; real provider concurrency/serialization/limiting; and cross-worker abort/event/ session/model/credential isolation.QG-004/QG-005are never labeled Pass, andQG-007remains Pending / not triggered. - PI-000 closure audit covered all eight Required work items plus Acceptance and Stop condition. Items 1/2/3/4/7/8 pass on the revised Windows/Linux scope; items 5/6 retain passing packaged loopback/provider-shaped substitute smoke and explicit real-Provider Accepted Risk. No third incomplete item or confirmed failure remains, so Done with explicit waivers is consistent with the ticket contract.
- Post-sync
check_project_docs.pyandcheck_doc_drift.py --task-id 20260822-pi-runtime-spec-b6e2c9a4passed; trailing-whitespace inspection reported zero findings. - Re-ran both project-documentation gates after the user-authorized scope amendment; both passed against only the two task-scoped proposal files and this task record. Markdown fences remained balanced and trailing-whitespace inspection reported zero findings.
- Final Provider-waiver audit preserved 134 unique requirements across all 19
traced groups and the unchanged 18-node/31-edge acyclic DAG. Recomputing
readiness with only
PI-000Done yields exactlyPI-010,PI-020,PI-030; every other ticket retains an unfinished predecessor. Ticket-shape, QG-state, explicit-risk, macOS-release-gate, hard-cutover, cross-reference, stale-blocker and formatting assertions all passed. - Verified the PI-000 implementation commit metadata, parent and changed-file
set. Commit
2bc423eis based on the planning baselinefba68e8and contains only the PI-000 dependency/lockfile, probe/test, task-record and evidence changes expected from the qualification ticket. - Verified the PI-010 ownership handoff through the task registry and worktree:
task
20260822-pi-conversation-contracts-a61d9c42is based exactly on2bc423e, remains inplanning, and its only untracked file is its own task record. The planner's three-document write set does not overlap PI-010's product-code ownership.
Follow-ups
- Continue
PI-010, which has entered planning from the verified PI-000 baseline;PI-020andPI-030remain the other eligible Ready Frontier tickets. The dependency-qualified frontier remains exactlyPI-010,PI-020,PI-030until a later status update recomputes it. Real external Provider fixtures foropenai-completions,openai-responses,anthropic-messages, andopenrouterare optional non-blocking risk-reduction work; if collected, retainrealTurnVerified=falseuntil actual evidence exists and never retroactively relabel the waiver as Pass. - At
PI-150, obtain the deferred macOS x64 and macOS arm64 evidence. For each architecture, use an independent checkout and frozen install; run workspace 5+5, staged 5+5, controlled packaged 5+5, packaged loopback, closure/native/ resource checks, metrics, and final target artifact verifier/smoke. Do not reuse x64/arm64node_modules, Electron downloads, or artifacts. Missing either architecture blocks cross-platform release-ready status. - Treat non-WSL Linux, compositor, AppImage/deb, and the final product packaging
wiring as
PI-150release evidence unless the accepted PI-000 Spec is amended to require them earlier; do not imply the controlled WSL2 artifact proves those release boundaries. - If a non-waived packaging, packaged provider-shaped contract/concurrency/
abort-isolation, image-serialization, or budget gate fails, return to the
planner for the specified SDK-in-Electron-utility-process amendment; do not
add an OpenCode fallback or RPC/SDK dual production path. If deferred macOS
validation fails at
PI-150, block release and perform the required packaging/runtime/architecture rework; the Phase-0 waiver cannot be reused as a release waiver. - If old OpenCode chat history must remain readable, create a separate exporter in the last OpenCode-containing release; do not add an OpenCode reader/runtime to the Pi release.
Promotion Candidates
- Accepted ADR: Pi is Makelore Code's sole runtime and no OpenCode fallback is shipped.
- Canonical architecture: one Main-owned worker per active/warm Conversation,
a product-only
CodingConversationRuntimeInterface, and Renderer-only Snapshot/Patch state. - Domain rules: product Conversation IDs, structured model selections, explicit unresolved migration state, same-project mutation lease, and old OpenCode Session backup/non-continuation policy.
- Success criteria: first-Conversation Composer readiness, cold/warm runtime and prompt acceptance budgets, independent two-Conversation workers with packaged provider-shaped overlap/abort, explicit real-Provider Accepted Risk, subagent caps, and zero residual OpenCode runtime in source/package/artifact.