Commit Graph
3519 Commits
Author SHA1 Message Date
Ray XiandGitHub f10efc52aa fix(daemon): preserve terminal delivery lifecycle evidence (#7679)
* fix(daemon): preserve terminal delivery lifecycle evidence

* fix(daemon): preserve per-attempt terminal evidence

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* fix(daemon): preserve terminal attempt and persistence boundaries

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* fix(daemon): settle terminal claims before capture

Defer the one-shot run_finished envelope by one check phase so adjacent
duplicate and late terminal claims are included in telemetry, and bind the
daemon lifecycle type directly to the shared API contract.

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* fix(daemon): preserve replay and teardown evidence

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-09-04 02:47:50 +00:00
lbjzz-hashandGitHub 9bb4a7d66d fix(media): harden packaged image dispatch and Vela task recovery (#7723)
* fix(media): route legacy image templates through Vela

* fix(codex): preserve packaged node mode in tool shells

* fix(media): resume submitted Vela image tasks
2026-09-03 04:05:37 +00:00
1b6d9a59b1 fix(web): validate the onboarding runtime before Continue is pressed (#7440)
* fix(web): validate the onboarding runtime before Continue is pressed

Continue on the Local Agent step ran the runtime smoke test inside the click
handler, so every user paid a full agent spawn plus a real model round trip
between pressing it and reaching the next screen: 7.1s for Claude Code and
12.1s for Codex CLI measured against a local daemon, against a 45s budget.
The button was only greyed out through that wait and still read "Continue",
so it looked like the click had done nothing. Before #7164 the click itself
was instant, because the validation came from the separate Test button.

Start the validation as soon as the selection settles instead, the way BYOK
already validates a settled provider, so it overlaps with the time the user
spends reading the panel and picking a model. Continue then takes the
already-validated result with no round trip at all. #7164's guarantee is
unchanged: onboarding still cannot complete on an unproven runtime.

`startOrJoinInlineTest` keeps that to one round trip per selection. A click
landing mid-flight joins the pass already validating those inputs rather than
being swallowed or spawning the agent a second time, and an attempt whose
inputs the user has moved past is aborted — the daemon kills the agent child
along with the request. A background pass no longer disables Continue; only a
click that is itself waiting marks the button busy, with a spinner and
"Testing connection…" in place of the label.

Internal report: OPEND-2281.

* chore(web): drop an internal tracker id from the onboarding spec comment

The surrounding sentences already carry the reason the validation has to be
under way before Continue is pressed, so the id added nothing a reader of
this tree could act on.

* fix(web): release the runtime validation when its setup step is left

Review caught two lifecycle gaps in the background validation this branch
introduces.

The pass spawns a real agent CLI, so abandoning one is not free, and nothing
aborted `agentTestRunRef` / `providerTestRunRef` when the user left the setup
step. Back, a runtime switch, or leaving onboarding all left that child
occupying the daemon until its own timeout — a cost that did not exist while
validation only ever started from an explicit click, and one a few abandoned
visits multiply. Abort both runs whenever the setup step is left; React runs
the same cleanup on unmount, so that path is covered by construction.

The BYOK auto-validation effect also still bailed while a run was in flight,
so editing the key, base URL, or model mid-flight scheduled nothing: the
inputs the user was now looking at stayed unproven until the request they
replaced resolved or timed out. That is the exact bail the local effect had
already dropped, and keeping it defeated the cancellation path
`startOrJoinInlineTest` was built for. Both effects now schedule through the
helper and let it abort whatever it supersedes.

* fix(web): make an aborted runtime validation undo its own bookkeeping

Review found three ways the cancellation added in the previous commit and the
attempt bookkeeping around it had drifted apart.

Aborting released the request but kept `*AutoTestKeyRef` claiming those inputs
were validated, while the aborted run deliberately writes no result. Coming
back to the same selection therefore hit the key guard, scheduled nothing, and
left the panel rendering a "testing" line no run would ever finish — the
automatic path was dead until Continue was pressed by hand. Aborting now clears
the key and returns a `running` state to idle. A run that already finished is
left alone: its verdict still describes the current selection, and re-proving
it would cost another spawn.

Releasing was also keyed on leaving the step, but inputs can stop being
testable while the user stays: clearing a BYOK key, or a daemon that goes away
under a local agent, leaves a request nothing can consume — the same situation
as walking out, and now the same cleanup. The condition is what the step can
still act on, not where the user is.

Finally, the debounce outlived a manual Test press, because pressing Test
disturbs none of the effect's inputs. A manual check answering inside that
window let the armed timer spend a second request on inputs that were just
proven, which also let a transient second failure overwrite the first success.
Both timers re-read the bookkeeping at fire time instead of trusting the check
made when they were armed.

* fix(web): do not validate a selection the setup step is still asking for

Being selectable is not the same as being provable, and the background
validation only checked the first. `canTestAgent` asks whether a selection
exists and the daemon is up; the picker deliberately keeps a setup-required
DeepSeek Harness entry in that list so the user has somewhere to start setup
from, and `selectDefaultCliAgent` only reassigns the saved selection when some
other agent is actually available. With that entry saved and nothing else
installed, opening the Local Agent step spent a `/api/test/connection` on it.

The entry carries a resolvable `path` — that is part of what identifies it as
setup-required — so the daemon does not short-circuit on `agent_not_installed`
and genuinely tries to start the runtime. The panel then reports a failure on
the same screen that is telling the user to finish installing the companion,
which reads as the setup being broken rather than unfinished. Continue was
already gated on `selectedAgent?.available === true`; the unprompted spawn was
not, and the two disagreed.

Start the background pass only on a selection the step would actually let the
user continue on. Pressing Test stays their call. Releasing keeps the wider
condition on purpose: a run started by hand on a setup-required entry still
has to be aborted when they leave, so what may start on its own is a stricter
question than what must be cleaned up.

---------

Co-authored-by: Cheems <94773058+itscheems@users.noreply.github.com>
2026-09-03 04:03:09 +00:00
8ab7c3d5f1 feat(standalone): establish the exact lifecycle and Terminal carrier (#7716)
* feat(standalone): add shell-neutral exact lifecycle

* feat(terminal): add native exact cold-start carrier

* test(terminal): exercise mutable exact channel heads

* feat(standalone): model synced blobs and Shell updates

* feat(terminal): exercise the complete Shell lifecycle

* feat(release): add the independent exact Terminal line

* test(exact): run the full local Terminal release line

* feat(terminal): harden exact Sidecar lifecycle

* feat(standalone): prove exact update transactions

* refactor(standalone): separate shell lifecycle dimensions

* refactor(e2e): decouple terminal exact drivers

* refactor(terminal): isolate exact sidecar fixture host

* feat(terminal): gate handoff on physical retirement

* refactor(release): gate exact activation on public acceptance

* test(terminal): formalize guarded lifecycle algebra

* fix(terminal): guard shell installer handoff

* feat(terminal): add exact bootloader handoff

* feat(terminal): integrate exact sidecar lifecycle

* refactor(exact): rename validation channels

* test(terminal): harden exact release acceptance

* fix(postinstall): build standalone dependencies first

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(ci): build the native Terminal scene

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* test(ci): cover exact convergence handoff routing

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(exact): isolate terminal validation from main CI

* fix(terminal): complete shell update confirmation

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(exact): bind acceptance to installed manifest

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(standalone): block occupied shell installs

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

---------

Co-authored-by: Looper <looper@noreply.github.com>
2026-09-03 03:50:34 +00:00
Marc ChanandGitHub 1d2150007b chore: remove extracted landing-page from the monorepo (#7727)
* chore: remove extracted landing-page from the monorepo

The marketing site now lives in a separate repository. Drop the
Astro app, its GitHub workflows/scripts, and the remaining
monorepo coupling so this workspace no longer builds or deploys it.

* fix: drop leftover landing-page coupling from Teams and skills

Point development enterprise URLs at the deployed marketing origin,
remove nextjs-app skill outputs that no longer emit a page, and stop
advertising apps/landing-page in plugin marketplace metadata.

Generated-By: looper 0.12.0 (runner=fixer, agent=omp)

* fix(ci): restore DSH installer E2E Vitest routing

Removing dsh-bootstrap-identity dropped the only planner route from
tools/release/resources/dsh-bootstrap/ to web_tests_required, so
installer-only PRs skipped e2e/tests/dsh-installer-version-policy.test.ts.

Generated-By: looper 0.12.0 (runner=fixer, agent=omp)

* docs: drop leftover landing-page paths from template assets

The skill contract no longer advertises the extracted Astro app, but
styles.css, compose.ts, and example.html still named deleted
apps/landing-page sources. Describe the standalone template behavior
instead and keep the bundled plugin example in sync.

Generated-By: looper 0.12.0 (runner=fixer, agent=omp)

* docs: keep landing-page off review and test surfaces

Add apps/landing-page to the forbidden-surface review list and stop naming the extracted path in plugin registry acceptance tables.

Generated-By: looper 0.12.0 (runner=fixer, agent=omp)

* fix: drop leftover landing-page refs and bump plugin version

Stop naming the deleted apps/landing-page in the landing-deck demo and
plugin-registry plan. Bump example-open-design-landing to 0.1.1 and keep
the official catalog version aligned with the bundled manifest.

Generated-By: looper 0.12.0 (runner=fixer, agent=omp)
2026-09-03 03:21:08 +00:00
netteeandGitHub ff2cc80f33 chore(amr): use default Vela agent runtime (#7726) 2026-09-02 09:32:03 +00:00
netteeandGitHub 349748ee36 chore(pack): bump vela cli to 0.0.35 (#7717) 2026-09-02 06:07:27 +00:00
Ray XiandGitHub c92276a616 observe exact ACP prompt frame budgets (#7692)
* feat(daemon): observe exact ACP prompt frame budgets

* fix(daemon): trust catalog model diagnostics

* fix(daemon): retain prompt budget evidence

Scope input usage to each physical agent session attempt and retain the validated prompt-budget projection outside the run event tail.\n\nGenerated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-09-02 05:17:06 +00:00
lefarcenandGitHub 09bd500d43 fix(plugins): enforce HTML preview contracts (#7707)
* fix(plugins): enforce HTML preview contracts

* fix: fail closed on preview contract I/O errors
2026-09-01 14:17:59 +00:00
Ray XiandGitHub be5214ed74 feat(daemon): persist tool execution lifecycle diagnostics (#7702)
* feat(daemon): persist tool execution lifecycle diagnostics

* fix(daemon): preserve lifecycle telemetry integrity

Aggregate only the newest valid snapshot per tool execution, fail closed when lifecycle records cannot be projected, and scope persistence to AMR-marked ACP sessions.\n\nGenerated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-09-01 14:16:19 +00:00
0688faaec3 reland(sidecar): converge product clients on package boundary (#7636)
* reland(sidecar): converge product clients after weekly release

Restore the sidecar convergence from #7244 after the release-scheduling revert in #7634. This tree matches the previously reviewed and cross-platform QA-accepted implementation at d83d4e032f.

* fix(sidecar): clarify identity and cache witnesses

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(packaged): probe cross-source desktop owners

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): preserve cross-source launch ownership

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* test(pack): assert cross-source Windows launch ownership

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): align HyperFrames with client boundary

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(e2e): keep HyperFrames fixture in helper lane

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* docs(sidecar): restore review and handoff contracts

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): restore cache and daemon boundaries

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(pack): restore sourcemaps and Linux smoke discovery

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): make payload handoff generation-atomic

* fix(sidecar): preserve packaged action and mode parity

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* test(pack): align Linux cleanup resource count

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(packaged): preserve headless sidecar mode

* test: normalize source line endings

* fix(daemon): launch Codex cmd shims on Windows

---------

Co-authored-by: Looper <looper@noreply.github.com>
2026-09-01 13:22:04 +00:00
CaprikaandGitHub 05a01a0048 fix packaged mac Home readiness race (#7688)
* fix e2e packaged Home readiness race

* fix e2e poll Home readiness outside inspect

* fix e2e wait for Lexical attachment

* fix e2e publish setup after prompt insertion
2026-09-01 11:59:14 +00:00
Marc ChanandGitHub c3f47cb2e3 fix(release): quote catalog latest pointer If-Match etags (#7690)
* fix(release): quote catalog latest pointer If-Match etags

R2 412s If-Match when GET returns an unquoted or weak ETag. Normalize to a
strong quoted validator before the CAS PUT so catalog-publish can advance
latest.json after the first snapshot.

* fix(release): reject weak ETags on catalog latest CAS

If-Match is a strong comparison. Do not strip W/ and invent a strong
validator; only quote a bare strong ETag. A weak GET fails closed and
leaves latest.json unchanged.

* chore(catalog): temporarily allow catalog-publish on CAS etag branch

Verification only. Revert after the dispatch run proves latest.json CAS.

* fix(release): GET catalog objects with identity encoding

R2/fetch returned a weak ETag on latest.json, so If-Match never matched.
Request uncompressed bytes so the validator stays strong.

* Revert "chore(catalog): temporarily allow catalog-publish on CAS etag branch"

This reverts commit e5703d6c78.
2026-09-01 11:09:59 +00:00
Ray XiandGitHub dada39b3ad fix(web): scope artifact upgrade gate to active project (#7689) 2026-09-01 10:43:29 +00:00
743ae80d71 fix(deploy): ship data/ so Docker images keep their baked plugin previews (#7028)
`deploy/Dockerfile` copies skills, design-systems, craft, prompt-templates,
assets and plugins/_official, but not data/ — so
`data/plugin-previews/manifest.json`, which CI commits precisely so deployments
can find the bakes, is absent at runtime. `resolvePluginPreviewsDir()` defaults
to <projectRoot>/data/plugin-previews, `loadManifest()` returns {},
`applyBakedPreviews()` returns the records untouched, and
`inferPluginPreview(record, { preferBaked: true })` falls through to the live
iframe for every plugin.

Measured on 0.19.2 with 461 registered plugins: the checked-in manifest has 176
entries and 0 records carried od.bakedPreview. With data/ present the same
daemon reports 176 — deck 79, prototype 79, video 10, scenario 4, image 1,
audio 1, template 2. The packaged app reaches the manifest through its own
packaging path, so only Docker/self-hosted deployments are affected.

Also warn once per path when the manifest is absent. `loadManifest()` already
carries the reasoning for the malformed case — «would otherwise silently
disable every baked preview with no trace; surface it so it's diagnosable» —
but the absent branch returned {} with no message, which is the same failure
with the same lack of trace.

Fixes #7018

Co-authored-by: Jason <>
2026-09-01 09:03:36 +00:00
Marc ChanandGitHub a36ebb0df3 fix(release): make catalog pack git-safe in the Playwright container (#7680)
* fix(release): make catalog pack git-safe in the Playwright container

Checkout's set-safe-directory did not cover later git calls, and Meta
swallowed a failed rev-parse under sh -e, so export ran with an empty
source commit. Mark GITHUB_WORKSPACE safe and pin CATALOG_SOURCE_COMMIT
to github.sha.

* fix(release): temporarily allow catalog-publish on the git-safe branch

Let pack and publish run on fix/catalog-publish-container-git so the
container git fix can be verified end-to-end before reverting the guard.

* fix(release): restore catalog-publish main-only job guards

Drop the temporary fix-branch allowlist now that the container git
workaround is verified end-to-end.
2026-09-01 09:02:58 +00:00
Ray XiandGitHub 1919ddc8be fix(amr): retire unlimited model badges (#7544)
* fix(amr): retire unlimited model badges

* test(web): remove obsolete campaign badge contract

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* test(web): drop retired campaign restriction contract

The model-picker badge removal intentionally deleted campaignRestricted, but the campaign source-contract suite still required the dead branch and failed Web workspace tests (2/2). Keep the surviving campaignNeedsUpgrade URL-isolation contract only.\n\nGenerated-By: looper 0.12.0 (runner=fixer, agent=codex)

* test(e2e): remove duplicate model badge witness

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-09-01 07:50:53 +00:00
netteeandGitHub 139ab38165 fix(chat): hide OpenCode compaction lifecycle (#7682)
* fix(chat): hide OpenCode compaction lifecycle

* test(chat): cover ACP continuation after compaction

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-09-01 07:30:46 +00:00
6f081ef741 docs: map the two prompt implementations behind the OD Next fork (#7649)
* docs: map the two prompt implementations behind the OD Next fork

`composeSystemPrompt` returns early for OD Next runs, so the legacy stack below that return — the designer charter, the discovery layer, and the deck framework directive that embeds deck protocol v1 — never reaches those runs. Nothing in the repository said so, and prompt changes have been landing on one side only. The deck case is live: the OD Next `ppt.md` pins none of `data-od-deck-protocol`, the `od:deck-ready` announce, the `od:slide-state` posts, the `od:slide` listener, `id="deck-stage"`, or the print stylesheet, so a deck generated on that path can fail to be recognized as a v1 deck, paged from the host toolbar, or exported to PDF. Eligibility is re-evaluated per run and can latch down mid-session, which is why the divergence shows up as an intermittent bug.

Adds `apps/daemon/src/prompts/AGENTS.md` (fork point, the four variant axes, and a host runtime contract table naming which side carries each contract today) and `plugins/_official/scenarios/od-next-strategy/AGENTS.md` (asset roster and package-hash rules, and why maintenance notes must stay out of `assets/`, which is sent to the model verbatim). Root AGENTS.md gains an index entry and a Prompt variants section. Pointers go at the two fork sites, both deck-framework copies, and the OD Next atom registry, which is itself declared twice.

Documentation and comments only; no prompt bytes change. Validated with pnpm typecheck, pnpm guard, the daemon prompt suites (207 tests), and the contracts system-prompt / web-clone / deck-protocol suites (28 tests).

* docs: add PR #7568 as the worked example of a one-sided prompt change

The variant map says the two sides exist; it did not show what missing one costs a careful author. #7568 (merged 2026-08-29, `973e868ce`) is the case: it introduced deck protocol v1 across 18 files, handled the daemon/contracts prompt-copy split completely — shared constant, both copies changed, a guard added on each side — ran the full web and contracts suites plus two packaged DMG end-to-end runs, and touched nothing under `plugins/_official/scenarios/`. Its own stated goal was to stop new navigation dialects appearing; the OD Next path kept generating decks with no protocol at all, reported two days after merge.

Records the three reasons the miss stayed invisible, each still true today: both guards it added call `composeSystemPrompt` without an OD Next recipe so they cannot pass the fork (one is named 'ships new Agent decks with OD Deck Protocol v1' and is green), the prompt matrix snapshot updated cleanly because every scenario in it takes the legacy branch, and sharing a constant fixed only the machine-readable half — the surrounding directive prose had already drifted between the two copies before #7568 and still differs on main.

Documentation only. Validated with pnpm guard in a worktree on this branch.

* docs: mark the deck fork at the sites an agent actually edits

The file-top and fork-point pointers only reach an agent that reads from line 1. The edit an agent actually makes for a deck rule lands in the middle of DECK_FRAMEWORK_DIRECTIVE (368 lines below the daemon file's header) or at the push site (446 lines below the fork), typically reached by grepping and reading a short span — where no pointer was in view. Put a two-line marker at each of those four sites instead: above DECK_FRAMEWORK_DIRECTIVE in both prompt copies, and above the deck/freeform push guard in both, which covers both push branches. Line references in the two AGENTS.md files are re-pinned for the shift.

Comments only, placed outside every template literal. Verified byte-identical prompt output against origin/main: 8 scenarios x both composition paths, sha256 and length compared in one worktree with the source files swapped and contracts rebuilt — all 16 pairs identical. pnpm typecheck, pnpm guard, daemon tests/prompts (207), contracts system-prompt / web-clone / deck-protocol (28).

* docs: move the prompt variant map to docs/ and refresh it for #7651

Two changes in one, because main invalidated the old shape while it sat in review. Structural: the guidance moves from two nested AGENTS.md files to one `docs/prompt-composition.md`, matching how the root index already carries `docs/architecture.md` and `docs/skills-protocol.md`. Nested AGENTS.md is not auto-loaded on file access, so proximity bought no delivery that the root pointer and the in-file markers do not already provide. The plugin folder keeps a short AGENTS.md for the one rule that is only meaningful there — never write maintenance notes into `assets/`, which reaches the model verbatim. Naming it after the structure rather than the experiment keeps it valid if OD Next is retired or graduates: two of the four axes are independent of it.

Factual: #7651 closed the deck gap this document reported, by collapsing the scaffold to one source in contracts and reaching OD Next through `resolveOdNextDeckFrameworkMode` rather than the markdown assets. The contract table's deck rows now read supported on both sides, the daemon deck-framework file is a re-export, and the two markers that claimed OD Next never receives the directive are removed rather than reworded. #7568 and #7651 are now presented as a pair — a one-sided change and the follow-up nearly twice its size that repaid it. Remaining gaps are recorded: five daemon/contracts prompt pairs still hand-maintained, and `core-slim.ts` absent on the contracts side.

Documentation and comments only. Prompt output verified byte-identical against the merge base: 8 scenarios x both composition paths, sha256 and length, markers reverted and reapplied in place. pnpm typecheck (0 errors), pnpm guard, daemon tests/prompts (210), contracts system-prompt / web-clone / deck-protocol / od-next-prompt-recipe (53).

---------

Co-authored-by: Cheems <94773058+itscheems@users.noreply.github.com>
2026-09-01 06:26:59 +00:00
Max HsuandGitHub c25c31aa65 test(e2e): cover grid card menu overflow near the viewport bottom (#7587)
#6971 fixed the placement for both layouts through one shared render site,
but its regression coverage only exercised the list row. Grid is the default
view, and that is the layout #6916 reports, so the reported scenario had no
witness.

Verified red/green against the placement rule: with
.recent-projects__card-menu[data-placement='up'] removed both this case and
the existing list-row case fail on the menu-above-trigger assertion; with it
restored both pass.
2026-09-01 06:14:33 +00:00
nanoandGitHub af7f70f0d7 docs: correct macOS Docker authentication guidance (#7571)
* docs: correct macOS Docker authentication guidance

* docs: use loopback IP for Docker quickstart
2026-09-01 06:14:24 +00:00
nanoandGitHub 0061fb98c8 docs: align daemon language guidance with TypeScript (#7513)
* docs: align daemon language guidance with TypeScript

* docs: sync TypeScript guidance across translations
2026-09-01 03:45:01 +00:00
a4608a80b2 docs: update local CLI navigation (#7598)
Co-authored-by: T-sanjay-ram <sanjayramctr07@gmail.com>
2026-09-01 03:44:34 +00:00
Marc ChanandGitHub 241f520037 feat(release): publish versioned catalog and DSH snapshots (#7617)
* feat(release): publish versioned catalog and DSH snapshots

Add tools-release catalog export/pack/publish and a canonical DSH
bootstrap source so landing can later consume immutable R2 snapshots
without globbing the monorepo tree.

* fix(release): harden catalog snapshot publishing

* fix(release): use portable tar ownership flags

* fix(release): resolve catalog root from git checkout

* fix(release): stabilize catalog preview assets

* fix(release): close catalog publish determinism gaps

* fix(release): remove mutable catalog runtime metadata

* fix(release): prevent stale catalog pointer updates

* fix(release): fail all-fallback catalog previews

* fix(release): fail previews with blocked dependencies

* fix(release): export localized design system bodies

* fix(release): pin catalog preview environment

* fix(release): close catalog and bootstrap rollback gaps

* fix(release): fail partial catalog preview renders

* fix(release): render remote catalog entries locally

* fix(release): keep DSH bootstrap publishes fresh

* fix(release): parallelize catalog snapshot uploads

* fix(release): preserve hidden catalog assets

* fix(release): trigger catalog publish on storage helpers

Include common.ts and s3-upload.ts in catalog-publish and catalog-validate
path filters so publisher CAS, signing, and retry changes republish.

* fix(release): gate catalog provenance and DSH helper triggers

Validate complete provenance against the packed bundle before any
immutable upload. Include common.ts and s3-upload.ts in the standalone
DSH publisher path filter.

* fix(release): match provenance recordCounts to catalog

Derive counts from catalog.records and require an exact match before
any immutable upload so empty or stale provenance cannot become latest.
2026-09-01 03:25:37 +00:00
7c71d33494 feat(web): explain the rail's Discord / X / mail icons on hover (#7665)
* feat(web): explain the rail's Discord / X / mail icons on hover

The three icon-only links at the bottom of the nav rail carried native
`title` text that only named the destination ("Join the OpenDesign
Discord"), so nothing told a user what they get by clicking — least of
all that Discord is where free credits are handed out.

Move them onto the shared `.od-tooltip` layer (the same bubble the
sidebar's expand control uses) and rewrite each label to lead with the
payoff. One string per link now doubles as the accessible name and the
tooltip, so the copy stays in one place.

X was hardcoded to "@OpenDesignHQ" and could not be translated; it now
has an `entry.xAria` key like the other two, filled in for all 19
locales.

The rail sits on the leading edge, so tooltips open away from it —
right in LTR, left once RTL moves the whole rail to the right edge.
Without that flip the bubble is clamped against the viewport and lands
back on top of the icons it describes. `isRtlLocale` is now exported
from the i18n provider rather than re-declaring the locale list at the
callsite.

* test(web): gate the question-form answer on the form being submittable

The assertion fired as soon as onSubmitQuestionForm existed, but the
handler returns false while currentConversationActionDisabled is still
true, so a loaded CI runner failed with 'expected false to be true'.
Wait for questionFormSubmitDisabled, like the sibling test does.

---------

Co-authored-by: elifive555555 <296440099+elifive555555@users.noreply.github.com>
2026-09-01 03:00:44 +00:00
Ray XiandGitHub 6fb440a866 fix(analytics): separate admission phase from failure attribution (#7648)
* fix(analytics): separate admission phase from failure attribution

* fix(analytics): recognize ACP replay boundary

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* fix(analytics): retain admission evidence across truncation

Preserve terminal-attempt evidence before the run event ring buffer truncates, and recognize guarded stdout plus persisted artifact activity.

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* fix(analytics): flush Antigravity output before close errors

Emit guarded non-OAuth stdout before terminal close errors so admission evidence survives in both the live ledger and durable event log.

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* fix(analytics): require admission attempt boundary

Keep fallback admission phase unknown when no start event proves that an attempt began.

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* fix(analytics): honor confirmed ACP model selection

Use the final pre-error ACP model status so session/new metadata does not invalidate a subsequently confirmed requested model.

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-09-01 02:40:29 +00:00
lefarcenandGitHub f65d245de9 fix(deck): pin deck protocol in OD Next prompts (#7651)
* fix(deck): pin deck protocol in OD Next prompts

* test(deck): cover rollout and template matrix

* test(deck): tighten protocol navigation canary

* fix(prompts): preserve deck handoff by execution profile

* test(prompts): update deck handoff matrix lengths

* fix(prompts): keep deck planning tool neutral

* fix(prompts): preserve legacy deck scaffolds
blog-indexed-prod
2026-08-31 17:31:46 +00:00
ccf1abb446 fix media HyperFrames rendering in packaged desktop (#7633)
* fix media HyperFrames rendering in packaged desktop

* fix nix dependency hashes

* fix desktop frame capture timeout

* fix(desktop): prevent HyperFrames capture stalls

* test(desktop): verify HyperFrames timeline advances

* fix(daemon): preserve declared HyperFrames duration

---------

Co-authored-by: lefarcen <935902669@qq.com>
2026-08-31 15:32:33 +00:00
Ray XiandGitHub 1a21746c46 fix(daemon): exclude host-flushed ACP results from completion diagnostics (#7647) 2026-08-31 11:57:26 +00:00
Ray XiandGitHub 3273acc7da test(e2e): await app readiness in delayed Cloud onboarding (#7658) 2026-08-31 11:00:55 +00:00
AmyandGitHub ce467d0fa6 fix(e2e): drop obsolete mac chrome click gate (#7652)
* fix(e2e): preserve GitHub-first chrome fallback

* fix(e2e): target a visible mac chrome action

* fix(e2e): drop obsolete mac chrome click gate
2026-08-31 10:42:47 +00:00
netteeandGitHub e0d0faa374 chore(pack): bump Vela CLI to 0.0.34 (#7646) 2026-08-31 08:48:51 +00:00
netteeandGitHub 49cc51058f chore(nix): retire official Nix distribution (#7644) 2026-08-31 08:08:33 +00:00
Ray XiandGitHub db9ebb7ba8 fix(daemon): preserve run version across restart (#7500) 2026-08-31 08:02:56 +00:00
Ray XiandGitHub fbeb811591 fix daemon anonymous Langfuse registration shells (#7510)
* fix daemon anonymous Langfuse registration shells

* test daemon anonymous Langfuse relay completion

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-08-31 08:02:14 +00:00
netteeandGitHub 981c4277de fix(e2e): align packaged chrome smoke with signed-out home (#7641) 2026-08-31 07:24:40 +00:00
Ray XiandGitHub b273172436 fix(web): bound and scrub resource error telemetry (#7501)
* fix(web): bound and scrub resource error telemetry

* fix(web): isolate resource telemetry identities

Keep private resource identity local to retry windows and restrict serialized product, opaque, and chunk values to scrubbed classifications.

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-08-31 06:20:45 +00:00
Ray XiandGitHub 59d7a1d9c7 feat(analytics): add structured run failure evidence (#7534)
* feat(analytics): add structured run failure evidence

* fix(daemon): preserve run failure evidence boundaries

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* fix(daemon): correct structured failure attribution

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)

* fix(daemon): preserve specific failure evidence

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-08-31 06:20:27 +00:00
PerishFireandGitHub 5a62b0edad revert(sidecar): defer convergence until after weekly release (#7634)
Revert d83d4e032f to keep the current weekly release on its established baseline. The sidecar convergence work and QA acceptance remain valid and will be relanded after the release window closes.
2026-08-31 04:02:40 +00:00
d83d4e032f refactor(sidecar): converge product clients on package boundary (#7244)
* refactor(sidecar): own client identity and lifecycle atomics

* refactor(sidecar): converge product clients on package boundary

* fix(sidecar): use TypeScript process fixture

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(e2e): assert opaque sidecar capability

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): preserve resilient client handoffs

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(nix): build sidecar dependencies first

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(sidecar): restore historical desktop handoff

Generated-By: looper 0.11.2 (runner=fixer, agent=codex)

* fix(packaged): canonicalize mac runtime paths

* fix(tools-pack): clean mac launcher namespace

* fix(sidecar): harden client lifecycle boundaries

* fix(sidecar): isolate concurrent lifecycle generations

* fix(sidecar): retain spawned process generations

* fix(sidecar): preserve resources across restart

* fix(tools-dev): retain dynamically bound daemon port

* fix(sidecar): fence Windows process generations

* test(packaged): use sidecar client in payload fixture

* fix(sidecar): enforce generation ownership

* fix(sidecar): persist generation ownership

* fix(sidecar): quick-fail ambiguous recovery

* fix(tools-pack): ship sidecar supervisor

* fix(sidecar): fence lifecycle generations

* fix(tools-pack): build platform before sidecar

* fix(sidecar): preserve nested stamped resources

* refactor(sidecar): model generation authority

* fix(sidecar): converge packaged build and headless actions

* fix(sidecar): isolate Windows generations

* fix(sidecar): retire orphaned generation descendants

* fix(sidecar): unify fenced process retirement

* fix(sidecar): converge contended launch generations

* test(sidecar): model slower packaged fixtures

* fix(sidecar): make supervisor the generation boundary

* fix(web): bound sidecar HTTP shutdown

* fix(pack): verify complete mac shutdown

* refactor(sidecar): converge packaged lifecycle sets

* fix(sidecar): serialize Windows packaged lifecycle

* fix(windows): harden packaged cold-start validation

---------

Co-authored-by: Looper <looper@noreply.github.com>
Co-authored-by: Amy <58060647+AmyShang-alt@users.noreply.github.com>
2026-08-31 03:27:41 +00:00
9130ea94e8 feat(landing): split multilingual sitemap by route (#7559)
Co-authored-by: Maisie <jingding1121@gmail.com>
2026-08-31 02:28:48 +00:00
cfc21b404e fix(landing): keep reveal content visible without JavaScript (#7502)
* fix(landing): keep reveal content visible without js

* chore: retrigger homepage reveal checks

* fix(landing): preserve reveal exceptions and template parity

* fix(template): preserve reveal enhancement when composing

* test(e2e): own landing reveal parity contract

---------

Co-authored-by: Maisie <jingding1121@gmail.com>
2026-08-31 02:25:09 +00:00
lefarcenandGitHub 1c1ecae470 fix(web): preserve HTML preview state across edit handoffs (#7592)
* fix(web): preserve HTML preview state across edit handoffs

* test(web): align reload race coverage with URL handoff

* test(e2e): target canonical active preview frame

* fix(preview): complete URL edit handoff parity

* fix(e2e): classify preview round-trip parity

* fix(preview): close edit handoff readiness gaps

* fix(preview): close remaining handoff regressions

* refactor(preview): centralize runtime state contract

* test(preview): isolate parity audit runtime
2026-08-31 01:32:49 +00:00
lefarcenandGitHub 9e63bc0641 fix OpenRouter retired model diagnostics (#7627) 2026-08-31 01:32:19 +00:00
netteeandGitHub df84ae5b9e refactor(web): remove unused component islands (#7591) 2026-08-29 14:18:01 +00:00
netteeandGitHub 60be43c132 chore(repo): remove accidental Bun lockfile (#7589) 2026-08-29 14:17:38 +00:00
netteeandGitHub 7d81aa9f8a chore(landing-page): remove unused font assets (#7590) 2026-08-29 14:17:16 +00:00
lefarcenandGitHub 973e868ced fix(deck): make legacy thumbnail navigation instant (#7568)
* fix(web): make deck thumbnail navigation immediate

* feat(deck): standardize viewer navigation protocol

* test(daemon): update deck prompt matrix snapshot

* test(daemon): assert versioned deck fallback state

* test(deck): strengthen navigation regression contract

* fix(deck): reject unsupported fallback protocol versions

* fix(deck): reject unsupported bridge protocol versions

* fix(deck): retry keyboard navigation through transition locks
2026-08-29 07:27:29 +00:00
Ray XiandGitHub a554d017c8 fix(web): render fixed-stage recent deck covers (#7556)
* fix(web): render fixed-stage recent deck covers

* test(e2e): type visual projects from contracts

Bind visual project fixtures to the production Project DTO so contract changes fail at the mocked API boundary.\n\nGenerated-By: looper 0.12.0 (runner=fixer, agent=codex)

* test(web): own fixed-stage deck cover fixtures

Move the authored deck sample into the e2e resource lane and pin the wrapper normalization in the web-owned srcDoc test.

Generated-By: looper 0.12.0 (runner=fixer, agent=codex)
2026-08-28 11:04:07 +00:00
Ray XiandGitHub f9f83f7476 fix(web): ignore commented slide tags in covers (#7558) 2026-08-28 10:17:34 +00:00