Skip to content

feat(web): add bilingual release history to Settings > About - #1791

Open
techotaku39 wants to merge 20 commits into
tiann:mainfrom
techotaku39:feat/web-about-release-notes
Open

techotaku39 wants to merge 20 commits into
tiann:mainfrom
techotaku39:feat/web-about-release-notes

Conversation

@techotaku39

@techotaku39 techotaku39 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add an offline-friendly bilingual release history to Settings > About,
    covering 81 official releases from v0.1.3 through v0.30.7.
  • Present grouped and importance-ordered changes with localized summaries and
    Added / Fixed labels.
  • Use a Note label for releases where the official notes list no user-facing
    functional changes.
  • Make the version number the only clickable part of each release header and
    link it directly to the corresponding GitHub Release page.
  • Add release-note authoring guidance with a reusable AI prompt and validation
    instructions.

Problem / Motivation

The About page previously showed only application metadata. Users had to leave

the app and open GitHub Releases to understand what changed in each version.

The existing release workflow generates GitHub release notes, but it does not
surface them in the Web/PWA UI or provide a consistent bilingual authoring
format for future releases.

Implementation

  • Add a statically bundled release-note catalogue in
    web/src/lib/releaseNotes.ts.
  • Add bilingual summaries, grouped release details, UTC release dates, GitHub
    Release links, and feature / fix / note change kinds.
  • Rebuild cumulative historical entries from adjacent release-tag deltas so
    each version describes changes introduced by that version.
  • Render the catalogue in the About page with native expandable release entries.
  • Hide prepared future entries from the deployed app while allowing them to be
    prepared at the top of the catalogue before the release build.
  • Lazy-load the About route so the release catalogue is not part of the initial
    application chunk.
  • Add English and Simplified Chinese translations for the release-note UI.
  • Preserve responsive presentation details:
    • Mobile uses 🌟.
    • Desktop uses .
    • Only the version link navigates to GitHub.
  • Add a release-note authoring guide at
    docs/guide/release-notes-authoring.md.
  • Add a release preflight guard that requires the target version's release-note
    entry before the embedded Web build starts. Preparation-time validation only
    requires the current app version to exist in the catalogue; the release
    preflight requires the target version to be the first entry.
  • Add the guide to the documentation sidebar.
  • Add catalog unit tests, including a version-aware future-entry visibility
    regression, plus About-page tests, a dedicated About fixture, and responsive
    E2E coverage.
  • Add the About E2E to the pull-request test workflow, alongside the current
    main-branch E2E coverage.
  • Update the Web README route description.
  • Merge the latest origin/main and retain its
    cold-initial-tail.spec.ts and scrollbar-auto-hide.spec.ts coverage
    together with the About E2E.

This PR intentionally does not automate release-note generation in the release
workflow. Issue #1790 tracks the follow-up decision about AI generation,
reviewed release-note PRs, and release gating.

Validation

  • bun typecheck — passed after merging latest main.
  • bun run .\\node_modules\\vitest\\vitest.mjs run --config .\\vitest.config.ts src/routes/settings/index.test.tsx src/lib/releaseNotes.test.ts — 17 passed after merging latest main and adding v0.30.6–v0.30.7.
  • pwsh -NoProfile -File ..\\..\\scripts\\Invoke-HapiTaskPlaywright.ps1 -Name about-release-notes -Suite Root about-release-notes.spec.ts — 1 passed; verifies localized release announcements, responsive icons, version-link behavior, same-day release dates, and version-aware visibility.
  • bun run build — passed after merging latest main; the About route is emitted as a separate chunk.
  • git diff --check — passed.

Related Issues

Refs #1790

AI Disclosure

OpenAI Codex (GPT-5.6) assisted with GitHub release and pull-request research,
bilingual release-note drafting, implementation, documentation, conflict
resolution, and test execution.

@github-actions github-actions 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.

Findings

  • [Major] Several entries describe cumulative auto-generated release ranges instead of the changes introduced by that version. The clearest examples are v0.16.3, v0.20.0, and v0.25.3; each repeats features already assigned to the immediately preceding release. Rebuild affected entries from previous-tag...current-tag, not from a release body's potentially stale comparison base. See inline comment at web/src/lib/releaseNotes.ts:665.
  • [Minor] The authoring guide says to update after tagging, but release-all.ts builds and publishes before creating the tag. Following the guide leaves the shipped artifact without its own release note. Require the target entry before the release build. See inline comment at docs/guide/release-notes-authoring.md:5.
  • [Minor] The 102,109-byte catalogue is synchronously pulled into the application entry graph because the router eagerly imports the About page. Lazy-load this route so session users do not download and parse the history until needed. See inline comment at web/src/routes/settings/about.tsx:2.

Summary
Review mode: initial

Three findings: one release-history correctness issue and two release/performance regressions. The catalogue's tag set and UTC dates match the repository's stable GitHub Releases; semantic claims across all 74 releases remain a residual manual-verification risk.

Testing
Not run (automation). Static repository inspection and GitHub release/tag comparisons only; PR code was not executed.

HAPI Bot

