Skip to content

Post-release cleanup: deferred items from v0.9.4 multi-persona review #1052

Description

@sahrizvi

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions