Consolidated tracking issue for items surfaced by the v0.9.4 pre-release multi-persona review (CTO, PM, Data Engineer, Tech Lead, Support Engineer) and deliberately deferred out of the release because each requires more than a 30-min patch (new design work, performance experiment, cross-platform testing, or org-level infra).
All items were re-verified against the release/v0.9.4 tree; the review's original list of 9 was reduced to 8 after empirical checks (packages/tui typecheck runs green — that item was a false positive).
D1 — Interactive activation-menu picker (arrow-key selectable rows in the chat)
What: The activation menu that ends every /onboard-connect branch is currently plain LLM-emitted text — the user types the number instead of arrow-selecting a row.
Why deferred: Design decision, not a 30-min fix. The plain-text design was chosen in commit e89955fe3e because (a) an earlier DialogActivation modal never rendered for users with pre-loaded creds (auth-arrival timing meant the false → true transition never fired), and (b) a fixed option-set can't personalize per scan verdict, whereas the LLM branches on warehouse/dbt discovery. Reverting to a picker needs to solve both problems — either intercept LLM-emitted numbered messages in the TUI (fragile heuristic) or introduce a structured tool-call schema and route selection back through the LLM.
Attribution: Design decision — @haider (e89955fe3e).
D2 — Retire the globalThis bandaid on the Question pending-registry
What: packages/opencode/src/question/index.ts:165 anchors the pendingByDir registry on globalThis["__altimateQuestionPending"] so every duplicated module copy shares one Map. Root cause is dual module-graph loading in the runtime (compiled bundle vs. dev-mode source imports), not the registry itself.
Why deferred: Correct fix is fixing the module-graph duplication so there is only one question module. That means auditing every import path in packages/opencode, packages/tui, and the plugin surface for both dev and compiled builds — bigger than a release patch.
Attribution: @saravanan-altimate (8c9a9a893b7, 2026-07-24).
D3 — Server-side shell-arg validation for user-pasted dbt paths (move defense out of the template)
What: packages/opencode/src/command/template/onboard-connect.txt:197-213 instructs the LLM to refuse paths containing ; & | > < $ \ ( ) { } newlineor single-quotes, verify executability withtest -x`, and always wrap in single quotes. That defense-in-depth is real but template-level — a model that ignores the instructions could still shell-inject.
Why deferred: Requires designing a validation layer at the tool boundary (probably a new dbt_binary_validate server tool or a bash-wrapper allowlist) and rewriting the template to route through it. Not mechanical.
Attribution: @saravanan-altimate (4f12e7d08ef, PR #1001 landing).
D4 — Slim the bundled target/manifest.json (gzip + inflate on materialize)
What: packages/opencode/sample-projects/jaffle-shop-duckdb/target/manifest.json ships at 684KB uncompressed. Every npm install -g altimate-code downloads it; every sample_setup copies it byte-for-byte (with {{SAMPLE_ROOT}} sentinel rehydration).
Why deferred: Needs (a) build-step change to gzip the shipped copy, (b) inflate step in copySampleTree, (c) size measurement + package-size regression guard. Cheap on wall-clock, but touches packaging.
Attribution: @saravanan-altimate (4f12e7d08e, PR #1001).
D5 — Windows long-path handling in copySampleTree
What: packages/opencode/src/altimate/onboarding/materialize.ts:471 uses stock fs.cpSync / fs.copyFileSync / fs.mkdirSync. On Windows, paths longer than 260 chars need the \\?\ prefix unless the process opts in to long-path support. A user materializing into a deeply-nested directory would hit ENAMETOOLONG.
Why deferred: Fix is a Windows CI matrix + long-path guard. Bun's fs may or may not paper over this; needs empirical test on a Windows runner before choosing a solution.
Attribution: @saravanan-altimate (4f12e7d08ef, PR #1001).
D6 — Dedup question events at the /event boundary (or formalize the dual-emit contract)
What: packages/opencode/src/question/index.ts:100-130 deliberately mirrors question.asked / question.replied / question.rejected via Bus.publish in addition to EventV2 — the webview subscribes to the wildcard PubSub feed and otherwise never sees the events. The EventV2Bridge.listen forwarder ALSO republishes to GlobalBus, so /global/event consumers see each event twice (different top-level ids). Verified in-repo consumers (TUI sync.tsx, notifications.ts, trace consumer) all dedupe or ignore — external subscribers to /event that don't dedupe would double-count.
Why deferred: Two viable fixes: (a) dedupe in the /event handler itself (server-side, safe for external subscribers), or (b) drop one of the two publish paths and migrate every internal consumer. Both require SDK contract review — this is public API.
Attribution: @saravanan-altimate (8c9a9a893b7, 2026-07-24).
D8 — Sitewide internal-tracker-ref scrubber + pre-push git hook
What: altimate-code is a public repo; the org rule is that internal-tracker references (project prefix + numeric id, and the internal Atlassian host) must never land in branch names, commits, code, or docs on this repo. Enforcement today is manual (author discipline + release-time grep). No .githooks/pre-push or CI step blocks a leak automatically.
Why deferred: Needs a script that scans staged content + branch name + commit message trailer, a .githooks entry that runs it, and a repo-level git config core.hooksPath .githooks bootstrap (documented in CONTRIBUTING.md for new clones). Also needs a CI mirror (contributors who skip local hooks) — probably a lightweight GitHub Action on push. Not urgent, but the class of bug is real (already almost leaked twice this quarter).
Attribution: Org infra gap — no single author.
D9 — useConnected() regression detector: check against user's prior configured state, not just current
What: packages/tui/src/component/use-connected.tsx returns whether any registered provider counts as connected — pure point-in-time check. The v0.9.4 grandfather fix (in-flight on release/v0.9.4) trusts non-OpenCode registrations without cost metadata to avoid force-feeding the welcome picker to legitimate BYOK / self-hosted / custom-registration users. That's the right call for upgrades from v0.9.3, but it doesn't defend against future regressions the same way — the check has no memory of what the user had connected yesterday.
Why deferred: Proper detector needs persisted "last-known-connected" state (probably stashed in the auth manifest) and a comparison at bootstrap. Small feature, but crosses TUI, auth, and manifest storage — bigger than the release-window fix.
Attribution: Original file @anandgupta42 (c985718c4df, 2026-06-23); current grandfather fix @haider (release/v0.9.4, uncommitted at time of writing).
Summary
| ID |
Item |
Attribution |
| D1 |
Interactive activation-menu picker |
Haider (e89955fe3e design decision) |
| D2 |
Retire globalThis Question bandaid |
Saravanan (8c9a9a893b7) |
| D3 |
Server-side shell-arg validation for dbt paths |
Saravanan (4f12e7d08ef, PR #1001) |
| D4 |
Slim bundled target/manifest.json |
Saravanan (4f12e7d08e, PR #1001) |
| D5 |
Windows long-path in copySampleTree |
Saravanan (4f12e7d08ef, PR #1001) |
| D6 |
Dedup question events at /event boundary |
Saravanan (8c9a9a893b7) |
| D8 |
Sitewide internal-tracker-ref scrubber + pre-push hook |
Org infra gap |
| D9 |
useConnected() regression detector vs. prior state |
Original @anandgupta42; current fix @haider |
Milestone: v0.9.4
Label: post-release-cleanup
Consolidated tracking issue for items surfaced by the v0.9.4 pre-release multi-persona review (CTO, PM, Data Engineer, Tech Lead, Support Engineer) and deliberately deferred out of the release because each requires more than a 30-min patch (new design work, performance experiment, cross-platform testing, or org-level infra).
All items were re-verified against the release/v0.9.4 tree; the review's original list of 9 was reduced to 8 after empirical checks (
packages/tuitypecheck runs green — that item was a false positive).D1 — Interactive activation-menu picker (arrow-key selectable rows in the chat)
What: The activation menu that ends every
/onboard-connectbranch is currently plain LLM-emitted text — the user types the number instead of arrow-selecting a row.Why deferred: Design decision, not a 30-min fix. The plain-text design was chosen in commit
e89955fe3ebecause (a) an earlierDialogActivationmodal never rendered for users with pre-loaded creds (auth-arrival timing meant thefalse → truetransition never fired), and (b) a fixed option-set can't personalize per scan verdict, whereas the LLM branches on warehouse/dbt discovery. Reverting to a picker needs to solve both problems — either intercept LLM-emitted numbered messages in the TUI (fragile heuristic) or introduce a structured tool-call schema and route selection back through the LLM.Attribution: Design decision — @haider (
e89955fe3e).D2 — Retire the
globalThisbandaid on the Question pending-registryWhat:
packages/opencode/src/question/index.ts:165anchors thependingByDirregistry onglobalThis["__altimateQuestionPending"]so every duplicated module copy shares one Map. Root cause is dual module-graph loading in the runtime (compiled bundle vs. dev-mode source imports), not the registry itself.Why deferred: Correct fix is fixing the module-graph duplication so there is only one
questionmodule. That means auditing every import path inpackages/opencode,packages/tui, and the plugin surface for both dev and compiled builds — bigger than a release patch.Attribution: @saravanan-altimate (
8c9a9a893b7, 2026-07-24).D3 — Server-side shell-arg validation for user-pasted dbt paths (move defense out of the template)
What:
packages/opencode/src/command/template/onboard-connect.txt:197-213instructs the LLM to refuse paths containing; & | > < $ \( ) { } newlineor single-quotes, verify executability withtest -x`, and always wrap in single quotes. That defense-in-depth is real but template-level — a model that ignores the instructions could still shell-inject.Why deferred: Requires designing a validation layer at the tool boundary (probably a new
dbt_binary_validateserver tool or a bash-wrapper allowlist) and rewriting the template to route through it. Not mechanical.Attribution: @saravanan-altimate (
4f12e7d08ef, PR #1001 landing).D4 — Slim the bundled
target/manifest.json(gzip + inflate on materialize)What:
packages/opencode/sample-projects/jaffle-shop-duckdb/target/manifest.jsonships at 684KB uncompressed. Everynpm install -g altimate-codedownloads it; everysample_setupcopies it byte-for-byte (with{{SAMPLE_ROOT}}sentinel rehydration).Why deferred: Needs (a) build-step change to gzip the shipped copy, (b) inflate step in
copySampleTree, (c) size measurement + package-size regression guard. Cheap on wall-clock, but touches packaging.Attribution: @saravanan-altimate (
4f12e7d08e, PR #1001).D5 — Windows long-path handling in
copySampleTreeWhat:
packages/opencode/src/altimate/onboarding/materialize.ts:471uses stockfs.cpSync/fs.copyFileSync/fs.mkdirSync. On Windows, paths longer than 260 chars need the\\?\prefix unless the process opts in to long-path support. A user materializing into a deeply-nested directory would hitENAMETOOLONG.Why deferred: Fix is a Windows CI matrix + long-path guard. Bun's
fsmay or may not paper over this; needs empirical test on a Windows runner before choosing a solution.Attribution: @saravanan-altimate (
4f12e7d08ef, PR #1001).D6 — Dedup question events at the
/eventboundary (or formalize the dual-emit contract)What:
packages/opencode/src/question/index.ts:100-130deliberately mirrorsquestion.asked/question.replied/question.rejectedviaBus.publishin addition toEventV2— the webview subscribes to the wildcard PubSub feed and otherwise never sees the events. TheEventV2Bridge.listenforwarder ALSO republishes toGlobalBus, so/global/eventconsumers see each event twice (different top-level ids). Verified in-repo consumers (TUIsync.tsx,notifications.ts, trace consumer) all dedupe or ignore — external subscribers to/eventthat don't dedupe would double-count.Why deferred: Two viable fixes: (a) dedupe in the
/eventhandler itself (server-side, safe for external subscribers), or (b) drop one of the two publish paths and migrate every internal consumer. Both require SDK contract review — this is public API.Attribution: @saravanan-altimate (
8c9a9a893b7, 2026-07-24).D8 — Sitewide internal-tracker-ref scrubber +
pre-pushgit hookWhat:
altimate-codeis a public repo; the org rule is that internal-tracker references (project prefix + numeric id, and the internal Atlassian host) must never land in branch names, commits, code, or docs on this repo. Enforcement today is manual (author discipline + release-time grep). No.githooks/pre-pushor CI step blocks a leak automatically.Why deferred: Needs a script that scans staged content + branch name + commit message trailer, a
.githooksentry that runs it, and a repo-levelgit config core.hooksPath .githooksbootstrap (documented inCONTRIBUTING.mdfor new clones). Also needs a CI mirror (contributors who skip local hooks) — probably a lightweight GitHub Action on push. Not urgent, but the class of bug is real (already almost leaked twice this quarter).Attribution: Org infra gap — no single author.
D9 —
useConnected()regression detector: check against user's prior configured state, not just currentWhat:
packages/tui/src/component/use-connected.tsxreturns whether any registered provider counts as connected — pure point-in-time check. The v0.9.4 grandfather fix (in-flight onrelease/v0.9.4) trusts non-OpenCode registrations without cost metadata to avoid force-feeding the welcome picker to legitimate BYOK / self-hosted / custom-registration users. That's the right call for upgrades from v0.9.3, but it doesn't defend against future regressions the same way — the check has no memory of what the user had connected yesterday.Why deferred: Proper detector needs persisted "last-known-connected" state (probably stashed in the auth manifest) and a comparison at bootstrap. Small feature, but crosses TUI, auth, and manifest storage — bigger than the release-window fix.
Attribution: Original file @anandgupta42 (
c985718c4df, 2026-06-23); current grandfather fix @haider (release/v0.9.4, uncommitted at time of writing).Summary
e89955fe3edesign decision)8c9a9a893b7)4f12e7d08ef, PR #1001)target/manifest.json4f12e7d08e, PR #1001)copySampleTree4f12e7d08ef, PR #1001)/eventboundary8c9a9a893b7)pre-pushhookuseConnected()regression detector vs. prior stateMilestone: v0.9.4
Label: post-release-cleanup