Comment thread web/src/lib/releaseNotes.ts Outdated
'增加 Gemini YOLO、Claude 技能发现、Codex 思考控制、终端字号和与模型无关的 Agent 接口;改进启动诊断与工作目录处理。',
[
group('Agent capabilities', 'Agent 能力', [
change('feature', 'Add Gemini YOLO, Codex reasoning effort, Claude skill-directory scanning, terminal font-size settings, and model-agnostic Agent interfaces.', '增加 Gemini YOLO、Codex 思考强度、Claude 技能目录扫描、终端字号设置和与模型无关的 Agent 接口。'),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MAJOR] Build each entry from the immediately preceding release

This v0.16.3 bullet re-announces Gemini YOLO, Codex reasoning effort, Claude skill scanning, and spawn diagnostics, all of which the adjacent v0.16.2 entry already attributes at lines 674-683. The live v0.16.2...v0.16.3 comparison contains only the later terminal-font/model-interface and working-directory fixes. The same cumulative attribution occurs in v0.20.0 and v0.25.3 because their generated release bodies compare from older tags. Users therefore get an incorrect answer to “what changed in this version.” Audit affected entries against the immediately preceding tag comparison.

Suggested fix:

releaseNote('0.16.3', '2026-03-20',
    'Add terminal font sizing and model-agnostic Agent interfaces; improve Runner and Codex working-directory handling.',
    '增加终端字号和与模型无关的 Agent 接口;改进 Runner 与 Codex 的工作目录处理。',
    [
        group('Agent capabilities', 'Agent 能力', [
            change('feature', 'Add terminal font-size settings and model-agnostic Agent interfaces.', '增加终端字号设置和与模型无关的 Agent 接口。'),
        ]),
        group('Working-directory fixes', '工作目录修复', [
            change('fix', 'Pass session cwd to Codex, preserve cwd for Runner launches, and warn before creating missing directories.', '向 Codex 传递会话目录,保留 Runner 启动目录,并在创建缺失目录前警告。'),
        ]),
    ]),

Comment thread docs/guide/release-notes-authoring.md Outdated

The in-app release history is maintained in `web/src/lib/releaseNotes.ts`. It
is bundled with the Web app so users can read it offline. Keep the catalog
newest-first and update it when a release is tagged.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MINOR] Author the target entry before the release build

The guide says to update the catalogue “when a release is tagged,” but cli/scripts/release-all.ts:136-194 bumps the version, builds/publishes the embedded Web app, and only then commits and tags. Following this timing ships version X with version X-1 as the newest announcement; the catalogue test does not run in that release path. Document the pre-build timing and add a cheap preflight guard.

Suggested fix:

const releaseNotes = readFileSync(join(repoRoot, 'web/src/lib/releaseNotes.ts'), 'utf8')
if (!releaseNotes.includes(`releaseNote('${version}'`)) {
    throw new Error(`Add release notes for ${version} before building the release`)
}

Comment thread web/src/routes/settings/about.tsx Outdated
@@ -1,9 +1,17 @@
import { PROTOCOL_VERSION } from '@hapi/protocol'
import { RELEASE_NOTES } from '@/lib/releaseNotes'

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MINOR] Keep the release catalogue out of the initial application chunk

This synchronous import adds the entire 102,109-byte catalogue (30,323 bytes when gzipped at source level) to the About module, and web/src/router.tsx:71 eagerly imports that module into the application entry graph. Every Web/PWA user pays the download and parse cost even when they only open sessions. Lazy-loading the About route still allows Workbox to precache the generated chunk for offline use.

Suggested fix:

import { lazy, Suspense } from 'react'

const LazySettingsAboutPage = lazy(() => import('@/routes/settings/about'))
const SettingsAboutRoute = () => (
    <Suspense fallback={<LoadingState className="m-4" />}>
        <LazySettingsAboutPage />
    </Suspense>
)

// route definition
component: SettingsAboutRoute,

@github-actions github-actions 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.

Findings

  • [Major] The documented pre-release sequence cannot pass its own catalog test — web/src/lib/releaseNotes.test.ts:8 requires the first entry to equal the current __APP_VERSION__, but docs/guide/release-notes-authoring.md:10 tells authors to merge the next version's entry before cli/scripts/release-all.ts:153 updates that version. A correctly prepended next release therefore fails the focused test and CI before it can be merged. The substring check at cli/scripts/release-all.ts:126 also does not ensure that the target is the newest real catalog entry.
    Suggested fix:
    // web/src/lib/releaseNotes.test.ts
    expect(RELEASE_NOTES.some((release) => release.version === __APP_VERSION__)).toBe(true)
    
    // cli/scripts/release-all.ts
    const latestReleaseVersion = releaseNotes.match(
        /export const RELEASE_NOTES = \[\s*releaseNote\('([^']+)'/,
    )?.[1]
    if (latestReleaseVersion !== version) {
        throw new Error(`Put release notes for ${version} first before building`)
    }

Questions

  • None.

Summary
Review mode: follow-up after new commits

One Major release-workflow conflict remains. Residual risk: semantic accuracy across the 74 hand-authored historical entries is not fully machine-verifiable.

Testing
Not run (automation). Static inspection of the full latest diff, surrounding source, prior review, and tag-range commit history only; PR code was not executed.

HAPI Bot

