The double hex is still live on 14 of 17 apps
The companion singleton fix shipped in nc-vue 2.7.0. Measured on the running instance this morning:
| page |
nc-vue |
.cn-ai-floating-button |
result |
/apps/openconnector/ |
2.7.1 |
1 |
hermiq's standalone stood down correctly |
/apps/openbuild/ |
2.6.3 |
2, both visible at 52×60, offset 8 px |
the reported double hex |
The two on the openbuild page are not duplicates of one mount — they are two different mounts:
button.cn-ai-floating-button → div.cn-ai-companion → div#content-vue.app-openbuild ← host app's bundle
button.cn-ai-floating-button → div.cn-ai-companion → div#hermiq-companion-root ← hermiq's init script
window.__cnAiCompanionPrimary was claimed, and both still rendered display:flex / visibility:visible / opacity:1 long past the 1200 ms LEGACY_SIBLING_DELAY. So the negotiation works between two 2.7.x instances and fails when the host app's copy predates it.
Who is affected — read from development, not from local checkouts
package-lock.json on development:
| version |
apps |
| 2.3.0 |
opencatalogi, docudesk, pipelinq, decidesk, nldesign, larpingapp, softwarecatalog, procest, shillinq, doriath, launchpad, scholiq |
| 2.4.0 |
portaliq |
| 2.6.3 |
openbuild |
| ≥ 2.7.0 |
openregister (2.8.0), openconnector (2.8.0), hermiq (2.7.0) |
14 apps below 2.7.0. The caret ranges (^2.3.0) already permit 2.8.0 — as with hydra-gates, it is the lockfile doing the pinning, not the constraint.
⚠️ The npm vue3 dist-tag still points at 2.3.0 while latest is 2.8.0, which makes 2.3.0 look deliberate. It is not a compatibility boundary: npm view shows the two releases declare identical peer dependencies, vue: ^3.5.0 included. The tag is simply stale and worth moving or retiring.
Validated, not assumed
On a clean clone of openbuild@development:
npm install @conduction/nextcloud-vue@2.8.0 → exit 0, lock 2.6.3 → 2.8.0
npm run build → exit 0 (webpack, 3 warnings, no errors)
grep __cnAiCompanionPrimary js/ → present in openbuild-main.js and openbuild-builder.js
So the bump installs, compiles, and ships the guard.
Why this is filed rather than merged
Bumping a UI library five minor versions across 14 apps is a visible change, and the only gate is each app's own e2e suite. That is a fleet-wide UI decision, not a lockfile bump, so it should not land unattended overnight.
The recipe is ready and can be executed per-app on approval — same shape as the hydra-gates v1.8.1 rollout that landed this morning.
The double hex is still live on 14 of 17 apps
The companion singleton fix shipped in nc-vue 2.7.0. Measured on the running instance this morning:
.cn-ai-floating-button/apps/openconnector//apps/openbuild/The two on the openbuild page are not duplicates of one mount — they are two different mounts:
window.__cnAiCompanionPrimarywas claimed, and both still rendereddisplay:flex / visibility:visible / opacity:1long past the 1200 msLEGACY_SIBLING_DELAY. So the negotiation works between two 2.7.x instances and fails when the host app's copy predates it.Who is affected — read from
development, not from local checkoutspackage-lock.jsonondevelopment:14 apps below 2.7.0. The caret ranges (
^2.3.0) already permit 2.8.0 — as with hydra-gates, it is the lockfile doing the pinning, not the constraint.vue3dist-tag still points at 2.3.0 whilelatestis 2.8.0, which makes 2.3.0 look deliberate. It is not a compatibility boundary:npm viewshows the two releases declare identical peer dependencies,vue: ^3.5.0included. The tag is simply stale and worth moving or retiring.Validated, not assumed
On a clean clone of openbuild@development:
So the bump installs, compiles, and ships the guard.
Why this is filed rather than merged
Bumping a UI library five minor versions across 14 apps is a visible change, and the only gate is each app's own e2e suite. That is a fleet-wide UI decision, not a lockfile bump, so it should not land unattended overnight.
The recipe is ready and can be executed per-app on approval — same shape as the hydra-gates v1.8.1 rollout that landed this morning.