Skip to content

docs(changelog): v0.9.5 entry - #1088

Merged
sahrizvi merged 5 commits into
mainfrom
release/v0.9.5-changelog
Aug 10, 2026
Merged

docs(changelog): v0.9.5 entry#1088
sahrizvi merged 5 commits into
mainfrom
release/v0.9.5-changelog

Conversation

@sahrizvi

@sahrizvi sahrizvi commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Issue for this PR

Fixes the CHANGELOG gap from PR #1086 (merged into main as 5f51d651cc).

Type of change

  • Documentation

What does this PR do?

Adds the v0.9.5 entry to CHANGELOG.md. The v0.9.5 release PR (#1086) merged without this — I mistakenly split CHANGELOG out of the release PR. CHANGELOG.md is baked into the compiled binary at build time (script/build.ts embeds it as OPENCODE_CHANGELOG) and copied into every platform-specific npm package (script/publish.ts), so shipping v0.9.5 without this entry would give users an artifact whose embedded changelog stops at v0.9.4.

Entry incorporates PM's release-notes feedback from the pre-release persona review:

  • Leads with the Windows grep fix (~16% of Windows users, 99 of 617 machines figure from telemetry)
  • Collapses the welcome-panel two-round fix into a single bullet
  • Includes the YOLO deny-rules-still-apply safety caveat + Ctrl+Y yank-conflict heads-up
  • Files the three telemetry/instrumentation commits under Changed (observability), not Added (user-visible feature), so the release isn't overstated

How did you verify your code works?

Docs-only diff; no code change. Ran bun turbo typecheck locally (13/13 workspaces green) as a sanity check that the file parses cleanly for the build's Bun.file(...).text() read.

Screenshots / recordings

Not applicable — CHANGELOG.md text.

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

🤖 Generated with Claude Code

https://claude.ai/code/session_01Q8FGy89Qpr39k8nCSpCcK2


Summary by cubic

Adds the v0.9.5 entry to CHANGELOG.md so the compiled binary (OPENCODE_CHANGELOG via script/build.ts) and npm packages (script/publish.ts) embed the correct release notes (Windows grep fix, mid-session YOLO toggle, welcome panel sizing, telemetry updates). Also adds and hardens the v0.9.5 adversarial test (escape \x00, true 100KB redaction check, strict symlink-loop assertion) and fixes the changelog telemetry docs link; runtime behavior is unchanged.

  • Refactors
    • Scoped ALTIMATE_TELEMETRY_DISABLED env snapshot hooks to the Flag.truthyEnv describe block in the adversarial test to reduce unnecessary setup; all tests still pass.

Written for commit 3c0665d. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added support for toggling YOLO mode during an active session.
    • Added responsive sizing for the welcome panel.
    • Improved sign-in session tracking and onboarding/review funnel insights.
    • Added UTM parameters to outbound marketing links.
  • Bug Fixes

    • Restored Windows grep support.
    • Corrected telemetry opt-out handling.
    • Improved reliability and safety when handling invalid, oversized, or unreadable session and telemetry data.

The v0.9.5 release PR (#1086) merged without a CHANGELOG entry because I
mistakenly split it out. `CHANGELOG.md` is baked into the compiled binary
at build time (`script/build.ts` embeds it as `OPENCODE_CHANGELOG`) and
copied into every platform-specific npm package (`script/publish.ts`), so
shipping v0.9.5 without this entry would give users an artifact whose
embedded changelog stops at v0.9.4.

Entry incorporates PM's release-notes feedback from the pre-release
persona review: leads with the Windows grep fix (~16% of Windows users
broken since v0.9.2, hard number from telemetry), collapses the
welcome-panel two-round fix into a single bullet, includes the YOLO
deny-rules-still-apply safety caveat, and files the three telemetry /
instrumentation commits under Changed (observability) rather than Added
(user-visible feature) so the release isn't overstated.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review for a one-time review, or @claude review always to subscribe this PR to a review on every future push.

Tip: disable this comment in your organization's Code Review settings.

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
- - - - - - - - - - - - - - - - - - - - - - - - -
                    AIRECEIPTS                    
             1 session behind this PR             

claude-opus-4-7..................22,462,856 tokens
  session slice: turns 7018–7071 of 7082
--------------------------------------------------
TOTAL unpriced.................≥ 22,462,856 tokens
  counted: 1 session
  cache served >99% of input tokens

1 session had unreadable transcript records skipped
(total is a lower bound — see docs/trust.md)
  full receipts + session ids: section below
- - - - - - - - - - - - - - - - - - - - - - - - -
                npx aireceipts-cli                
         github.com/anandgupta42/receipts         
- - - - - - - - - - - - - - - - - - - - - - - - -
full receipts (1 session)
session id scope turns time tokens in / out cached
orchestrator 8961a800 turns 7018–7071 of 7082 54 1h 42m 134 / 45k >99%

orchestrator · 8961a800

- - - - - - - - - - - - - - - - - - - - - - - - -
                    AIRECEIPTS                    
 “hey, we need to create a new worktree from la…” 
   Claude Code · Aug 10 2026 14:55 UTC · 1h 42m   
               claude-opus-4-7 100%               
        cache served >99% of input tokens         

pre-edit: 0% of tokens (0/54 turns)
  (share before the first named edit tool)

Bash....................11,257,145 tok  (34 calls)
(thinking/reply).........6,784,077 tok  (16 turns)
Write.....................2,712,246 tok  (8 calls)
Edit........................900,646 tok  (2 calls)
Read........................808,742 tok  (2 calls)

caveat: 10 transcript records unreadable or malformed — omitted components may make total incomplete
--------------------------------------------------
TOTAL...............................22,462,856 tok
no price table matched
- - - - - - - - - - - - - - - - - - - - - - - - -
                npx aireceipts-cli                
         github.com/anandgupta42/receipts         
- - - - - - - - - - - - - - - - - - - - - - - - -

Generated by aireceipts

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The changelog adds the 0.9.5 release entry dated 2026-08-10. The adversarial test suite validates hostile inputs, encoding, redaction, filesystem handling, and fallback behavior.

Changes

Release surface validation

Layer / File(s) Summary
Telemetry and onboarding input validation
packages/opencode/test/skill/release-v0.9.5-adversarial.test.ts
Tests cover environment parsing, provider classification, and onboarding session claims with malformed and hostile values.
Sampling and authorization payload validation
packages/opencode/test/skill/release-v0.9.5-adversarial.test.ts
Tests cover path redaction, symlink loops, CLI-context encoding, authorization URL escaping, and machine-id fallback behavior.
0.9.5 release documentation
CHANGELOG.md
Adds the release date and documents YOLO, telemetry, Windows, responsive-panel, sign-in, funnel, and marketing-link changes.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Poem

A rabbit tests each hostile byte,
And keeps encoded paths just right.
Telemetry stays within its lane,
Release notes mark the change,
Edge cases rest secure tonight.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly identifies the documentation change and the specific v0.9.5 changelog entry.
Description check ✅ Passed The description includes all required sections, explains the change and rationale, documents verification, and completes the checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/v0.9.5-changelog

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@kilo-code-bot

kilo-code-bot Bot commented Aug 10, 2026

Copy link
Copy Markdown

Code Review Summary

Status: No Issues Found | Recommendation: Merge

The previous suggestion (file-scoped beforeEach/afterEach for ALTIMATE_TELEMETRY_DISABLED) was addressed in commit 3c0665d: the env-var snapshot/restore hooks are now scoped inside the Flag.truthyEnv adversarial describe block where they're actually used. All other prior findings (CHANGELOG telemetry doc path, 100KB redaction sizing, symlink catch narrowing) were already resolved in earlier commits. No new issues in the incremental change.

Files Reviewed (2 files)
  • CHANGELOG.md
  • packages/opencode/test/skill/release-v0.9.5-adversarial.test.ts
Previous Review Summaries (2 snapshots, latest commit c37889d)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit c37889d)

Status: 1 Suggestion | Recommendation: Merge

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
packages/opencode/test/skill/release-v0.9.5-adversarial.test.ts 35 File-scoped beforeEach/afterEach only serve one of five describe blocks
Files Reviewed (2 files)
  • CHANGELOG.md — telemetry doc path corrected to docs/docs/reference/telemetry.md (commit c37889d); no issues
  • packages/opencode/test/skill/release-v0.9.5-adversarial.test.ts — new adversarial test file (309 lines); 1 non-blocking suggestion

Fix this issue in Kilo Cloud

Previous review (commit 55a8b97)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (1 file)
  • CHANGELOG.md

Reviewed by glm-5.2 · Input: 39.7K · Output: 6.9K · Cached: 486.6K

Review guidance: REVIEW.md from base branch main

Per the release skill's Step 6, every release ships with an adversarial
test file under `test/skill/release-v{X}-adversarial.test.ts` — one per
release since v0.5.14. The v0.9.5 file was written but not committed;
adding it here so the release PR carries the intended coverage.

Categories per the skill (empty/null/undefined, boundary values, type
confusion, injection attacks, error propagation), applied to the v0.9.5
code surface:

- **Flag.truthyEnv:** 32KB env values, embedded null bytes, whitespace,
  unknown keys — all must not enable and must not throw.
- **Telemetry.classifyProvider:** 10KB providerIDs, control characters,
  JSON-stringified inputs, prototype keys (`__proto__` / `prototype` /
  `hasOwnProperty` / `isPrototypeOf`), unusual modelID values — all
  must fall through to "other" without leaking a raw id or extending
  Object.
- **OnboardingTelemetry.claimEnvironmentScan:** empty / 10KB / path-shaped
  / SQL-shaped sessionIDs — idempotent and session-scoped; the composed
  gate short-circuits correctly when the session was never marked.
- **redactPaths / countSampleContents:** empty input, 100KB input in <1s,
  regex metacharacters in `extras`, user text already containing `<path>`,
  fs symlink loops on `countSampleContents`.
- **buildCliContext / buildAuthorizeUrl:** base64url shape, `v=1` payload,
  redirect / state encoding on hostile inputs (newlines, tabs, fragment
  chars), fragment-goes-last invariant, graceful degradation when the
  machine-id path is unreadable (payload valid, `machine_id` omitted).

22 tests, all pass locally. No `mock.module()`; real helpers, real fs
where needed, real `process.env` mutation with `beforeEach` /
`afterEach` snapshot-and-restore.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Line 25: Update the telemetry documentation link in the changelog entry to
reference docs/docs/reference/telemetry.md instead of
docs/reference/telemetry.md, leaving the surrounding telemetry description
unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1499ae77-2ea2-4de7-8dee-f683162cc60e

📥 Commits

Reviewing files that changed from the base of the PR and between 5f51d65 and 55a8b97.

📒 Files selected for processing (1)
  • CHANGELOG.md

Comment thread CHANGELOG.md Outdated
Previous commit landed the adversarial file with three raw null bytes
embedded in string literals meant to test null-byte handling. Git
classified the file as binary because of them, showing `Bin 0 -> 13936
bytes` and 0 insertions/deletions on the diff — reviewers on the PR
couldn't see the file contents. Runtime behavior of the tests is
unchanged; the JS string `"true\x00"` compiles to the same
"true"+NUL sequence as a literal 0x00 byte in the source, without
tripping git's binary detector.

22/22 tests still pass after the escape.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread CHANGELOG.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/opencode/test/skill/release-v0.9.5-adversarial.test.ts`:
- Around line 217-225: Update the symlink setup in the test to skip only
recognized unsupported-symlink errors, rethrow all other failures, and change
the models assertion to require exactly zero while preserving the tables
assertion.
- Around line 175-180: Update the test “redactPaths handles a 100KB message in
reasonable time (< 1s)” to construct exactly 100,000 characters, removing the
performance.now timing measurement and elapsed-time assertion. Keep the test
focused on asserting the redaction output for the generated input.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4cec0fb7-85a3-4d30-8840-827d0cc90ea9

📥 Commits

Reviewing files that changed from the base of the PR and between 55a8b97 and c79dae0.

📒 Files selected for processing (1)
  • packages/opencode/test/skill/release-v0.9.5-adversarial.test.ts

Comment thread packages/opencode/test/skill/release-v0.9.5-adversarial.test.ts Outdated
Comment thread packages/opencode/test/skill/release-v0.9.5-adversarial.test.ts
Three inline findings, all valid, all small:

- **CHANGELOG.md:25** (coderabbit + cubic, both P3) — repo-relative
  telemetry doc path was `docs/reference/telemetry.md`; the file
  actually lives at `docs/docs/reference/telemetry.md` (content root is
  `docs/` per `docs/mkdocs.yml`, published at `reference/telemetry/`
  on the docs site). Fixed the path so a maintainer following the link
  in the changelog finds the file.

- **adversarial.test.ts:180** (coderabbit) — the 100KB stress test used
  `repeat(1000)` which is ~20KB, not 100KB as advertised, and asserted
  a wall-clock `performance.now()` budget which is flaky under host
  load / parallel test runners. Built exactly 100_000 characters via
  `Math.ceil(100_000 / segment.length)` slicing, and dropped the
  timing assertion — the test now proves only what it claims (redaction
  shape survives large input).

- **adversarial.test.ts:225** (coderabbit) — the symlink-loop test had a
  bare `catch { return }` that would swallow every setup failure into a
  passing test, and `toBeGreaterThanOrEqual(0)` accepted incorrect
  positive counts. Narrowed the catch to the one known unsupported-
  symlink error class (`EPERM` on Windows without dev-mode), re-throw
  everything else, and tightened the assertion to exact `.toBe(0)` —
  a nonzero count would mean the helper is following the loop.

22/22 adversarial tests still pass after the changes.
@sahrizvi

Copy link
Copy Markdown
Contributor Author

Bot-review — all three findings fixed (c37889db)

Source Finding Fix
coderabbit + cubic @ CHANGELOG.md:25 Telemetry doc path was docs/reference/telemetry.md — real path is docs/docs/reference/telemetry.md (content root is docs/ per docs/mkdocs.yml) Path corrected
coderabbit @ adversarial.test.ts:180 repeat(1000) is ~20KB not 100KB as claimed; performance.now() assertion is flaky under host load Built exactly 100,000 chars via Math.ceil(100_000 / segment.length) slicing; dropped the wall-clock assertion
coderabbit @ adversarial.test.ts:225 Bare catch { return } swallows every setup failure into a passing test; toBeGreaterThanOrEqual(0) is trivially true Narrowed catch to EPERM (Windows without dev-mode), re-throw everything else; tightened assertion to exact .toBe(0)

22/22 adversarial tests still pass locally. No must-fix findings from any bot; @kilo-code-bot returned "No Issues Found, Recommendation: Merge".

const OPT_OUT_VAR = "ALTIMATE_TELEMETRY_DISABLED"
let optOutSnapshot: string | undefined

beforeEach(() => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: These hooks are file-scoped but only the Flag.truthyEnv describe block mutates ALTIMATE_TELEMETRY_DISABLED.

beforeEach/afterEach (lines 35-41) run for all 22 tests in the file, yet only the Flag.truthyEnv adversarial block (line 43) ever sets ALTIMATE_TELEMETRY_DISABLED — the other four describe blocks don't touch it, so the snapshot/restore is a no-op for them. Moving OPT_OUT_VAR, optOutSnapshot, and both hooks inside that describe block would scope the env management to where it's actually needed and make the intent clearer.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in 3c0665d5 — moved OPT_OUT_VAR, optOutSnapshot, and both beforeEach / afterEach hooks inside the Flag.truthyEnv adversarial describe block. Scope now matches usage; 22/22 tests still pass locally. Thanks for the nit.

…eir describe block

Kilo review on PR #1088: `beforeEach` / `afterEach` for the
`ALTIMATE_TELEMETRY_DISABLED` env-var snapshot were declared at file
scope, so they ran for all 22 tests even though only the four tests in
`Flag.truthyEnv adversarial` ever set that variable. Moved the `const`,
the `let`, and both hooks inside that describe block so scope matches
usage. Behavior unchanged (still 22/22 pass); noise removed from
unrelated tests' setup/teardown timeline.
@sahrizvi
sahrizvi merged commit 54a8f32 into main Aug 10, 2026
21 checks passed
@sahrizvi
sahrizvi deleted the release/v0.9.5-changelog branch August 10, 2026 18:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants