Operator report: the first-run "Set Up AI" modal had extra space along its right
edge, and it asked a browser visitor to connect a remote server and mentioned a
native shell they do not have.
Three defects, verified in a real container build at desktop and mobile widths:
- FN-8015 reserved `margin-inline-end: var(--space-lg)` on the shared
`.floating-window__body` so a hosted scrollbar cleared the east resize hot
zones. One shared reservation every caller had to know about produced a
recurring class of asymmetric-right-inset bugs instead: it was zeroed
piecemeal five times (FN-8766, mobile task detail, FN-8722, FN-8702, every
tablet window) while two callers leaned on it for their right inset and had to
restore it whenever one of those predicates fired. Delete the gutter, its five
overrides, and GitHub Import's borrowed-inset compensation. Where a scrollbar
and a resize target actually collide, use FN-8766's outboard east targets.
Trade-off accepted by the operator; the ratchet test now forbids the gutter in
any stylesheet at any breakpoint.
- The hosted Set Up AI modal did not fill its window: its standalone
`height: min(85vh, ...)` rule ties on specificity with FloatingWindow's
`height: 100%` and won on source order, leaving ~60px of dead window surface
under the footer alongside the 16px gutter strip. Right gap 17px -> 1px,
bottom gap 62px -> 1px.
- The "Connect remote Fusion server" card keyed only on
`desktopMode !== "local"`, and `desktopMode` is undefined on web, so every
browser first-run led with a native-shell hand-off form. Now also requires
`host !== "web"`.
Verified: 165 dashboard test files / 5829 tests pass, eslint and
`tsc -p tsconfig.app.json` clean, and a container built from this tree shows the
panel flush at 1280x800 and as a symmetric full-screen sheet at 390x844 with no
remote-server card.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three defects found while bringing up a container from a clean checkout:
- The dashboard's vite build (~5.7k modules) exceeded V8's default old-space on a
stock Docker Desktop VM and aborted the image build with "Ineffective
mark-compacts near heap limit" (exit 134). Raise the ceiling for that RUN only.
- The documented `-v fusion-home:/home/node/.fusion` mount seeded a root-owned
named volume over a path absent from the image, so embedded Postgres initdb hit
"Permission denied", the supervisor burned its 4 restarts, and the container went
unhealthy on first run. Pre-create the directory node-owned so a fresh named
volume inherits it; document that bind mounts still need a host-side chown.
- Drop the dependency-graph plugin's tsconfig path mapping for the taskStuck module
deleted in 2eae0b2507 / 29d94e0fa3.
Verified: full `docker build` from a clean export of this tree succeeds unpatched,
and a run against brand-new named volumes with no manual chown reaches health=healthy
with /api/health 200.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The dependency-graph plugin imported the deleted taskStuck util through its
dashboard interop shim, breaking the dashboard vite build. Remove the isStuck
gate from graph nodes, the taskStuckTimeoutMs prop threading, the taskStuck
module declaration from dashboard-interop.d.ts, and the stalled-card-as-stuck
test coverage. Covered by the existing remove-stuck-task-tagging changeset.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Removes the dashboard's stuck-task tagging per operator request: the Stuck
card/status badges, stuck row styling, the footer Stuck segment and
stuckTaskCount stat, utils/taskStuck.ts, the isStuck agent-activity gate,
and the taskStuckTimeoutMs prop plumbing (App -> Board/Lane/Column/
WorktreeGroup/MainContent -> TaskCard/ListView/ExecutorStatusBar). Stuck-task
tests are deleted or reconciled. The taskStuckTimeoutMs setting and the
engine's recovery sweeps (including the stuck-killed status) are unchanged —
the setting is engine-side only now.
Also repoints the FN-6756 liveness-gate ratchet's facade scans at
executor/task-executor-session-facades.ts, where the wave20 extraction moved
hasLiveSessionSurface/clearPhantomExecutorBinding (the two pre-existing red
tests on main).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ten self-healing rebounds passed preserveProgress without preserveWorktree, so
the reopen-into-planning move hook cleared task.worktree and the idle sweep
reaped the checkout (uncommitted work included) — the same loss mechanism as
the in-review branch-rebind incident. Those rebounds (stuck-loop park,
undeclared-column rehome, finalize-integrity blocks, stale-incomplete-review,
ghost-review, terminal-failure retry, legacy rehome, partial-progress) now pass
preserveWorktree: true; deliberate discards (branch proven merged, zero unique
commits, worktree already missing) carry an explicit worktree-discard-intended
marker.
A new static ratchet test requires every preserveProgress rebound in
self-healing.ts to either preserve the worktree or carry the marker.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
**Problem:** Self-healing repeatedly spawned git children
(status/rev-parse/for-each-ref) for paused/idle projects on every sweep,
and certain repair sweeps ran unbounded — a spawn/git storm that spiked
CPU and I/O on the production host.
**Fix:** Bound self-healing git work for paused projects (skip/cooldown)
and cap the repair sweeps so the engine stops churning git processes
when there is nothing actionable. Includes in-process-runtime pause-gate
+ self-healing pause-storm regression tests.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Bug Fixes**
- Paused projects no longer trigger Git-intensive self-healing
maintenance.
- Pause and unpause transitions now correctly stop and resume
maintenance scheduling.
- Global and engine-level pauses are handled consistently.
- **Improvements**
- Active-project Git maintenance is limited to an hourly cadence,
reducing unnecessary activity.
- Merge-metadata recovery is capped at 25 items per cycle for more
predictable processing.
- Database and filesystem housekeeping continues during pauses.
- **Documentation**
- Updated architecture and runtime documentation to describe pause-aware
maintenance behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Bumps [changesets/action](https://github.com/changesets/action) from 1
to 2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/changesets/action/releases">changesets/action's
releases</a>.</em></p>
<blockquote>
<h2>v2.0.0</h2>
<h3>Major Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/692">#692</a>
<a
href="cb3f0110d7"><code>cb3f011</code></a>
Thanks <a
href="https://github.com/Andarist"><code>@Andarist</code></a>! -
Release commits and tags are now pushed using the GitHub API by
default.</p>
<p>Replace the <code>commit-mode</code> input with the boolean
<code>push-with-git-cli</code> input. Set <code>push-with-git-cli:
true</code> to continue using the Git CLI.</p>
<p>Regardless of the push mode, custom GitHub tokens must be passed
explicitly through the <code>github-token</code> input. The
<code>GITHUB_TOKEN</code> environment variable and credentials
configured by <code>actions/checkout</code> or embedded in remote URLs
are not substitutes for this input. When the Git CLI is enabled,
<code>github-token</code> takes precedence over those repository
credentials.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/680">#680</a>
<a
href="ca57073900"><code>ca57073</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Add a new <code>push-git-tags</code> option that complements
<code>create-github-releases</code> to control specifically if git tags
should be created but not GitHub releases.</p>
<p>If <code>create-github-releases</code> was previously set to
<code>false</code>, which also indirectly disabled git tag creation, git
tags will now be created instead by default. If this is not desired, set
<code>push-git-tags</code> to <code>false</code> explicitly.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/657">#657</a>
<a
href="4f718b5921"><code>4f718b5</code></a>
Thanks <a
href="https://github.com/Andarist"><code>@Andarist</code></a>! -
Removed compatibility support for old Changesets v1.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/681">#681</a>
<a
href="73591071e6"><code>7359107</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Rename the root action inputs and outputs to better match the
sub-actions' conventions.</p>
<p>Inputs:</p>
<ul>
<li><code>version</code> -> <code>version-script</code></li>
<li><code>publish</code> -> <code>publish-script</code></li>
<li><code>commit</code> -> <code>commit-message</code></li>
<li><code>title</code> -> <code>pr-title</code></li>
<li><code>branch</code> -> <code>pr-base-branch</code></li>
</ul>
<p>Outputs:</p>
<ul>
<li><code>pull-request-number</code> -> <code>pr-number</code></li>
</ul>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/674">#674</a>
<a
href="164652bdd6"><code>164652b</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Remove support for passing custom GitHub token through the GITHUB_TOKEN
environment variable. It should be passed to the
<code>github-token</code> input instead.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/659">#659</a>
<a
href="5649ff41b8"><code>5649ff4</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Remove <code>cwd</code> option for <code>changesets/action</code>. Use
the step <code>working-directory</code> option instead to change the
directory.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/673">#673</a>
<a
href="823cf741ca"><code>823cf74</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Update to Changesets v3 packages</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/695">#695</a>
<a
href="469993ce57"><code>469993c</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Removed <code>.npmrc</code> handling when the <code>NPM_TOKEN</code>
environment variable is set.</p>
<p>Authentication should be handled via Trusted Publishing instead. If a
token is still needed, use <code>actions/setup-node</code> to set it up
instead via the <code>registry-url</code> option. Check out the updated
action README for more information of setting up npm authentication in
GitHub Actions.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/668">#668</a>
<a
href="0eae789230"><code>0eae789</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Rename the input and output names to kebab-case instead of camelCase to
match the official GitHub actions pattern</p>
</li>
</ul>
<h3>Minor Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/656">#656</a>
<a
href="a12d90de83"><code>a12d90d</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Add new <code>/select-mode</code>, <code>/version</code>, and
<code>/publish</code> sub-actions to better control version and publish
steps</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/678">#678</a>
<a
href="f71ae043ed"><code>f71ae04</code></a>
Thanks <a
href="https://github.com/Andarist"><code>@Andarist</code></a>! -
Published packages detection done through stdout parsing was replaced
with one based on the shared output file using
<code>CHANGESETS_OUTPUT</code> environment variable. When using custom
scripts this environment variable should always be passed down to the
Changesets CLI invocations.</p>
</li>
</ul>
<h3>Patch Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/changesets/action/pull/699">#699</a>
<a
href="5b307d3df2"><code>5b307d3</code></a>
Thanks <a
href="https://github.com/Andarist"><code>@Andarist</code></a>! -
Validate that projects use Changesets CLI v3 and direct Changesets CLI
v2 users to <code>changesets/action@v1</code>.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/changesets/action/blob/main/CHANGELOG.md">changesets/action's
changelog</a>.</em></p>
<blockquote>
<h1><code>@changesets/action</code></h1>
<h2>2.1.0</h2>
<h3>Minor Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/changesets/action/pull/718">#718</a>
<a
href="3b7c71c440"><code>3b7c71c</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Add a <code>cwd</code> input to the root action,
<code>/select-mode</code>, <code>/version</code>, <code>/pack</code>,
and <code>/publish</code> sub-actions to set the current working
directory to execute Changesets in. This input existed in v1 but was
incorrectly removed.</li>
</ul>
<h3>Patch Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/changesets/action/pull/716">#716</a>
<a
href="6f58ba3580"><code>6f58ba3</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Update <code>pr-status</code> message to link to the new faq page</li>
</ul>
<h2>2.0.0</h2>
<h3>Major Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/692">#692</a>
<a
href="cb3f0110d7"><code>cb3f011</code></a>
Thanks <a
href="https://github.com/Andarist"><code>@Andarist</code></a>! -
Release commits and tags are now pushed using the GitHub API by
default.</p>
<p>Replace the <code>commit-mode</code> input with the boolean
<code>push-with-git-cli</code> input. Set <code>push-with-git-cli:
true</code> to continue using the Git CLI.</p>
<p>Regardless of the push mode, custom GitHub tokens must be passed
explicitly through the <code>github-token</code> input. The
<code>GITHUB_TOKEN</code> environment variable and credentials
configured by <code>actions/checkout</code> or embedded in remote URLs
are not substitutes for this input. When the Git CLI is enabled,
<code>github-token</code> takes precedence over those repository
credentials.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/680">#680</a>
<a
href="ca57073900"><code>ca57073</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Add a new <code>push-git-tags</code> option that complements
<code>create-github-releases</code> to control specifically if git tags
should be created but not GitHub releases.</p>
<p>If <code>create-github-releases</code> was previously set to
<code>false</code>, which also indirectly disabled git tag creation, git
tags will now be created instead by default. If this is not desired, set
<code>push-git-tags</code> to <code>false</code> explicitly.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/657">#657</a>
<a
href="4f718b5921"><code>4f718b5</code></a>
Thanks <a
href="https://github.com/Andarist"><code>@Andarist</code></a>! -
Removed compatibility support for old Changesets v1.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/681">#681</a>
<a
href="73591071e6"><code>7359107</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Rename the root action inputs and outputs to better match the
sub-actions' conventions.</p>
<p>Inputs:</p>
<ul>
<li><code>version</code> -> <code>version-script</code></li>
<li><code>publish</code> -> <code>publish-script</code></li>
<li><code>commit</code> -> <code>commit-message</code></li>
<li><code>title</code> -> <code>pr-title</code></li>
<li><code>branch</code> -> <code>pr-base-branch</code></li>
</ul>
<p>Outputs:</p>
<ul>
<li><code>pull-request-number</code> -> <code>pr-number</code></li>
</ul>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/674">#674</a>
<a
href="164652bdd6"><code>164652b</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Remove support for passing custom GitHub token through the GITHUB_TOKEN
environment variable. It should be passed to the
<code>github-token</code> input instead.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/659">#659</a>
<a
href="5649ff41b8"><code>5649ff4</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Remove <code>cwd</code> option for <code>changesets/action</code>. Use
the step <code>working-directory</code> option instead to change the
directory.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/673">#673</a>
<a
href="823cf741ca"><code>823cf74</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Update to Changesets v3 packages</p>
</li>
<li>
<p><a
href="https://redirect.github.com/changesets/action/pull/695">#695</a>
<a
href="469993ce57"><code>469993c</code></a>
Thanks <a href="https://github.com/bluwy"><code>@bluwy</code></a>! -
Removed <code>.npmrc</code> handling when the <code>NPM_TOKEN</code>
environment variable is set.</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="198f833dd7"><code>198f833</code></a>
v2.1.0</li>
<li><a
href="7545547fe4"><code>7545547</code></a>
Version Packages (<a
href="https://redirect.github.com/changesets/action/issues/719">#719</a>)</li>
<li><a
href="3043070b0d"><code>3043070</code></a>
Prevent test warning annotations (<a
href="https://redirect.github.com/changesets/action/issues/720">#720</a>)</li>
<li><a
href="3b7c71c440"><code>3b7c71c</code></a>
Add back cwd input (<a
href="https://redirect.github.com/changesets/action/issues/718">#718</a>)</li>
<li><a
href="6f58ba3580"><code>6f58ba3</code></a>
Update pr-status message links to new faq (<a
href="https://redirect.github.com/changesets/action/issues/716">#716</a>)</li>
<li><a
href="e52ce9e59b"><code>e52ce9e</code></a>
Version Packages (<a
href="https://redirect.github.com/changesets/action/issues/715">#715</a>)</li>
<li><a
href="78fdc6bb2e"><code>78fdc6b</code></a>
Exit pre mode (<a
href="https://redirect.github.com/changesets/action/issues/714">#714</a>)</li>
<li><a
href="187a104ea0"><code>187a104</code></a>
Update deps for stable (<a
href="https://redirect.github.com/changesets/action/issues/709">#709</a>)</li>
<li><a
href="d11394aa52"><code>d11394a</code></a>
Version Packages (next) (<a
href="https://redirect.github.com/changesets/action/issues/712">#712</a>)</li>
<li><a
href="5fa67671df"><code>5fa6767</code></a>
Fix support for prerelease exits using the new
<code>.changeset/pre</code> layout (<a
href="https://redirect.github.com/changesets/action/issues/711">#711</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/changesets/action/compare/v1...v2">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## Summary
The dashboard settings quality lane is one of the slowest CI-run packs.
Most Scheduling cases remounted Authentication and clicked the sidebar
just to reach fields they already know by `initialSection`. That extra
render is also the flake surface that previously needed `findByRole`
after settings fetch.
This change opens the target section on first render, polls readiness at
5ms instead of 50ms, and names the 500ms auto-save debounce so
fake-timer flushes stay locked to product behavior. Persist assertions
are unchanged.
## Test plan
- [x] `pnpm --filter @fusion/dashboard exec vitest run --project
dashboard-app-quality-settings --silent=passed-only --reporter=dot
--exclude '**/build-output.test.ts'` — 330 passed
- [ ] Confirm the settings quality lane still runs in `full-suite.yml`
shard packing (`pnpm --filter @fusion/dashboard run
test:quality:app:settings`)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Improvements**
* Improved consistency and reliability of settings autosave behavior.
* Streamlined scheduling settings validation to reduce timing-related
test flakiness.
* Improved settings readiness and persistence checks for more dependable
results.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
The in-review branch-rebind sweep unconditionally nulled task.worktree while
repairing a broken branch binding, making the checkout invisible to
scanIdleWorktrees' active set so the idle sweep reaped it — the reported
"worktree lost between review and in-progress" incident. The rebind now keeps
the pointer when the directory exists and is checked out on the rebound branch,
and the applied audit event records preservedWorktree.
Adds a reliability-lane certification suite pinning that worktree metadata and
the on-disk directory survive in-progress ↔ in-review transitions and
idle-in-review maintenance ticks, and that severed metadata is exactly what
makes a directory reap-eligible.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
**Problem:** Scheduler writes assumed a full missionStore contract
(getSlice/getMilestone), aborting/pre-resolving mission reconciliation
when a minimal store or a genuine missing mission was present.
**Fix:** Resolve a missing `missionId` best-effort through
`missionStore.getSlice`/getMilestone when available, and make
reconciliation non-blocking — a partial missionStore must not gate the
completion advance. Includes scheduler + pre.json rebase resolution over
the latest origin.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **New Features**
- Added Grok 4.6 to the model catalog.
- Added archive and restore views for mailbox messages and chat
conversations.
- Added manager evaluation tools for reviewing agents and follow-up
actions.
- Updated the bundled Pi runtime.
- **Bug Fixes**
- Improved Quick Add model searching and dropdown toggling.
- Refined Quick Add merger labels and spacing.
- Recommendations now appear only for completed tasks with valid
recommendations.
- Improved scheduler resilience during mission updates and
reconciliation.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com>
**Problem:** The FN-8953 pending-wedge-notification reconciliation
called getActiveNotificationService() unconditionally at its top (to
read the wedge settle window), even against a healthy/empty notification
service — leaving a narrow test wedge where the service getter was
expected never to be called.
**Fix:** Guard `reconcilePendingWedgeNotifications` so the wedge
settle-window read does not fire against a healthy/empty notification
service, closing the stub gap and making the reconciliation
side-effect-free when idle.
Co-authored-by: Fusion <noreply@runfusion.ai>
## Summary
- preserve the gridlock notification wall-clock cooldown across
transient detector clears
- add a regression test for clear-then-rediscover behavior during the
cooldown
- document the cooldown contract and add a patch changeset
## Test plan
- `corepack pnpm --filter @fusion/engine exec vitest run
src/__tests__/notifier.test.ts --project=engine-default
--reporter=verbose -t 'suppresses the same gridlock after a transient
resolution during cooldown'`
- `corepack pnpm --filter @fusion/engine typecheck`
- `corepack pnpm build`
- `corepack pnpm changeset status --output
/tmp/fusion-gridlock-changeset-status.json`
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Bug Fixes**
- Gridlock notifications now remain suppressed during the 15-minute
cooldown, even if the condition temporarily clears and reappears.
- Prevents repeated notifications caused by transient detector-state
changes.
- **Documentation**
- Updated gridlock notification behavior documentation to reflect the
persistent cooldown.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Preserve the quarantined plugin-runner coverage while recording the inconclusive reproduction campaign.
- Record two loaded-suite runs at each of 2, 6, and 8 workers.
- Keep all 82 plugin-runner tests, the ledger entry, and the default-lane exclusion through 2026-08-30.
- Clarify that opt-in strict checks do not block normal PR lanes.
Files changed:
.../test-failures/suite-only-flakes-observed-register.md | 13 ++++++++++++-
docs/testing.md | 3 +++
2 files changed, 15 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-9135
Fusion-Task-Lineage: 239425e5-7393-4b8a-a114-0a14f0065847
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Document the second sighting of the project-identity PostgreSQL timeout and hand off structural diagnosis.
- Record the sterile 27-worker reproduction against the integration SHA
- Preserve pass, failure, and skip counters for both PostgreSQL-directory runs
- Mark quarantine as policy-forbidden and assign root-cause follow-up to FN-9131
Files changed:
.../solutions/test-failures/suite-only-flakes-observed-register.md | 7 +++++++
1 file changed, 7 insertions(+)
Fusion-Task-Id: FN-9126
Fusion-Task-Lineage: 9e31b00f-268b-46fa-af7a-58973c93d8fc
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
createFnAgent now delegates to createResolvedAgentSession — deriving the CLI
runtime hint (cursor/claude/grok/omp/hermes), mock/test-mode forcing, and
session:runtime-resolved visibility — using a host-registered default
PluginRunner keyed by project root (published by InProcessRuntime at plugin
init). DefaultPiRuntime re-enters via a __rawPiSession marker so the seam's
own pi bridge cannot recurse, and the raw constructor survives as
createPiAgentSessionRaw for that bridge and pi-internal tests.
Mission and milestone/slice interviews additionally pass their request-scoped
pluginRunner through the seam and prompt via the engine promptWithFallback
dispatcher (plugin CLI runtime sessions have no session.prompt()). This fixes
"Configured model cursor-cli/auto ... was not found in the pi model registry"
in mission planning while chat on the same model worked, and closes the same
gap for every remaining bare createFnAgent lane.
Also updates the pi skill-filtering test that still asserted pre-FN-9114
allow-list narrowing; requested skill names are ensure-present since FN-9114.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Keep visible Planning Mode controls bound to the current turn during asynchronous refreshes.
- preserve active question and plan-review workspaces during same-session hydration
- submit from live session state and retain dirty answers across response identity changes
- add desktop and mobile regression coverage for deferred hydration and stale Stop polling
- document the ownership race and add a patch changeset
Files changed:
.changeset/fn-9117-planning-turn-ownership.md | 7 +
.../suite-only-flakes-observed-register.md | 24 ++++
.../dashboard/app/components/PlanningModeModal.tsx | 141 ++++++++++++---------
.../PlanningModeModal.planning-flow.test.tsx | 132 +++++++++++++++++++
.../PlanningModeModal.ui-interactions.test.tsx | 20 +++
5 files changed, 265 insertions(+), 59 deletions(-)
Fusion-Task-Id: FN-9117
Fusion-Task-Lineage: 18d63f63-b532-49eb-a6d1-241e31c5b2c7
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Measured wall times: gate 14.0s, boot smoke 20.4s (-6.3s), changed-only
pnpm test 17.5s; quarantine ledger 0. Shard-timing snapshot rebuilt
from today's CI shard artifacts (run 31929730933) plus a locally
measured full dashboard suite so dashboard lane weighting keeps its
per-file data. The trim shows: the former top-6 core PG offenders are
gone from the slowest-20 (sqlite-migrator 2m29s serial -> 20.4s;
SettingsModal.general off the table entirely). Caveat: the dashboard
rows come from the pre-trim analysis measurement, so entries like
SettingsModal.scheduling-merge (30.2s, now ~13s) are pessimistic until
the next dashboard re-measure.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One clean solo-lane sighting of the parametrized duplicate-response
reconciliation test (mobile row; the desktop row failed once earlier
under a contaminated concurrent run, recorded as context). Third
distinct flaky test in this suite plus one prior FN-8936 stabilization
— the AGENTS.md repeated-quarantine rule calls that a subsystem
product-race smell, so the product-path audit is filed as FN-9116
rather than stabilizing a fourth time.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Second root cause of the browser-back flake: the board is a lazy chunk
behind Suspense fallback={null} and waitForAppShell only proves the
header, so a synchronous getByText raced chunk resolution under
sharded-lane load (failure DOM showed a header-only page). The first
board lookup in both back-nav tests is now the async finder — the
correct wait mechanism, no widened timeouts. Complements the
once-queue purge fix; 3/3 solo runs green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Local e2e runs regenerated the fn-8602/fn-8607 baselines with small rendering
deltas and produced the FN-8806 task-title-stable-modal baselines that were
never checked in.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
check:changesets enforces a 120-char summary; this legacy entry was 133 and
failed the PR-check gate.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The FN-8923 drift guard was red on main: the fixture predated the FN-9047-9062
workspace wave and regeneration was blocked by 18 unclassified workspace
TaskStore methods. Classify the FN-9059 workspace coordination surface (lease
acquire/renew/release/reclaim/reconcile, land-intent record/resolve, fence-ref
recording, mergeWorkspaceWorktreeEntry, withValidWorkspaceLease as writers; the
inspect/list/find/validate reads as non-writers), regenerate the manifest, and
supply lifecycle verdicts for the 13 new call sites: lease/intent writes in the
land path are already-fenced by FN-9059 store-seam fence-token validation, the
land-failure note is benign-unfenced bookkeeping, and the remaining sites carry
their enclosing symbols' out-of-frontier verdicts. Also drops the deleted
diff-volume gate module from scannedModules.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
An SSE subscription with a nonexistent projectId (stale client tab, e2e fixture
page using projectId "fixture") surfaced the PG startup-factory construction
chain as a 500 on every poll, filling operator logs with alarming
"failed to construct TaskStore" errors. Map project-not-found to a clean 404,
matching the project routes' existing handling.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The gate blocked approved clean-room squashes on per-file shrinkage with no
override path ("AI merge diff-volume gate blocked the approved squash").
Removed by operator decision: delete checkDiffVolume/DiffVolumeRegressionError,
the merge:diff-volume-blocked audit event, the runDiffVolumeGate call sites in
every legacy squash finalizer, the AI-merge pre-land check, and the
mergeDiffVolume* settings. File scope remains the pre-land guard; the
post-squash audit policy remains the shrinkage backstop.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>