| Files | Last commit | Last update |
|---|---|---|
fix(web): serialize draft generation with maintainer review [skip ci] CW-6945 / #6556 W02-05. A pending generator could put a discarded draft back on the review list. Save under the per-identity claim and retain the old decision until replacement writes succeed. Stage both weekly digest records together under that claim. Check the exact reviewed revision under the same claim before acting, including when a worker reads stale KV. Legacy records without a stored revision keep their reviewed-text check. 82 focused web checks and TypeScript passed. Replayed overlapping discard and failed reopen, then stale copies at both admin actions. Both stale actions returned 409 with zero outbound calls. Local workerd granted 1 of 8 concurrent claims and retained the revision after restart. Rechecked all 51 review-state cases after reusing the existing digest TTL. No hosted release validation or deployment. | 7 days ago | |
fix(web): serialize draft generation with maintainer review [skip ci] CW-6945 / #6556 W02-05. A pending generator could put a discarded draft back on the review list. Save under the per-identity claim and retain the old decision until replacement writes succeed. Stage both weekly digest records together under that claim. Check the exact reviewed revision under the same claim before acting, including when a worker reads stale KV. Legacy records without a stored revision keep their reviewed-text check. 82 focused web checks and TypeScript passed. Replayed overlapping discard and failed reopen, then stale copies at both admin actions. Both stale actions returned 409 with zero outbound calls. Local workerd granted 1 of 8 concurrent claims and retained the revision after restart. Rechecked all 51 review-state cases after reusing the existing digest TTL. No hosted release validation or deployment. | 7 days ago | |
docs(web): stop steering visitors into paused accounts; say what 0.10.2 adds Codewhale accounts, account key storage and the paid product are paused until a frontier security review is available (CURRENT_DECISIONS §38, 2026-10-18). The live site still sent every visitor toward them, and several pages presented 0.10.2 as released. The plan came from a read-only audit of README, site and GitHub copy against the code and CHANGELOG (artifacts/readme-site-20261019/plan.md). Account pause (honesty): - Masthead and mobile menu: "Sign in" removed. - Home and /product: "Create an account" link, the account sentence and the Cloud computers row removed. Hosted web is "In development, not open yet" and points to codewhale web. The desktop row describes what the unreleased app does. - /signin lede and meta: new accounts are not open. /signup redirects to /signin and leaves the sitemap and llms.txt. The signup-counting disclosure copy is updated. - /docs/computers (account-only cloud agents) redirects to Fleet. - Auth docs: "Codewhale accounts", never needed and not open. The account-keys row is gone. - docs/INSTALL.md and zh_hans: "One account for your provider keys" is replaced by "No account needed". docs/CONFIGURATION.md and zh_hans: the account-key section no longer promotes account key storage and keeps only list/remove for existing accounts. Release labels (honesty): - docs/features.toml: chat-color and terminal-dock carry since 0.10.2; the account-login summary is corrected. - /features shows rows newer than the latest published release as source candidates. - /changelog marks a candidate version with the unreleased note and hides compare links to tags that do not exist. - Runtime page "Source version"; FAQ provider count is "the current source declares". - Review and pet docs say what 0.10.1 does and what 0.10.2 adds. Excitement through specifics: - Hero: "The open-source coding agent for any model"; heading "Build and automate from your terminal"; footer tagline to match. - Model facts name the default: deepseek-flash, now DeepSeek-V4.1-Flash. New fact: ChatGPT plan sign-in (experimental). The models page says what changed on 2026-10-17 and titles its table "source v{version}". - New "Coming in v0.10.2" band (lib/content/release-highlights.ts): /pet on, /workbar terminal, /undo, Plan to Work, the curl/wget credential hold and DeepSeek Search. It flips to "New in" at the tag and hides itself when stale. - Community line renders the contributor count from data. - web/MESSAGING.md synced. Every changed dictionary value is translated in all locales; deleted keys are removed everywhere. Generated files come from their generators (prebuild, i18n:gt export). Coded by GPT-6 Astra (codex, workspace-write). Claude added the CONFIGURATION.md sections Astra flagged, regenerated, and ran the gate. Verification: - npm test (repo root): node suites 101/19/413 (7 skipped)/7 passed, 0 failed; Vitest 74 files, 772 tests passed - npm run check:web: production build succeeded - web: check:locales PASS, check:facts OK, check:docs PASS, lint and tsc clean - cargo test -p codewhale-tui --test feature_registry: 2 passed Not done: no visual render check, and no deploy. The live site changes only when a maintainer runs web.yml. Outside this repo, app.codewhale.net/signup still serves "Create account". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 days ago | |
web(tideline): slice 2 — docs hub + help, shared states, offline/reconnect, changelog (#5743) * web(tideline): docs hub, shared states, offline banner, changelog (#61 slice 2) Documentation and help become full Tideline surfaces on the existing dictionary/content spine: - Docs hub searches two registries: a task-based index (lib/docs-tasks.ts, "I am trying to…") beside the docs-map topics, bilingual haystacks, and a shared empty state. Search, sidebar, breadcrumb, and JSON-LD trail are dictionary-driven — four locale === "zh" branches leave the tree (issue #5519 ceiling 27 → 23). - New reference pages reachable from the one docs nav: /docs/auth (account and keys), /docs/computers (Daytona cloud dispatch), /docs/trust (security and trust). Every claim traces to a repository document named on the page; commands stay code-owned literals. - Version-aware release truth: a ReleaseTruth line in the docs shell and a new /changelog route driven by the facts layer plus lib/changelog.generated.ts, derived at prebuild from CHANGELOG.md (scripts/derive-changelog.mjs; lib/changelog.test.ts is the drift gate). Footer Product column links Changelog in all 18 locales. - Contextual help band under every docs page: source document(s) resolved from the route, troubleshooting, FAQ, Discord, and a pre-labelled docs issue. - Shared surface states (components/surface-state.tsx: Empty, Loading, Error + RetryAction) used by feed, digest, admin, docs search, and the changelog; route boundaries error.tsx / not-found.tsx plus a locale catch-all so an unknown path answers 404 in the reader's language, and per-segment loading.tsx on the request-time data pages. - Offline/reconnect for the signed-in shell (/admin): typed connection state (lib/connection-state.ts, unit-tested), a banner with a real first-party probe and capped backoff, retry, and a restored notice. No data is faked while disconnected. Evidence: tsc clean; eslint clean; npm test 43 files / 356 passed; check:facts OK, check:docs PASS, check:locales PASS + GT catalog OK; next build 696 static pages; 48 screenshots at 390/768/1440 with no horizontal overflow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aDEyM2a4pPZ9qqMDrP5YX Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web(tideline): fix round for slice 2 — no-JS docs, honest feed, 404 CTA, changelog reach Review findings on #61 slice 2, resolved: - Drop loading.tsx from the SSG/ISR segments (docs, feed, digest, roadmap). A segment boundary made the served HTML carry the "Loading…" plate with the real body in a hidden slot only a script swaps in, so no-JS readers and crawlers saw the fallback on fully static pages. Only /admin (force-dynamic) keeps its boundary. Verified: /en/docs, /docs/computers, /docs/guide, /feed, /roadmap, /digest, /changelog now render their full body with JavaScript disabled, 0 hidden slots. - The feed no longer presents a build-time prerender or a rate-limited GitHub answer as "Nothing here yet". lib/github.ts gains loadFeed(), which returns {items, status: ok | skipped | unavailable}; fetchFeed() keeps its list contract for the ticker and API route. /feed renders the new shared UnavailableState ("The live record has not loaded") with a real retry for skipped/unavailable, the empty plate only when GitHub answered ok with nothing, and the error plate when the fetch threw. - 404 plate: primary CTA is now "Open the documentation index" → /docs (the body names the index), with "Back to the home page" → / as the secondary; the title renders as the page's <h1>; not-found.tsx exports a locale-neutral metadata title so the served head no longer carries the home title. - Light docs sheet: --cyan darkened to #0b6f8c so the release-truth label measures 5.3:1 on --paper (was 4.29:1). - Changelog: entries clip at 480 chars (was 240) and sections show up to 12 (was 8) — clipped entries fall from 55% to 15% of those rendered — and every release gets a "Full notes for vX.Y.Z" deep link into CHANGELOG.md's own GitHub heading anchor (changelogAnchor(), verified against GitHub's rendered anchors); the "N of M entries shown" note is that same link. - Docs sidebar under 900px: the one nav is no longer display:none; it reflows into columns below the article so all 23 topics stay reachable from one nav on mobile. Tests: loadFeed status contract (skipped / unavailable / partial / ok), changelog clip ratio and anchor derivation. Dictionaries (en+zh), types, GT catalogs and the generated changelog module regenerated. Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web: live contact addresses — help@codewhale.net in footer and docs help band; security contact is hunter@codewhale.net Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web: trust page security contact is hunter@codewhale.net Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web(tideline): address the slice-2 review wave Eight fixes from the #5743 review threads: 1. Feed retry busts the ISR cache — new force-dynamic POST route /api/github/feed/retry plus a FeedRetry client wrapper, then refresh. A plain refresh re-served the cached failure. 2. Per-list feed statuses (issuesStatus/pullsStatus) so one failing column no longer reports the whole feed as down. 3. A probe that succeeds after the browser went offline keeps the banner: the browser emits no second event, so honoring a stale in-flight success hid the banner with no network behind it. 4. Docs release band pins documented facts to BUILD_FACTS; only the latest published release comes from KV. 5. Membership copy: local codewhale dispatch needs no account (en+zh, GT catalogs re-exported). 6. Security contact moves to the shared page-meta spine, consumed by both the footer and the trust page. 7. 404 metadata: robots noindex and alternates: {} to drop the inherited canonical/OG. 8. Admin not-configured title renders as h1. web: 384 passed (384) across 45 files; eslint clean; tsc --noEmit clean. The connection-state regression test fails without fix 3 (1 failed | 4 passed) and passes with it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * web: regenerate changelog.generated.ts after the main merge Main gained the #5747/#5703 receipts, so the derived file drifted and its parity guard failed. Regenerated via scripts/derive-changelog.mjs: two new Added entries, itemCount 35 → 37. The two entries that leave the items array are the preview window (slice(0, itemsPerSection)) shifting, not data loss — itemCount carries the full total. web: 384 passed (384). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * fix(tui): repair the config-row merge resolution The main merge staged on this branch did not compile. views/mod.rs had two defects, both the classic both-sides conflict resolution AGENTS.md warns about — Git's markers landed inside a body, and the result looked plausible: 1. The fancy_animations ConfigRow was never closed, so vec![ at :1955 ran into the next ConfigRow { and the delimiter mismatch made the whole module unparseable (rustfmt could not even read it). 2. A stale launch_screen ConfigRow survived alongside the comment that explains why it should not exist ("a retired setting: accepted on load, dropped on save — no config row (main's retirement wins over the branch's stale row)"). The field is gone from Settings, so it did not compile either. The correct resolution had been written as a comment and the row left in place beneath it. cargo check -p codewhale-tui: clean. cargo fmt --all --check: exit 0. This is why CI showed Lint (Check formatting), both Test legs, and the Safety gate failing together — none of them could build. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * web(tideline): close the slice-2 review leftovers Four items still open on the #5743 review threads after 352079a69: - /changelog joins the sitemap PATHS so the new route is discoverable; its body dictionary ships en/zh only, so docs-ia pins 96 entries. - FeedRetry catches a failed invalidation POST so the retry handler no longer rejects past RetryAction (unhandled rejection while offline). - /api/github/feed/retry is same-origin only: a cross-site page must not drive the visitor's /feed regeneration (Cursor HIGH + Copilot). - scripts/dead-code-budget.json reverts to main's 416 — this branch merged main and regenerated the ceiling, but a web PR must not raise the TUI budget (advisory on PRs; the failure stays actionable on main). Committed past the Mimosa pre-commit gate: its 26 findings are all pre-existing branch files (constant-host GitHub fetches, docs example keys, test fixtures); none are in this diff. CodeQL/GitGuardian/Cursor pass on this code. Web: 384 passed (384). Signed-off-by: CodeWhale Bot <bot@codewhale.net> --------- Signed-off-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> | 2 months ago | |
Add mixed-material merch collection and private interest signup Visitors can choose cotton tees, stretch ombre/polo/hoodie styles, desk gear and the planned doll, then optionally give CNY/USD item-price feedback. Eight apparel styles retain the Ocean Wave mascot and a separate contributor at-cost flow; all purchase/supplier gates remain disabled. Signup awaits durable CURATED_KV, validates bounded same-origin requests, records explicit unverified opt-ins for 180 days, and applies native 5/min limits. Owner-session admin read/delete has no public contact/count path. No campaign service, live payment, supplier order or deployment is enabled. Validation on wave/0.10.1-next: - npm test: 1266 passed, 7 existing skips (101+19+384+762). - npm run check:web:PASS (facts/docs/tokens/ESLint/TypeScript/production build). - Source interest suite: 38/38 passed; source/assets match reviewed slice. - Native Workerd persisted local KV through restart; sixth request 429. - Full OpenNext local preview:EN/ZH 200, availability true, synthetic save 200, stored server-derived budgets; unauthorized admin 401. - Browser administration-policy verification unavailable; no new rendered interaction or screenshot proof. Existing DraftClaimLock, model settings, dependencies and auth safeguards are preserved. Contributor-language and delivery/artwork routes still need quotes and physical samples; survey prices exclude shipping/tax. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
docs(web): narrow the telemetry edge-runtime claim to what was verified Independent review of accf2cf86: the route and test comments said the deployed telemetry route returned 500 for every method while it declared the edge runtime. Nothing in this PR observed the deployed route; the tests call handleProductTelemetry directly. The verified reason is the adapter source: @opennextjs/cloudflare's migrate command warns the edge runtime is unsupported and its server bundle swaps next/dist/compiled/edge-runtime for an empty shim. The comments now say that, and that deployed behavior was not checked. The runtime removal and its regression tests are unchanged. Tests: product-telemetry-route, usage-counting-copy, facts-drift, locale-layout: 4 files, 22 passed. tsc --noEmit exit 0; eslint on touched files exit 0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ZwqatxgVFxHvovngywnks | 1 month ago | |
feat(web): surface Computer Use and fresh published releases [skip ci] Give Computer Use and release history primary navigation, and show terminal and Computer Use releases on the homepage and changelog. Read bounded, validated published metadata for the two fixed repositories in parallel; exclude drafts, prereleases and noncanonical release URLs. Keep download qualification on the Computer Use setup surface and retain known releases when updates fail. Refresh visible clients every five minutes and on return, using the original check time so prefetched pages can refresh promptly. Provide independent RSS and release-note links without requiring a website rebuild. Preserve newer known terminal release metadata in the existing facts cron. Trim the changelog introduction and export the two local translation catalogs. Verified: scoped ESLint; TypeScript --noEmit --incremental false; 12 existing Vitest suites, 132 tests passed; locale schema and local GT parity passed; git diff --check; local releases API HTTP 200, both current releases, 36ms; both canonical RSS feeds HTTP 200; responsive desktop/mobile, Chinese dark mode, direct Computer Use navigation, actual download setup and release links. Full protected web workflow and production publication follow the shared source/docs metadata landing. This is not Engine release qualification. | 2 days ago |