Comment thread web/src/lib/releaseNotes.test.ts Outdated
it('keeps every entry localized, linked, and newest-first', () => {
expect(RELEASE_NOTES.length).toBeGreaterThan(0)
expect(RELEASE_NOTES.length).toBeGreaterThanOrEqual(74)
expect(RELEASE_NOTES[0].version).toBe(__APP_VERSION__)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MAJOR] Allow the next release note to be authored before the version bump

The new guide requires merging the target release entry before release-all.ts runs, but this assertion requires the first entry to remain the old __APP_VERSION__. Prepending the next release makes the documented focused test and CI fail, so the next release cannot follow the new sequence. Relax this test to require that the currently built version remains present, then make the release script validate that its target is structurally the first catalog entry rather than merely a matching substring.

Suggested fix:

expect(RELEASE_NOTES.some((release) => release.version === __APP_VERSION__)).toBe(true)

And in cli/scripts/release-all.ts:

const latestReleaseVersion = releaseNotes.match(
    /export const RELEASE_NOTES = \[\s*releaseNote\('([^']+)'/,
)?.[1]
if (latestReleaseVersion !== version) {
    throw new Error(`Put release notes for ${version} first before building`)
}

@github-actions github-actions 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.

Findings

  • [Minor] The new About-page Playwright coverage is not run by CI - e2e/about-release-notes.spec.ts:5 adds viewport-sensitive and native <details> interaction coverage, but .github/workflows/test.yml:16 still invokes only terminal-wrap-fidelity.spec.ts and composer-copy.spec.ts. These assertions can regress without affecting the required test check.
    Suggested fix:
    - run: bun run test:e2e -- terminal-wrap-fidelity.spec.ts composer-copy.spec.ts about-release-notes.spec.ts

Questions

  • None.

Summary
Review mode: follow-up after new commits

One Minor testing gap remains. The prior release-sequencing Major is resolved. Residual risk: the semantic accuracy of 74 hand-authored bilingual summaries is not fully machine-verifiable.

Testing
Not run (automation). Static inspection only; executing PR code is disallowed for this review. GitHub integration check passed, while the main test check was still pending at review time.

HAPI Bot


const fixture = '/e2e-fixtures/about-fixture.html'

test('renders localized release announcements on the mobile About page', async ({ page }) => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MINOR] Add this browser spec to the CI selection

The required test workflow currently runs only terminal-wrap-fidelity.spec.ts and composer-copy.spec.ts, so this new spec is skipped. That leaves the real viewport switching and native <details> click behavior covered only by a manual command.

Suggested fix:

- run: bun run test:e2e -- terminal-wrap-fidelity.spec.ts composer-copy.spec.ts about-release-notes.spec.ts

@github-actions github-actions 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.

Findings

  • None.

Questions

  • None.

Summary
Review mode: follow-up after new commits

The new commit adds about-release-notes.spec.ts to the required E2E selection at .github/workflows/test.yml:16, resolving the prior HAPI Bot finding. I re-reviewed the full latest diff; no Blocker, Major, Minor, or Nit findings met the 80% confidence threshold. The catalog contains all 74 stable release tags, and its version/date pairs match the repository release metadata. The required test and integration checks pass. PR code was not executed locally under the review security policy.

HAPI Bot

@github-actions github-actions 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.

Findings

  • [Major] Hide pre-release entries from the deployed app — the new authoring flow requires merging the target entry before running the release (docs/guide/release-notes-authoring.md:11), and any web/** push to main immediately deploys app.hapi.run (.github/workflows/webapp.yml:3). However, the About page renders the entire newest-first catalog at web/src/routes/settings/about.tsx:28, while the catalog test only requires __APP_VERSION__ to appear somewhere. Preparing the next release will therefore publish its version, date, details, and a not-yet-existing GitHub Release URL before the tag is created. Slice the catalog from the embedded app version and add a regression test with a future entry.

    Suggested fix:

    const currentReleaseIndex = RELEASE_NOTES.findIndex(
        (release) => release.version === __APP_VERSION__,
    )
    const visibleReleaseNotes = currentReleaseIndex >= 0
        ? RELEASE_NOTES.slice(currentReleaseIndex)
        : RELEASE_NOTES
    
    // Render visibleReleaseNotes.map(...) below.

Questions

  • None.

Summary
Review mode: follow-up after new commits

One Major release-flow issue found. The latest catalog metadata matches the 75 published stable releases, including v0.29.1. Static review only; PR code was not executed under the review security policy. Existing tests do not cover hiding a prepared future release from the current deployed app.

HAPI Bot

Comment thread web/src/routes/settings/about.tsx Outdated
title={t('settings.about.releaseNotes.title')}
description={t('settings.about.releaseNotes.description')}
>
{RELEASE_NOTES.map((release, index) => (

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MAJOR] Hide entries newer than the embedded app version.

The new guide requires merging the next release entry before tagging, and .github/workflows/webapp.yml deploys every web/** push to main. Mapping the full newest-first catalog here makes app.hapi.run immediately show the unreleased version/date/details and a release URL that does not exist yet. The current catalog test only checks that __APP_VERSION__ exists somewhere, so it does not prevent this.

Suggested fix:

const currentReleaseIndex = RELEASE_NOTES.findIndex(
    (release) => release.version === __APP_VERSION__,
)
const visibleReleaseNotes = currentReleaseIndex >= 0
    ? RELEASE_NOTES.slice(currentReleaseIndex)
    : RELEASE_NOTES

// Render visibleReleaseNotes.map(...) here.

Please also add a regression test with a future entry ahead of __APP_VERSION__ and assert that it is not rendered.

@github-actions github-actions 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.

Findings

  • [Major] Make the future-entry regression test independent of the current catalogue — once the next real release entry is prepended, the correct visible suffix is shorter than RELEASE_NOTES, so the hard-coded 0.29.1 and full-length assertion fail during the exact preparation flow documented in docs/guide/release-notes-authoring.md:24. Evidence: web/src/lib/releaseNotes.test.ts:52.

    Suggested fix:

    const currentIndex = RELEASE_NOTES.findIndex(
        (release) => release.version === __APP_VERSION__,
    )
    const expected = RELEASE_NOTES.slice(currentIndex)
    const futureRelease = {
        ...RELEASE_NOTES[0],
        version: '999.0.0',
        date: '9999-12-31',
        url: 'https://github.com/tiann/hapi/releases/tag/v999.0.0',
    }
    
    expect(getVisibleReleaseNotes(
        __APP_VERSION__,
        [futureRelease, ...RELEASE_NOTES],
    )).toEqual(expected)
  • [Major] Remove current-release constants from the About E2E — the release script updates APP_VERSION before building and pushes that commit, while this test is now in the push workflow. On the next release, the visible count and first summary change, so 75 and the v0.29.1 copy make every release commit's CI fail. Evidence: e2e/about-release-notes.spec.ts:10, related flow cli/scripts/release-all.ts:156, .github/workflows/test.yml:16.

    Suggested fix:

    import { APP_VERSION } from '../shared/src/buildInfo'
    import {
        getVisibleReleaseNotes,
        RELEASE_NOTES,
    } from '../web/src/lib/releaseNotes'
    
    const visibleReleaseNotes = getVisibleReleaseNotes(APP_VERSION, RELEASE_NOTES)
    const latestRelease = visibleReleaseNotes[0]
    
    await expect(page.locator('details')).toHaveCount(visibleReleaseNotes.length)
    await expect(page.locator('details').first().locator('p').first())
        .toContainText(latestRelease.summary.en)

Questions

  • None.

Summary
Review mode: follow-up after new commits

The prior future-release visibility issue is fixed in application code. Two Major test regressions remain: preparing the next catalogue entry breaks the new unit regression, and completing the next version bump makes the newly enabled E2E fail on the release commit. The 75 catalogue tags/dates match the 75 published non-prerelease GitHub releases.

Testing

  • Not run (automation); static review only under the PR security policy.

HAPI Bot

Comment thread web/src/lib/releaseNotes.test.ts Outdated
const visible = getVisibleReleaseNotes('0.29.1', preparedCatalog)

expect(visible[0].version).toBe('0.29.1')
expect(visible).toHaveLength(RELEASE_NOTES.length)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MAJOR] Make this expectation relative to the embedded app version.

As soon as a real future release is added before 0.29.1, correct filtering excludes that entry, so visible is shorter than RELEASE_NOTES and this regression test fails during the documented preparation flow.

Suggested fix:

const currentIndex = RELEASE_NOTES.findIndex(
    (release) => release.version === __APP_VERSION__,
)
const expected = RELEASE_NOTES.slice(currentIndex)
const futureRelease = {
    ...RELEASE_NOTES[0],
    version: '999.0.0',
    date: '9999-12-31',
    url: 'https://github.com/tiann/hapi/releases/tag/v999.0.0',
}

expect(getVisibleReleaseNotes(
    __APP_VERSION__,
    [futureRelease, ...RELEASE_NOTES],
)).toEqual(expected)

Comment thread e2e/about-release-notes.spec.ts Outdated
await page.goto(fixture)

await expect(page.getByText("What's New")).toBeVisible()
await expect(page.locator('details')).toHaveCount(75)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MAJOR] Do not pin the E2E to today's catalogue size and first release.

release-all.ts bumps APP_VERSION before building and pushes the release commit, and this spec is now part of the push workflow. The next bump exposes one more entry and changes the first summary, so the hard-coded count/copy makes release CI fail every time.

Suggested fix:

import { APP_VERSION } from '../shared/src/buildInfo'
import {
    getVisibleReleaseNotes,
    RELEASE_NOTES,
} from '../web/src/lib/releaseNotes'

const visibleReleaseNotes = getVisibleReleaseNotes(APP_VERSION, RELEASE_NOTES)
const latestRelease = visibleReleaseNotes[0]

await expect(page.locator('details')).toHaveCount(visibleReleaseNotes.length)
await expect(page.locator('details').first().locator('p').first())
    .toContainText(latestRelease.summary.en)

@github-actions github-actions 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.

Findings

  • [Major] Make the About unit tests version-relative - the new tests pin v0.29.1, its date, copy, and change counts. release-all.ts updates APP_VERSION before the release commit, Vitest reads that value through vite.config.ts, and the push workflow then runs these tests. On the next release commit, the page correctly renders the newly added release first, so these assertions fail and leave every release CI red. Evidence: web/src/routes/settings/index.test.tsx:339 (same issue in the Chinese case at web/src/routes/settings/index.test.tsx:359; release sequence cli/scripts/release-all.ts:156).

    Suggested fix:

    import { getVisibleReleaseNotes, RELEASE_NOTES } from '@/lib/releaseNotes'
    
    const latestRelease = getVisibleReleaseNotes(__APP_VERSION__, RELEASE_NOTES)[0]
    const changes = latestRelease.groups.flatMap((group) => group.changes)
    
    expect(screen.getByText(`v${latestRelease.version}`)).toBeInTheDocument()
    expect(screen.getByText(latestRelease.groups[0].changes[0].text.en)).toBeInTheDocument()
    expect(within(latestReleaseElement).getAllByText('Added', { exact: true }))
        .toHaveLength(changes.filter((change) => change.kind === 'feature').length)

Questions

  • None.

Summary
Review mode: follow-up after new commits

The two prior Major findings were fixed in the new commits. One equivalent release-cycle regression remains in the About unit tests: their current-release constants will fail immediately after the next version bump.

Testing

  • Not run (automation); static review only under the PR security policy. Current-head checks pass, but they use APP_VERSION = 0.29.1 and do not cover the next release bump.

HAPI Bot

Comment thread web/src/routes/settings/index.test.tsx Outdated
expect(screen.getByText('Protocol Version')).toBeInTheDocument()
expect(screen.getByRole('link', { name: 'hapi.run' })).toHaveAttribute('rel', 'noopener noreferrer')
expect(screen.getByText("What's New")).toBeInTheDocument()
expect(screen.getByText('v0.29.1')).toBeInTheDocument()

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MAJOR] Make these About assertions version-relative.

release-all.ts changes APP_VERSION before creating the release commit, and Vitest receives that value from vite.config.ts. Once the next release entry becomes visible, the page correctly renders that version first, but this test still requires v0.29.1, its exact copy/date, and fixed Added/Fixed counts. The push workflow will therefore fail on every release commit. The Chinese case below has the same pin.

Suggested fix:

import { getVisibleReleaseNotes, RELEASE_NOTES } from '@/lib/releaseNotes'

const latestRelease = getVisibleReleaseNotes(__APP_VERSION__, RELEASE_NOTES)[0]
const changes = latestRelease.groups.flatMap((group) => group.changes)

expect(screen.getByText(`v${latestRelease.version}`)).toBeInTheDocument()
expect(screen.getByText(latestRelease.groups[0].changes[0].text.en)).toBeInTheDocument()
expect(within(latestReleaseElement).getAllByText('Added', { exact: true }))
    .toHaveLength(changes.filter((change) => change.kind === 'feature').length)

@github-actions github-actions 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.

Findings

  • [Major] Make badge assertions change-kind-relative too — the new version-relative unit assertions still call getAllByText for both Added and Fixed, which throws before toHaveLength(0) when a release has none of that kind. The E2E likewise always requires Added/新增. Feature-only, fix-only, and note-only releases are valid and already represented in the catalogue, so bumping any such release to APP_VERSION makes the release push CI fail. Evidence: web/src/routes/settings/index.test.tsx:349 (Chinese case at web/src/routes/settings/index.test.tsx:370; E2E at e2e/about-release-notes.spec.ts:22).

    Suggested fix:

    const labels = {
        feature: { en: "Added", "zh-CN": "新增" },
        fix: { en: "Fixed", "zh-CN": "修复" },
        note: { en: "Note", "zh-CN": "说明" },
    } as const
    
    for (const kind of ["feature", "fix", "note"] as const) {
        expect(within(latestReleaseElement).queryAllByText(labels[kind].en, { exact: true }))
            .toHaveLength(latestReleaseChanges.filter((change) => change.kind === kind).length)
    }
    const firstLabel = labels[latestReleaseChanges[0].kind]
    expect(within(latestReleaseElement).getByText(firstLabel.en, { exact: true }))
        .toHaveClass("relative", "top-px", "sm:top-[0.5px]")

    Use firstLabel["zh-CN"] in the localized unit/E2E assertions instead of hard-coding 新增.

Questions

  • None.

Summary
Review mode: follow-up after new commits

One Major release-cycle regression remains: valid releases without an Added item, or without a Fixed item, still leave the push test workflow red.

Testing

  • Static review only; PR code was not executed. Integration and Windows Codex MCP checks pass; the main test job is still pending.

HAPI Bot

@github-actions github-actions 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.

Findings

  • [Major] Keep the desktop badge assertion release-relative too -- e2e/about-release-notes.spec.ts:28 still requires an Added badge even though the same test now derives the current release and supports feature, fix, and note. Fix-only and note-only releases are valid and already exist in the catalogue; when either becomes APP_VERSION, this required E2E fails in .github/workflows/test.yml:16 before the release commit can go green.

    Suggested fix:

    const firstKindLabel = releaseKindLabels[latestReleaseChanges[0].kind].en
    await expect(
        page.locator('details').first().getByText(firstKindLabel, { exact: true }).first(),
    ).toHaveClass(/sm:top-\[0\.5px\]/)

Questions

  • None.

Summary
Review mode: follow-up after new commits

One Major release-cycle regression remains: the unit and localized E2E assertions are now change-kind-relative, but the desktop E2E badge assertion still assumes every release contains an Added item. Catalogue version/date pairs match all 75 published non-prerelease GitHub releases.

Testing

  • Not run (automation); executing PR code is disallowed by the review security policy. GitHub integration and Windows Codex MCP checks pass; the main test job is still pending.

HAPI Bot

Comment thread e2e/about-release-notes.spec.ts Outdated
await page.setViewportSize({ width: 1280, height: 844 })
await expect(releaseSummary.getByText('🌟', { exact: true })).toBeHidden()
await expect(releaseSummary.getByText('⭐', { exact: true })).toBeVisible()
await expect(page.locator('details').first().getByText('Added', { exact: true }).first()).toHaveClass(/sm:top-\[0\.5px\]/)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[MAJOR] Keep this assertion change-kind-relative. This remaining hard-coded Added lookup makes the required E2E fail whenever the current release is fix-only or note-only, both valid catalogue shapes. Derive the label from the first current-release change, as the assertions below already do.

Suggested fix:

const firstKindLabel = releaseKindLabels[latestReleaseChanges[0].kind].en
await expect(
    page.locator('details').first().getByText(firstKindLabel, { exact: true }).first(),
).toHaveClass(/sm:top-\[0\.5px\]/)

@github-actions github-actions 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.

Findings

  • No findings.

Questions

  • None.

Summary
Review mode: follow-up after new commits

No issues found on the fresh head. The prior hard-coded change-kind regression is resolved at e2e/about-release-notes.spec.ts:28; the latest full PR diff was reviewed. Residual risk: the 75-entry bilingual catalogue is primarily editorial data, so automated coverage validates structure, ordering, localization presence, current-version visibility, and rendering—not the semantic fidelity of every historical sentence.

Testing

  • Not run (automation); executing PR code is disallowed by the review security policy.
  • At review time: integration and windows-codex-mcp passed; the main test job remains in progress.

HAPI Bot

@heavygee heavygee added enhancement New feature or request area:web Web PWA / React client area:docs Documentation site and guides community-pr PR from non-collaborator contributor labels Sep 9, 2026

@github-actions github-actions 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.

Review mode: follow-up after new commits

Requirement — Pass

Bilingual release history lets users understand version changes inside About, including offline. This adds a supported capability missing from the existing page.

Evidence

  • Snapshot PR description and issue #1790 establish the in-app, bilingual, offline use case.
  • Base web/src/routes/settings/about.tsx:5 renders only website, application version, and protocol version.

Approach — Pass

A bundled catalogue, lazy-loaded About page, version-based visibility, and pre-build release guard fit the existing architecture.

Evidence

  • web/src/lib/releaseNotes.ts:23 hides entries preceding the current application version.
  • web/src/router.tsx:79 lazy-loads About; web/vite.config.ts:178 includes JavaScript chunks in offline precaching.
  • cli/scripts/release-all.ts:123 checks the target entry before version updates and the embedded Web build.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. Found one historical attribution defect. Historical claims were selectively checked against releases and tagged source; not every bilingual sentence was independently verified.

  • [Minor] Remove later features from the v0.19.0 entry — web/src/lib/releaseNotes.ts:594

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, per the review boundary.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress.
  • The merge-base diff passes git diff --check.
  • Added tests cover catalogue structure, localization, future-entry visibility, and responsive rendering; they do not verify historical feature attribution or the release preflight.

HAPI Bot

Comment thread web/src/lib/releaseNotes.ts Outdated
]),
group('Conversation and media', '对话与媒体', [
change('feature', 'Show message timestamps, status indicators, image lightboxes, dynamic voice controls, and inline image display.', '显示消息时间戳、状态指示器、图片灯箱、动态语音控制和内联图片。'),
change('feature', 'Add conversation export, session workbench tools, and file/work-directory browsing improvements.', '增加对话导出、会话工作台工具及文件/工作目录浏览改进。'),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[Minor] Remove later features from the v0.19.0 entry

The v0.19.0 entry advertises conversation export and session workbench tools, but both arrived between v0.19.0 and v0.20.0: f086949 adds conversation export, and 18bcb52 adds the Scratchlist workbench. The v0.19.0 source contains neither capability. Users reading this entry therefore receive incorrect information about feature availability, and the same additions are already listed under v0.20.0.

Suggested fix

Remove the export and workbench claims from both translations of v0.19.0 and retain them under v0.20.0. Check nearby historical entries against adjacent tag deltas for similar attribution errors.

@github-actions github-actions 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.

Review mode: follow-up after new commits

Requirement — Pass

Bilingual release history lets users understand version changes inside About, including offline. The existing page lacks this capability.

Evidence

  • The snapshot description and issue #1790 establish the in-app, bilingual, offline use case.
  • Base web/src/routes/settings/about.tsx:5 renders only website, application version, and protocol version.

Approach — Pass

A bundled catalogue, lazy-loaded About route, version-based visibility, and pre-build release guard fit the existing architecture.

Evidence

  • web/src/lib/releaseNotes.ts:23 hides prepared entries preceding the current application version.
  • web/src/router.tsx:79 lazy-loads About; web/vite.config.ts:179 includes JavaScript chunks in offline precaching.
  • cli/scripts/release-all.ts:123 checks the target entry before version updates and the embedded Web build.

Code — Reviewed

Reviewed the full fixed-head merge-base diff. The previous finding is fixed; one historical attribution issue remains. Historical claims were selectively verified against releases and tagged source.

  • [Minor] Remove existing image features from v0.20.0 additions — web/src/lib/releaseNotes.ts:573

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress.
  • The merge-base diff passes git diff --check.
  • Added tests cover catalogue structure, localization, future-entry visibility, and responsive rendering; they do not verify historical attribution or the release preflight.

HAPI Bot

Comment thread web/src/lib/releaseNotes.ts Outdated
change('feature', 'Add a backend voice picker with advanced controls and support pluggable Gemini Live and Qwen Realtime backends.', '增加带高级控制的语音后端选择器,并支持可插拔的 Gemini Live 与 Qwen Realtime 后端。'),
]),
group('Agent and message controls', 'Agent 与消息控制', [
change('feature', 'Add inline display_image, chat-image lightboxes, and a close button for mobile dialogs.', '增加内联 display_image、聊天图片灯箱和移动端对话框关闭按钮。'),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[Minor] Remove existing image features from v0.20.0 additions

The v0.20.0 entry presents display_image and chat-image lightboxes as new, but commits de5dc97 and cf378df introduced them before v0.19.0. Tagged v0.19.0 source already registers display_image and renders image attachments through ImagePreview; these implementations are unchanged in v0.20.0. This gives readers an incorrect account of what upgrading adds. The official v0.20.0 changelog spans v0.18.4..v0.20.0, which explains the duplicated attribution.

Suggested fix

Keep the mobile-dialog close-button addition in this bullet, remove the two image-feature additions from both translations, and retain those features under v0.19.0.

@github-actions github-actions 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.

Review mode: follow-up after new commits

Requirement — Pass

Bilingual release history lets users understand version changes inside About, including offline. The existing page does not provide this capability.

Evidence

  • The snapshot description and issue #1790 establish the in-app, bilingual, offline use case.
  • Base web/src/routes/settings/about.tsx:5 renders only website, application version, and protocol version.

Approach — Pass

A bundled catalogue, lazy-loaded About route, version-based visibility, and pre-build release guard fit the existing architecture and release sequence.

Evidence

  • web/src/lib/releaseNotes.ts:23 filters prepared entries preceding the current application version.
  • web/src/router.tsx:79 lazy-loads About; web/vite.config.ts:179 includes JavaScript chunks in offline precaching.
  • cli/scripts/release-all.ts:123 checks the target entry before version updates and the embedded Web build.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. The previous image-feature attribution finding is fixed, but other carried-forward additions remain. Historical claims were selectively verified against releases and tagged source.

  • [Minor] Remove remaining carried-forward feature additions — web/src/lib/releaseNotes.ts:949

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress when checked.
  • The merge-base diff passes git diff --check.
  • Added tests cover catalogue structure, localization, future-entry visibility, and responsive rendering; they do not verify historical attribution or the release preflight.

HAPI Bot

Comment thread web/src/lib/releaseNotes.ts Outdated
'增加端到端加密 relay 服务,并修复 macOS relay 启动和 TLS 证书路径。',
[
group('Encrypted relay', '加密 Relay', [
change('feature', 'Provide an end-to-end encrypted relay that works without tunnel configuration.', '提供无需配置隧道即可使用的端到端加密 relay。'),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[Minor] Remove remaining carried-forward feature additions

The v0.8.2 entry labels encrypted relay support as Added, although commit 5defb6d introduced it before v0.8.0; the later relay changes fix runtime assets and paths. The official v0.8.2 body repeats the older highlight. Similarly, v0.25.0 lists conversation export as an addition at line 391, although f086949 introduced it in v0.20.0 and the export dialog and implementation are unchanged between v0.24.0 and v0.25.0. These entries misstate what upgrading to those versions adds.

Suggested fix

Remove the relay introduction from both v0.8.2 translations and its summary, retaining the actual fixes. Remove the generic conversation-export addition from v0.25.0. Keep those introductions under v0.8.0 and v0.20.0, and use adjacent tagged source changes to distinguish repeated highlights from new functionality.

@github-actions github-actions 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.

Review mode: follow-up after new commits

Requirement — Pass

Bilingual release history lets users understand version changes inside About, including offline. The existing page does not provide this capability.

Evidence

  • The snapshot description and issue #1790 establish the bilingual, offline use case.
  • Base web/src/routes/settings/about.tsx:5 renders only website and version information.

Approach — Pass

A bundled catalogue, lazy-loaded About route, version-based visibility, and pre-build release guard fit the existing architecture.

Evidence

  • web/src/lib/releaseNotes.ts:23 filters entries preceding the current application version.
  • web/src/router.tsx:79 lazy-loads About; web/vite.config.ts:179 includes JavaScript chunks in offline precaching.
  • cli/scripts/release-all.ts:123 checks the target entry before version updates and the embedded Web build.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. The previous relay/export attribution finding is fixed, but two other historical additions remain misattributed. Historical behavior was selectively verified against tagged source.

  • [Minor] Correct remaining historical feature attribution — web/src/lib/releaseNotes.ts:476

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress when checked.
  • The merge-base diff passes git diff --check.
  • Catalogue versions and UTC dates match the published stable releases.
  • Added tests cover catalogue structure, localization, future-entry visibility, and responsive rendering; historical attribution and the release preflight lack regression coverage.

HAPI Bot

Comment thread web/src/lib/releaseNotes.ts Outdated
'增加 Kimi Code、更多 Pi 与 Web 控制、模型感知工具、主题和目录元数据;改进 transcript、恢复和消息渲染稳定性。',
[
group('Agent support and controls', 'Agent 支持与控制', [
change('feature', 'Add Kimi Code support, Pi max thinking, skill_lookup for non-native agents, and tool-call duration details.', '增加 Kimi Code 支持、Pi max 思考级别、面向非原生 Agent 的 skill_lookup,以及工具调用耗时详情。'),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[Minor] Correct remaining historical feature attribution

The v0.23.0 entry says Kimi Code support was added, although 763f45a introduced it in v0.19.0. The later change, 22e9b38, adds local transcript synchronization and adapts configuration/model handling to the rewritten Kimi architecture. Likewise, line 388 lists Android Web Share Target integration under v0.25.0, although 2643f17 introduced it in v0.21.0 and its implementation is unchanged between v0.24.0 and v0.25.0. These statements mislead users about what upgrading adds.

Suggested fix

Describe the specific Kimi synchronization and compatibility changes in both v0.23.0 translations and summaries. Remove Android Web Share Target from v0.25.0 while retaining the companion push/pairing additions; keep its introduction under v0.21.0.

@github-actions github-actions 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.

Review mode: follow-up after new commits

Requirement — Pass

Bilingual release history lets users understand version changes inside About, including offline. Existing behavior does not provide this capability.

Evidence

  • The snapshot description and issue #1790 establish the bilingual, offline use case.
  • Base web/src/routes/settings/about.tsx:5 displays only website and version information.

Approach — Pass

A bundled catalogue, lazy-loaded route, version-based visibility, and pre-build release guard fit the existing architecture.

Evidence

  • web/src/lib/releaseNotes.ts:23 filters prepared entries preceding the current version.
  • web/src/router.tsx:79 lazy-loads About; web/vite.config.ts:179 includes JavaScript chunks in offline precaching.
  • cli/scripts/release-all.ts:123 checks the target entry before version updates and the embedded Web build.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. Both previously flagged attributions are corrected. One additional historical claim needs correction; no runtime defect was identified.

  • [Minor] Attribute outline search to its actual release — web/src/lib/releaseNotes.ts:662

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress.
  • The merge-base diff passes git diff --check.
  • All 79 catalogue versions and UTC dates match published stable releases; historical behavior was selectively checked against tagged source.
  • Added tests cover catalogue structure, localization, future-entry visibility, and responsive rendering. Release-preflight and offline lazy-route behavior lack direct regression coverage.

HAPI Bot

Comment thread web/src/lib/releaseNotes.ts Outdated
'增加 Web 对话大纲和子 Agent 轨迹,并在恢复非活动会话时保留选定的权限模式。',
[
group('Conversation navigation', '对话导航', [
change('feature', 'Show a searchable conversation outline and subagent traces in tool details.', '显示可搜索的对话大纲,并在工具详情中展示子 Agent 轨迹。'),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[Minor] Attribute outline search to its actual release

The v0.17.3 entry advertises a searchable conversation outline. That tag's ConversationOutlinePanel only lists and navigates items; commit 33015b6 introduced the search input and filtering in v0.23.4. Both translations therefore promise functionality unavailable in v0.17.3.

Suggested fix

Remove “searchable” and “可搜索的” from the v0.17.3 bullet. Keep search attributed to v0.23.4, where it is already listed.

@github-actions github-actions 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.

Review mode: follow-up after new commits

Requirement — Pass

Bilingual release history lets users understand version changes inside About, including offline. Existing functionality does not meet this use case.

Evidence

  • The snapshot description and issue #1790 establish the bilingual, offline use case.
  • Base web/src/routes/settings/about.tsx:5 displays only website and version information.

Approach — Pass

A bundled catalogue, lazy-loaded About route, version-based visibility, and pre-build release guard fit the existing architecture and release sequence.

Evidence

  • web/src/lib/releaseNotes.ts:23 hides prepared entries preceding the current version.
  • web/src/router.tsx:79 lazy-loads About; web/vite.config.ts:179 includes JavaScript chunks in offline precaching.
  • cli/scripts/release-all.ts:123 checks the target entry before version updates and the embedded Web build.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. No actionable defects identified. The previous outline-search attribution is corrected in both languages at web/src/lib/releaseNotes.ts:662. Historical claims were selectively verified against published releases and tagged source; runtime behavior was not executed.

No reportable code issues found.

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration and windows-codex-mcp passed; test remained in progress when checked.
  • The merge-base diff passes git diff --check.
  • All 79 catalogue versions and UTC dates match published stable releases.
  • Added tests cover catalogue structure, localization, future-entry visibility, and responsive rendering. The release preflight and offline navigation through the lazy-loaded route lack direct regression coverage.

HAPI Bot

@github-actions github-actions 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.

Review mode: follow-up after new commits

Requirement — Pass

Bilingual release history lets users understand version changes inside About, including offline. The existing page does not provide this capability.

Evidence

  • The snapshot description and issue #1790 establish the bilingual, offline use case.
  • Base web/src/routes/settings/about.tsx:5 displays only website and version information.

Approach — Pass

A bundled catalogue, lazy-loaded About route, version-based visibility, and pre-build release guard fit the existing architecture. The release-script defect below is fixable within this approach.

Evidence

  • web/src/lib/releaseNotes.ts:23 hides entries preceding the current app version.
  • web/src/router.tsx:79 lazy-loads About; web/vite.config.ts:198 includes JavaScript chunks in offline precaching.
  • cli/scripts/release-all.ts:106 places catalogue validation before version updates and the embedded Web build.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. Found one release-blocking runtime defect. Historical claims were selectively checked; PR code was not executed.

  • [Major] Import readFileSync before using it in release preflight — cli/scripts/release-all.ts:108

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed, as required.
  • Fixed-head CI: integration passed; test and windows-codex-mcp were still running when checked.
  • The merge-base diff passes git diff --check.
  • All 81 catalogue versions and UTC dates match published stable releases.
  • Added tests cover catalogue structure, localization, future-entry visibility, and responsive rendering. Release-preflight execution and offline navigation through the lazy-loaded route lack direct regression coverage.

HAPI Bot


// Release notes must be present before the embedded Web build runs.
const releaseNotesPath = join(repoRoot, 'web', 'src', 'lib', 'releaseNotes.ts');
const releaseNotes = readFileSync(releaseNotesPath, 'utf-8');

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[Major] Import readFileSync before using it in release preflight

Running release-all.ts on main reaches this call, but readFileSync is neither imported nor defined. The script therefore throws a ReferenceError before updating versions or building, even when the target catalogue entry exists. Dry-run and publish-only invocations also fail. The CLI typecheck includes only src files, so it does not catch this scripts-directory error.

Suggested fix

Add import { readFileSync } from 'node:fs'; and add regression coverage that exercises the release preflight without building or publishing.

@github-actions github-actions 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.

Review mode: follow-up after new commits

Requirement — Pass

Bilingual release history lets users understand version changes inside About, including offline. Existing functionality does not meet this use case.

Evidence

  • The snapshot description and issue #1790 establish the bilingual, offline use case.
  • Base web/src/routes/settings/about.tsx:5 displays only website and version information.

Approach — Pass

A bundled catalogue, expandable entries, lazy-loaded route, and pre-build release guard fit the existing architecture and release sequence.

Evidence

  • web/src/lib/releaseNotes.ts:23 hides prepared entries preceding the current app version.
  • web/src/router.tsx:79 lazy-loads About; web/vite.config.ts:198 includes JavaScript chunks in offline precaching.
  • cli/scripts/release-all.ts:107 checks the target catalogue entry before version updates and the embedded Web build.

Code — Reviewed

Reviewed the entire fixed-head merge-base diff. No actionable defects found. The previously reported missing readFileSync import is fixed. Historical release claims were selectively verified.

No reportable code issues found.

Testing

Not run (automation; PR code execution is prohibited).

  • No PR code, tests, builds, or scripts were executed.
  • Fixed-head CI: integration and windows-codex-mcp passed; test was still running when checked.
  • The merge-base diff passes git diff --check.
  • All 81 catalogue versions and UTC dates match published stable releases; versions are ordered newest-first.
  • Added tests cover catalogue structure, localization, future-entry visibility, responsive rendering, and header interaction. Release-preflight execution and offline navigation through the lazy-loaded route lack direct regression coverage.

HAPI Bot

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:docs Documentation site and guides area:web Web PWA / React client community-pr PR from non-collaborator contributor enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants