Commit Graph

9422 Commits

Author SHA1 Message Date
gsxdsm
7d312b416d docs: capture engine singleton-lock learning (EngineAlreadyRunningError != no engine)
Document the false "engine not running" banner root cause and fix as a
docs/solutions learning, and add an "Engine Singleton Lock" entry to
CONCEPTS.md: a failed per-machine lock acquisition is proof an engine is
running elsewhere, not "no engine."

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 03:15:22 -07:00
gsxdsm
7635ba8682 fix: report engine available when another fusion process owns it
The dashboard's engine-availability health check only counted engines
this process started. A second launch (e.g. `pnpm dev dashboard`
alongside an already-running `fusion`) is correctly refused the
per-machine engine singleton lock, so its engine map stays empty and
the dashboard showed a false "engine not running" banner even though an
engine was live on the machine.

ProjectEngineManager now records projects whose singleton lock is held
by another process (via EngineAlreadyRunningError) and exposes
hasRunningEngine(), which the health endpoint consults so the banner
reflects machine-level truth. Reconciliation still retries so this
process takes over if the other exits, and the "refusing to start" log
fires once per project instead of on every 30s reconciliation tick.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 03:09:35 -07:00
gsxdsm
4f9c4cf10d Merge pull request #1701 from Runfusion/gsxdsm/compound-improve
fix: show plugin-contributed skills in the workflow editor
2026-06-21 02:36:43 -07:00
gsxdsm
275e97edc1 Merge pull request #1699 from Runfusion/codex/start-engines-by-default
[codex] Start Fusion engines by default
2026-06-21 02:35:13 -07:00
gsxdsm
67e76e2b80 Address PR review feedback (#1701)
- Plugin skills now respect project-settings enable/disable toggles
  (discoverSkills consults getSkillSettingState, falling back to the
  plugin's declared default) so toggleExecutionSkill writes persist
- readSkillContent returns synthesized content for plugin-contributed
  skills (name + description + provenance) instead of a silent blank
  panel, since their path is a virtual runtime-materialized path

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 02:23:59 -07:00
gsxdsm
5de224e51e Merge pull request #1698 from Runfusion/gsxdsm/smaller-files
chore(ci): add file line-count guardrail to pretest
2026-06-21 02:23:47 -07:00
gsxdsm
222e781dc0 Merge pull request #1702 from vamsi-ship-it/fix/anthropic-compatible-custom-provider-api-key
fix(engine): map anthropic-compatible custom providers to anthropic-messages api
2026-06-21 02:23:11 -07:00
gsxdsm
a609c16a77 Merge pull request #1700 from Runfusion/perf/dashboard-test-project-dedup
perf(dashboard): de-duplicate overlapping vitest projects
2026-06-21 02:15:29 -07:00
gsxdsm
42a1346d6c fix: address engine startup review feedback 2026-06-21 02:15:24 -07:00
gsxdsm
46e52b2c23 Merge pull request #1697 from Runfusion/fix/engine-pause-resume-auto-continue
fix(engine): auto-continue agent session after engine-internal pause/resume abort
2026-06-21 02:14:18 -07:00
gsxdsm
91957d41c2 perf(dashboard): warn on empty deep-lane --project without the flag
Selecting a gated deep lane explicitly (`vitest run --project dashboard-app`
or `--project dashboard-api`) without FUSION_DASHBOARD_DEEP=1 matches zero
files and exits green in milliseconds — a silent no-op that reads as a passing
run. Emit a loud console.warn so a manual invocation isn't mistaken for
coverage. Exact token match avoids firing on the curated `dashboard-app-*`
shard projects; the deep scripts set the flag, so it never fires through the
intended entry points.

Argv parser validated against space/equals forms, both lanes, every curated
shard, and the default no-`--project` run (10/10).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 02:09:25 -07:00
gsxdsm
eafe6f7b28 Merge pull request #1696 from Runfusion/gsxdsm/ce-workflow-skill-loading
fix: make the compound-engineering workflow actually load skills and run the full CE flow
2026-06-21 02:04:17 -07:00
gsxdsm
adc8884219 Update packages/engine/src/executor.ts
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-06-21 02:03:27 -07:00
vamsi-ship-it
efd3743624 fix(review): address CodeRabbit feedback on anthropic-compatible fix
- Add JSDoc to resolveCustomProviderApiType (docstring coverage + AGENTS.md
  jsdoc convention) and convert the inline rationale to FNXC format.
- FNXC-format the test rationale comment.
- Strengthen the regression test per FN-5893 (fix the invariant, not the repro):
  - negative assertion that no provider is ever registered with the bare
    "anthropic" api key;
  - assert every api key passed to registerProvider is one pi-ai's registry
    actually registers, so a typo in any arm (not just anthropic) fails here.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 14:30:04 +05:30
vamsi-ship-it
5a422b0c46 fix(engine): map anthropic-compatible custom providers to anthropic-messages api
resolveCustomProviderApiType mapped the `anthropic-compatible` provider type
to the api key "anthropic", but pi-ai (@earendil-works/pi-ai) registers the
Anthropic Messages API under "anthropic-messages". Any custom provider
configured as anthropic-compatible selected a model whose `api` did not match
a registered provider, throwing "No API provider registered for api: anthropic"
at stream time (the model registered fine, but failed when a task tried to
stream).

The openai-responses and default (openai-completions) arms already map to real
registry keys and work; only the anthropic arm pointed at an unregistered key.

Extend the existing custom-provider registration test (which covered
openai-compatible and openai-responses but not anthropic-compatible) with a
regression assertion that anthropic-compatible maps to "anthropic-messages".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:52:47 +05:30
gsxdsm
0422b43672 Merge pull request #1666 from Runfusion/feat/validator-behavioral-verification
feat: behavioral verification in the Validator
2026-06-21 00:52:04 -07:00
gsxdsm
92bd060b9b Address PR review feedback (#1697)
- Add fire-time safety guard tests: assert auto-continue aborts when the task
  becomes paused, user-paused, moved out of todo, or deleted during the backoff
  window (greptile P1 / coderabbit) — previously the guard was untested.
- Split the user-pause/global-pause negative test into it.each so a failure
  names the offending case (greptile P2).
- Document that the exhausted-retry fallback leaves the shared graphResumeRetryCount
  budget at MAX and that it cross-drains with the transient-resume path (greptile P2).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:28:03 -07:00
gsxdsm
21f23c6acd Merge pull request #1621 from Runfusion/fix/dashboard-refresh-loop-pr
fix: stop dashboard refresh loops
2026-06-21 00:25:48 -07:00
gsxdsm
40cea655b8 Merge main into validator behavioral verification
Resolve conflicts from main's analytics schema additions (plugin
activations, per-model token buckets) against the PR's contract-assertion
type column:
- db.ts: renumber behavioral-verification migration 124 -> 126, bump
  SCHEMA_VERSION to 126 so it follows main's migrations 124/125
- core/roadmap tests: adopt main's SCHEMA_VERSION-constant assertions
  instead of stale literal 124
- test-quarantine.json: keep all four quarantine entries from both sides

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:22:19 -07:00
gsxdsm
7ddb3ef26e fix(review): changeset frontmatter, reload-marker ordering, cache bump
- Add required `---` frontmatter fences to the changeset so the
  changesets CLI picks it up during release (greptile P1).
- Mark the remote version as reloaded only when a reload actually
  proceeds, so a pre-existing RELOAD_FLAG no longer permanently
  suppresses future reloads for that version (greptile P2).
- Bump service-worker cache to v5 after merging main's v4 and update
  the pwa test assertions accordingly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:15:00 -07:00
gsxdsm
5364b62af7 Update packages/dashboard/app/versionCheck.ts
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-06-21 00:12:57 -07:00
gsxdsm
6e563b9579 fix: stop dashboard refresh loops 2026-06-21 00:12:57 -07:00
gsxdsm
d92b3257e4 perf(dashboard): de-duplicate overlapping vitest projects
The default `vitest run` (no --project) path — used by `pnpm test` via
test-changed's `vitest --changed` scoping — ran every dashboard test file in
up to 3 overlapping projects: the `dashboard-app-quality` umbrella, a curated
shard, and the broad `dashboard-app`/`dashboard-api` lanes. A scoped run
selected 1899 executions for 829 unique files (2.3x redundant work).

- Remove the dead `dashboard-app-quality` umbrella project: it re-ran the exact
  union of its eight curated shards. It is absent from test-inventory-spec.json,
  dashboardQualityProjectGlobs, and every script; package-config's contract test
  already asserts test:deep must not use it.
- Gate the broad `dashboard-app`/`dashboard-api` includes behind
  FUSION_DASHBOARD_DEEP so they are empty in the default run (no longer
  duplicating the curated shards + backfill) but remain selectable via
  --project. The explicit deep escape hatches (test:deep/test:app/test:api/
  test:build) set the flag to opt back in.

Default scoped run now selects 829 executions for 829 files (1x). Verified:
curated-gate inventory guard intact (828 files, 829 executed, 1 skip-listed),
package-config contract test green (31/31), build-output.test.ts still
reachable via test:build, deep hatch repopulates with the flag.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:10:58 -07:00
gsxdsm
7235b25fb8 Address PR review feedback (#1696)
- step() test helper now carries skillName, so the WS-6 round-trip fixture
  actually exercises the INVERSION CONTRACT for skillName (was silently dropped).
- executeWorkflowStep now strips an inherited FUSION_HEADLESS on board runs
  (unattended=false), preserving the U3 default-safe invariant — a board step
  nested under a headless-env parent could otherwise skip user questions.
  Added a regression test for the inherited-env strip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:07:20 -07:00
gsxdsm
b7182da349 Address PR review feedback (#1698)
- Import URL from node:url to clear ESLint no-undef (coderabbit)
- Throw on unreadable tracked files instead of silently skipping, so a
  file can't evade the cap and false-pass (coderabbit)
- Emit the "baseline can be tightened" note for deleted-only stale entries
  too, with a correct count (greptile)
- Add FNXC:CI comments to the guard and its test per AGENTS.md (greptile)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:05:41 -07:00
gsxdsm
91017050d4 fix: show plugin-contributed skills in the workflow editor
The dashboard's discovered-skills catalog was built only from the
disk-scanning package manager, so plugin-contributed skills (e.g.
compound-engineering ce-*) — which the engine materializes for executor
sessions separately — never appeared in the editor. Built-in workflow
nodes that reference them (builtin:compound-engineering) showed
"— select skill —" / unresolved.

- skills-adapter: merge plugin skill contributions into the discovered
  list (deduped by bare name) via an optional getPluginSkills thunk;
  add shared bareSkillName normalizer.
- wire getPluginSkills into all three server entry points: serve,
  daemon, and dashboard (the UI-serving command — verified via live
  end-to-end that omitting it left the editor catalog empty).
- node-summary + WorkflowNodeEditor: resolve namespaced skillNames
  (compound-engineering:ce-work) against the catalog's two-segment
  names (ce-work/SKILL.md) so nodes display and select the right skill.

Verified: dashboard + CLI typecheck, 136 dashboard tests, and a live
dashboard E2E (discovered skills 0→11; Plan node resolves to "ce-plan"
in both the canvas label and the inspector dropdown).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 00:05:03 -07:00
gsxdsm
2d6ba99caf chore(ci): add file line-count guardrail to pretest
Add a pretest guard that caps new source files at 2,000 lines to stop
god-files from being born, following the existing check-no-* guard pattern.

Existing oversized files (106 of them) are grandfathered via a ratchet
baseline (scripts/line-count-baseline.json): each is pinned to its current
line count and may shrink but never grow. Files refactored under the cap
drop out of the baseline and cannot regress. Generated, lock, locale, and
.d.ts files are out of scope via the source-extension filter.

Wired into pretest and pretest:full; covered by 11 unit tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 23:57:59 -07:00
gsxdsm
7ef381762a feat: start engines by default 2026-06-20 23:57:37 -07:00
gsxdsm
c8a82e795b fix(engine): auto-continue agent session after engine-internal pause/resume abort
When the engine hard-cancels in-flight work during a pause/resume cycle and the
workflow graph run ends with the task re-queued to `todo`, the executor used to
leave it for a fresh scheduler dispatch and fire a spurious failure
notification. It now continues the agent session in place via a bounded internal
retry (reusing the graph-resume retry budget + backoff), falling back to the
benign todo re-queue only after retries are exhausted.

- Scoped strictly to engine-internal aborts via a typed `isEngineInternalAbort`
  discriminant; genuine user/global/task pauses are never auto-resumed.
- Re-checks the task at retry fire time and aborts the auto-continue if it was
  paused, moved, or deleted during the backoff window.
- Clears any stale `failed` status and emits an `Auto-recovered:` log so the
  deferred failure notification is suppressed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 23:49:57 -07:00
gsxdsm
0a04feec93 FN-6825: combine workflow actions in switcher
Move workflow edit and creation actions into the shared workflow switcher dropdown.

- Add inline edit buttons for workflow options and a persistent New workflow footer action.
- Remove separate board and list workflow toolbar icon buttons while preserving header portal behavior.
- Update workflow switcher styling, translations, docs, and regression coverage for board/list surfaces.

Files changed:
 docs/dashboard-guide.md                            |  8 +--
 packages/dashboard/app/App.tsx                     |  1 +
 packages/dashboard/app/components/Board.tsx        | 52 ++++----------
 packages/dashboard/app/components/Lane.css         |  4 --
 packages/dashboard/app/components/ListView.tsx     | 44 +++++-------
 .../dashboard/app/components/WorkflowSwitcher.css  | 60 +++++++++++++---
 .../dashboard/app/components/WorkflowSwitcher.tsx  | 80 +++++++++++++++++----
 .../app/components/__tests__/Board.test.tsx        | 62 +++++++++-------
 .../app/components/__tests__/ListView.test.tsx     | 27 +++++--
 .../components/__tests__/WorkflowSwitcher.test.tsx | 84 ++++++++++++++++++++++
 packages/i18n/locales/en/app.json                  |  4 +-
 packages/i18n/locales/es/app.json                  |  4 +-
 packages/i18n/locales/fr/app.json                  |  4 +-
 packages/i18n/locales/ko/app.json                  |  4 +-
 packages/i18n/locales/zh-CN/app.json               |  4 +-
 packages/i18n/locales/zh-TW/app.json               |  4 +-
 16 files changed, 314 insertions(+), 132 deletions(-)

Fusion-Task-Id: FN-6825
Fusion-Task-Lineage: 87754918-a695-4e4e-bba5-833e74f7f92f
2026-06-20 23:43:13 -07:00
gsxdsm
a768d36dae FN-6817: root reliability fixtures under worker temp
Reliability interaction fixtures now stay inside the Vitest worker temp root to avoid merge-reuse worktree collisions.

- Add a helper that prefers FUSION_TEST_WORKER_ROOT for reliability fixture roots.
- Verify fixture git initialization before tests use generated repositories.
- Clean up the paired worktree root during fixture teardown.
- Cover the worker-root placement and worktree-root cleanup behavior in the merge runner preflight test.

Files changed:
 .../__tests__/reliability-interactions/_helpers.ts | 21 ++++++++++++-
 .../merge-runner-spawn-enoent-prevention.test.ts   | 35 ++++++++++++++++++++--
 2 files changed, 53 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6817

Fusion-Task-Lineage: dd5c5e7b-c7cd-42be-971d-7527c2334f36
2026-06-20 23:32:25 -07:00
gsxdsm
5d3f63e875 FN-6818: keep Activity line markers circular
Use uniform SVG scaling so Command Center Activity line charts preserve proportional geometry.\n\n- Switch the shared hand-rolled LineChart from non-uniform stretching to centered uniform scaling.\n- Cover marker distortion invariants in chart and Activity area tests.\n- Document the Activity chart rendering invariant for desktop and mobile layouts.\n\nFiles changed:\n docs/dashboard-guide.md                            |  1 +\n .../command-center/__tests__/charts.test.tsx       | 22 ++++++++++++++++++++++\n .../command-center/areas/__tests__/areas.test.tsx  | 12 ++++++++++++\n .../components/command-center/charts/LineChart.tsx |  5 ++++-\n .../components/command-center/charts/charts.css    |  3 +++\n 5 files changed, 42 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6818

Fusion-Task-Lineage: 304dc64b-688d-42e4-ba7f-c7db16c49de9
2026-06-20 23:24:57 -07:00
gsxdsm
c0f330e70c fix(review): apply autofix feedback
Address confirmed code-review findings on the CE workflow-step change:
- Graph-path spawn lifecycle (adversarial A-1/A-2): the graph path returns from
  execute() before its outer finally that calls terminateAllChildren, so U8's new
  coding-mode fn_spawn_agent children orphaned their sessions/worktrees and their
  ids accumulated in the per-parent spawn budget, starving later steps' fan-out.
  Call terminateAllChildren in maybeExecuteWorkflowGraph's finally (mirrors the
  non-graph cleanup).
- INVERSION CONTRACT parity (api-contract AC-2 + testing TF-001): add skillName to
  the workflow-steps-to-ir round-trip projections + a skill-step fixture, so the
  contract the comment claims is actually asserted.
- Silent skill-load degradation (adversarial A-3 / Risk-4): warn when a step names
  a skill but FUSION_CE_SKILLS_DIR is unset, instead of failing silent.
- Dead branch (maintainability M-01): drop the always-false unattendedRun guard;
  keep the delete + extension-point comment.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 23:16:12 -07:00
gsxdsm
34b555f5d2 FN-6824: move workflow controls into header
Move workflow controls into the header when sidebar navigation is active.

- Add a Header portal slot that replaces the hidden view toggle under left sidebar navigation.
- Portal Board workflow selector, edit, and create controls into the Header slot with inline fallback.
- Portal List workflow selector and create controls into the Header slot without adding edit controls.
- Cover relocated and inline workflow control behavior for Board, Header, and List views.

Files changed:
 docs/dashboard-guide.md                            |   2 +
 packages/dashboard/app/App.tsx                     |   2 +
 packages/dashboard/app/components/Board.tsx        |  99 ++++++++++++-------
 packages/dashboard/app/components/Header.css       |  34 +++++++
 packages/dashboard/app/components/Header.tsx       |  11 +++
 packages/dashboard/app/components/ListView.tsx     |  25 ++++-
 .../app/components/__tests__/Board.test.tsx        |  77 +++++++++++++++
 .../app/components/__tests__/Header.test.tsx       |  21 ++++
 .../app/components/__tests__/ListView.test.tsx     | 109 +++++++++++++++++++++
 9 files changed, 342 insertions(+), 38 deletions(-)

Fusion-Task-Id: FN-6824

Fusion-Task-Lineage: 01611a6c-2894-4f19-a5f8-262609528f49
2026-06-20 23:02:52 -07:00
gsxdsm
56ea618d72 docs(plans): add compound-engineering workflow skill-loading plan
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 23:01:09 -07:00
gsxdsm
c8f97df34a test(engine): cover graph-step skill loading, preamble, spawn gating, headless, verdict (U6)
Two engine tests for the new compound-engineering workflow-step wiring:
- conventions: assert the exported preamble carries the await-input sentinel,
  FUSION_HEADLESS degrade, and path-confined persona/systemPromptOverride fan-out.
- executor: drive runGraphCustomNode + executeWorkflowStep and assert skillName is
  carried onto the synthesized step, requestedSkillNames merges bare+namespaced with
  additionalSkillPaths=[FUSION_CE_SKILLS_DIR], fn_spawn_agent present only in coding,
  FUSION_HEADLESS only when unattended, and the verdict-JSON contract is required
  only for gate/skill-less steps (relaxed for non-gate skill steps).

Session layer is mocked (asserts engine-owned wiring, not a model run); a full
model-driven e2e remains a documented residual.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 23:00:18 -07:00
gsxdsm
18c212fbd6 feat(workflow): coding mode on plan/code-review/document CE nodes (U4/U7)
plan and code-review need coding so ce-plan/ce-code-review can fan out to their
persona subagents via fn_spawn_agent; document needs coding so ce-compound can
write docs/solutions. Test asserts the tool modes and that skillName is carried
onto the compiled steps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 22:49:48 -07:00
gsxdsm
b564ee006c feat(engine): load CE skills + spawn + conventions on the graph-step path (U8/U1/U2/U3/U9)
The builtin compound-engineering workflow runs via runGraphCustomNode, which
never loaded the named skill or threaded the plugin-injected runtime env, and
fn_spawn_agent was registered only in the main session. This wires the real seam:

- U8: thread injected FUSION_CE_* env into skill/model graph steps (shared
  buildInjectedRuntimeEnv helper); register createSpawnAgentTool for coding-mode
  skill steps (readonly still strips spawn).
- U1: merge the step's skillName (namespaced + bare) into requestedSkillNames and
  pass FUSION_CE_SKILLS_DIR as additionalSkillPaths so the bundled SKILL.md is
  discovered and selected.
- U2: prepend the Fusion workflow-step conventions preamble (await-input sentinel,
  FUSION_HEADLESS degrade, persona fan-out via systemPromptOverride).
- U3: explicit unattended opt-in sets FUSION_HEADLESS=1 (default-safe board run).
- U9: path-confined persona read documented in the preamble; accepted
  write-capability posture documented at the coding-mode tool registration.
- KTD-6: verdict-JSON contract required only for gate / skill-less steps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 22:47:39 -07:00
gsxdsm
e4f4f431c8 feat(workflow): carry skillName through the WorkflowStep round-trip (U1)
Add skillName to WorkflowStep and WorkflowStepInput, and round-trip it through
nodeToStepInput / stepInputToNode so a skill-executor node's skill is available
to the step session. Honors the compiler INVERSION CONTRACT (parity test).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 22:47:38 -07:00
gsxdsm
c4e0fe13d8 FN-6828: fix Goals card responsive layout
Improve the Goals view card layout so actions stay compact and tablet cards stack before cramped columns.

- Top-align goal cards and action controls to prevent stretched buttons on wide cards.
- Add a tablet breakpoint that stacks card content and linked mission controls before the layout clips.
- Cover the responsive CSS contract in GoalsView tests.

Files changed:
 packages/dashboard/app/components/GoalsView.css    | 35 ++++++++++++-
 .../app/components/__tests__/GoalsView.test.tsx    | 57 ++++++++++++++++++++++
 2 files changed, 91 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6828

Fusion-Task-Lineage: b460ebf2-5567-448e-814d-5f2eed99dcc9
2026-06-20 22:09:50 -07:00
gsxdsm
6f35c1464e FN-6809: fix dashboard nav CSS tokens
Align dashboard navigation styling and tests with defined spacing and status tokens.

- Replace undefined sidebar CSS tokens with defined dashboard values while preserving circular and todo-active styling.
- Update the mobile nav touch-target test to assert the tokenized 36px minimum height.
- Add FNXC comments documenting the token requirements behind the fixes.

Files changed:
 packages/dashboard/app/__tests__/mobile-nav-bar-css.test.ts |  3 ++-
 packages/dashboard/app/components/LeftSidebarNav.css        | 12 ++++++++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6809

Fusion-Task-Lineage: 43ddb9cb-5ead-4289-9254-6c0fa5c3af40
2026-06-20 22:02:47 -07:00
gsxdsm
2c1cff820b Merge pull request #1695 from Runfusion/fix/full-suite-engine-core-hang
fix(ci): raise shard watchdog floor to 15min to stop Full Suite false-kills
2026-06-20 22:01:03 -07:00
gsxdsm
9af9bf4fd9 docs(plans): add Full Suite engine/core watchdog-budget fix plan 2026-06-20 21:54:10 -07:00
gsxdsm
fdccca9d27 fix(review): apply autofix feedback
- Reformat shard-floor justification as an FNXC:TestInfrastructure comment
  (project-standards: AGENTS.md FNXC_LOG convention).
- Clarify that the shard and dashboard-lane 15min floors are not coupled and
  may diverge (maintainability: avoid implying an unenforced contract).
- Add a regression-guard test pinning shard.floor=15min and asserting a 525s
  derived budget clamps up to the floor, so an accidental revert to the old
  5min floor fails loudly (correctness + testing + project-standards).
2026-06-20 21:53:31 -07:00
gsxdsm
74e056ed99 fix(ci): raise shard watchdog floor to 15min to stop false-kills
The Full Suite (non-blocking) workflow has been red for 30+ runs on main.
Diagnosis: the @fusion/engine [1/2], [2/2] and @fusion/core [2/2] shard
slices were SIGKILLed at their watchdog budgets (405s/405s/338s), not because
they hang but because those budgets are too tight for current wall-clock.

Local baselines (this machine, all pass, exit 0):
  - engine [2/2]: 145s wall / 309 files
  - core   [2/2]: 283s wall / 172 files  (old budget was only 338s!)

deriveBudgetMs tightens the budget to expected*3.5 whenever the committed
scripts/test-timings.json is <30d old. The snapshot (2026-06-03) undercounts
the import- and real-git-subprocess overhead of these heavy slices, so the
'fresh' snapshot produced a too-tight, false-kill budget on slower CI runners
-- the exact failure mode the floor/ceiling band exists to prevent.

Fix (plan KTD-2): raise the shard band floor 5min -> 15min so the heaviest
slices can't be tightened into a false-kill, while a true hang is still bounded
far under the job's 60min ceiling. Mirrors the dashboard-lane heavy-lane floor.
Follow-up: refresh scripts/test-timings.json from a default-branch CI run.
2026-06-20 21:48:14 -07:00
gsxdsm
37c4cfa56e FN-6808: handle AI CLI probe spawn failures
Resolve synchronous AI CLI probe launch failures as unavailable auth states.

- Catch synchronous spawn failures in Claude and Droid probe helpers so fire-and-forget validation paths do not reject.
- Return unavailable/unauthenticated sentinels for Droid model discovery and CLI presence/auth checks.
- Add regression coverage for Claude and Droid presence/auth probes plus a patch changeset.

Files changed:
 .../fn-6808-cli-probe-unhandled-rejection.md       |  5 ++++
 .../src/__tests__/process-manager.test.ts          | 25 ++++++++++++++++++++
 .../src/__tests__/process-manager.test.ts          | 25 ++++++++++++++++++++
 packages/pi-claude-cli/src/process-manager.ts      | 12 +++++++++-
 .../src/process-manager.ts                         | 27 +++++++++++++++++++---
 5 files changed, 90 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6808

Fusion-Task-Lineage: 79702ef2-e116-4313-a557-da17a6888c30
2026-06-20 21:32:43 -07:00
gsxdsm
185ff70d86 FN-6819: keep sidebar settings above footer
Keep the experimental left sidebar Settings control clear of the fixed executor footer while preserving readable project selector fallbacks.

- Share the executor footer visibility state with the left sidebar and project content.
- Reserve executor-footer height on the sidebar when the status footer is visible so Settings stays clickable in expanded and collapsed modes.
- Add project-selector translation fallbacks for incomplete locale fixtures.
- Cover footer-clearance behavior in left sidebar tests and add a patch changeset.

Files changed:
 .changeset/fn-6819-sidebar-footer-clearance.md     |  5 +++
 packages/dashboard/app/App.tsx                     |  8 +++--
 .../dashboard/app/components/LeftSidebarNav.css    |  9 ++++++
 .../dashboard/app/components/LeftSidebarNav.tsx    |  4 ++-
 .../dashboard/app/components/ProjectSelector.css   |  2 +-
 .../dashboard/app/components/ProjectSelector.tsx   | 11 +++++--
 .../components/__tests__/LeftSidebarNav.test.tsx   | 36 ++++++++++++++++++++++
 7 files changed, 67 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-6819

Fusion-Task-Lineage: 950da852-8dcf-4379-a91b-0188b12d1a6c
2026-06-20 21:23:17 -07:00
gsxdsm
3c6db08270 FN-6805: color workflow counts by column
Align workflow switcher status count badges with their board column colors.

- Map Todo, In Progress, and Done workflow count badge text to the matching board column CSS tokens.
- Cover the badge color contract with a CSS fixture regression test.
- Document the color-token behavior for board and list workflow dropdown counts.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/WorkflowSwitcher.css  | 10 +++++++---
 .../components/__tests__/WorkflowSwitcher.test.tsx | 22 ++++++++++++++++++++++
 3 files changed, 30 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6805

Fusion-Task-Lineage: aab7140c-ad37-4bd8-b73d-199534285b37
2026-06-20 21:16:16 -07:00
gsxdsm
c766bc9c95 FN-6811: keep terminal symbols out of xterm metrics
Keep terminal symbol fonts scoped away from xterm's measured text stacks across modal and session surfaces.

- add a scoped symbols @font-face to the session terminal CSS chunk
- defensively strip the symbols font from resolved xterm font-family presets
- expand modal, session, and CSS regression tests for symbols-free measurement and scoped glyph fallback
- document recurrence #6 and the remaining real-device iOS Safari verification gap

Files changed:
 .../xterm-symbols-nerd-font-unicode-range.md       | 13 ++++--
 .../dashboard/app/__tests__/terminal-input.test.ts | 51 ++++++++++++++++++----
 .../dashboard/app/components/SessionTerminal.css   | 11 +++++
 .../dashboard/app/components/TerminalModal.css     |  3 ++
 .../components/__tests__/SessionTerminal.test.tsx  |  3 ++
 .../components/__tests__/TerminalModal.test.tsx    | 47 ++++++++++++++++++--
 .../dashboard/app/utils/terminalPreferences.ts     | 17 ++++++--
 7 files changed, 127 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-6811

Fusion-Task-Lineage: 15a6fc1f-34c6-44d4-b9ea-8b5b3baae267
2026-06-20 21:02:51 -07:00
gsxdsm
5d9162e138 FN-6806: show workflow counts only when expanded
Keep workflow dropdown triggers compact until the menu opens.

- Hide Todo, In Progress, and Done count badges from the collapsed workflow switcher trigger.
- Preserve active-workflow and option counts while the dropdown is expanded for comparison.
- Update Board, List, switcher tests, and dashboard docs for the expanded-only count behavior.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/WorkflowSwitcher.tsx  |  8 +++--
 .../app/components/__tests__/Board.test.tsx        |  3 +-
 .../app/components/__tests__/ListView.test.tsx     |  5 ++-
 .../components/__tests__/WorkflowSwitcher.test.tsx | 36 +++++++++++++++++-----
 5 files changed, 41 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-6806

Fusion-Task-Lineage: a3c2db33-fe08-4207-9aae-548b292d98bd
2026-06-20 20:36:18 -07:00