148 Commits

Author SHA1 Message Date
claude1 5f43cd604b Merge pull request '[session 1] docs(feedback): #19 scoping is live in 1.3.1 — scope by reporter domain, not the MSP own key' (#70) from docs/19-scoping-shipped into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-26 19:50:30 -04:00
johannes 96c93c1509 docs(feedback): #19 scoping is LIVE in 1.3.1 — and scope by reporter DOMAIN, not the MSP's own key
Replaces the 'not in production' note now that 1.3.1 shipped.

Written as a do-NOT-reinvent, because the wrong design is the obvious one and was nearly shipped:
stamping the MSP's own institution key only works when that key is in the MSP's own granted list. True
for QDS in prod, FALSE on bcos.dev (msp1.bcos.dev -> msp1-bcos-dev, not granted, so absent from the
JWT). It depended on a data convention; the reporter's email domain is intrinsic to the row.

Also records: list and getScoped must stay in step via visibleTo(); every id-taking path is scoped;
out-of-tenant reads are 404 not 403; LIKE wildcards escaped because the domain is a JWT claim; the three
fail-closed directions incl. the hiveops-incident fail-open precedent; the backfill endpoint; and the
prod numbers on the day (49/50 attributed, QDS sees 47).
2026-07-26 19:50:29 -04:00
hiveiq 1bf200ffdd Merge pull request '[session 1] docs: feedback 1.3.0 board + endpoints, incident #347 lazy-proxy trap' (#69) from docs/feedback-130-and-incident-347 into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-26 10:51:29 -04:00
johannes 60d513b861 docs: feedback 1.3.0 board + endpoints, and the incident #347 lazy-proxy trap
technical.feedback:
- status-counts + capabilities endpoints; status param is repeatable (the board sends a lane)
- new 'Triage board lanes' section with the status->lane mapping and the two rules that must survive
  edits: every status belongs to exactly one lane (a status in no lane is an invisible row), and
  RELOCATED is WIP not Done (19 of 50 prod rows, so it matters)
- corrected the permitAll list: /h2-console/** is no longer in the shared chain (#7/#42), it lives in
  a @Profile(dev) chain and frameOptions is back to DENY. Verified 401 on prod
- gotchas: the XFF rate-limit trap (#5), label-resolution failures now warnings (#14), and the Svelte
  $: reactive-timing trap that a build cannot catch
- recorded that tenant scoping (#19) is NOT in prod and why it was held back

incident.incident-management (claude):
- corrected a stale line: mode resolves from the institution KEY, not the name (#290)
- documented #347 as a do-NOT-simplify: assertWritable must use a scalar query, never
  incident.getAtm().getInstitutionKey(). Includes why it failed for BCOS_ADMIN only (resolveScope()
  returns null for unscoped callers, so verifyIncidentAccess never initialised the proxy), that the
  pattern sits at 5 call sites, and that open-in-view comes from Spring Cloud Config so it must not
  be relied on.

coverage-reconcile: 132 modules, no gaps.
2026-07-26 10:51:28 -04:00
hiveiq aa7345e968 Merge pull request '[session 2] docs(deployment): config drift — the check exists, and prod's had never run' (#68) from docs/config-drift-detection into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Successful in 59s
2026-07-26 10:04:24 -04:00
hiveiq 0e716a6627 docs(deployment): config drift — the check exists, and prod's had never run
Prod config drifted unnoticed for 6 days because hiveiq-openmetal-prod had
has_actions=false, so config-drift.yml never executed. Documents the check,
how to run it correctly, what it caught, and the gaps it does not cover.
2026-07-26 10:03:12 -04:00
hiveiq ab02c310da Merge pull request '[session 2] docs(agent-proxy): agent token validation resilience (#30, #46, #48)' (#67) from docs/agent-proxy-auth-resilience into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Successful in 5m36s
2026-07-26 07:52:18 -04:00
hiveiq 7c23aceadb docs(agent-proxy): agent token validation resilience (#30, #46, #48)
Documents why AgentTokenValidationService has the shape it does, so the next
person does not simplify it back into the outage.

- three outcomes (VALID/INVALID/UNAVAILABLE) and what is cacheable
- the two caches and the bounded fail-open window
- connect/read timeouts and the circuit breaker, and why each is needed
- the revocation-lag trade-off and both kill switches
- full config table
- how to test it, including the false-pass trap that a reused token creates
2026-07-25 18:05:51 -04:00
hiveiq 540e30a77d Merge pull request '[session 1] docs(inbox): reply + contact groups + recipient scoping' (#66) from docs/inbox-contact-groups into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-25 08:09:41 -04:00
johannes 850dfd4f69 docs(inbox): reply + Direct/Institution/Broadcast compose, personal contact groups, recipient scoping
Reflects the 2026-07-25 prod release (profile 1.1.1, messaging 1.0.2, auth 1.2.2, mgmt 1.1.2).
2026-07-25 08:09:21 -04:00
hiveiq 91f15710fa Merge pull request '[session 2] docs(fleet): UPDATE_AGENT must be fleet-hosted, never import-cdn' (#65) from fix/update-agent-fleet-hosted-artifact into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-25 07:34:38 -04:00
johannes a70d83f730 docs(fleet): UPDATE_AGENT must be fleet-hosted, never import-cdn
A CDN-imported UPDATE_AGENT artifact 410s on the agent's chunk download
(ProcessJarUpdate has no CDN path), so every task fails instantly (agent#90).
Make the fleet-hosted-vs-CDN rule explicit in fleet.artifacts Claude tab and
the agent-release process, and note that a COMPLETED task 404s so rollouts
must be verified via /atms agentVersion, not task status.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 07:32:57 -04:00
hiveiq eeefaf29ac [session 1] docs(feedback): attachments (#54) + resolve-from-relocated (#49) (#64)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-24 13:26:17 -04:00
hiveiq c0489c8464 Merge pull request '[session 3] docs(journal): reparse verify recipe + admin external-path trap' (#63) from docs/journal-reparse-verify-path into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Successful in 1m1s
2026-07-24 11:27:51 -04:00
johannes 5bcbdb6a20 docs(journal): reparse-all verify recipe + admin external-path trap
Documents how to behaviourally verify a parser fix on prod (reparse-all by
atmId -> poll parse_status -> check rows), the worker-role recreate order, and
the nginx external-path gotcha (/journal/admin NOT /journal/api/journal/admin).
Notes reconcile after rolling worker recreate. Precedent: #47/#48 verified
2026-07-24.

Session: 3

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 11:25:50 -04:00
hiveiq 3ffa162914 Merge pull request '[session 3] docs(nginx-routing): mark bluegreen sed bug fixed (devops#61)' (#62) from docs/bluegreen-sed-fixed into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-24 08:55:41 -04:00
hiveiq 98f2b6b11d Merge pull request '[session 2] docs(journal): institution one-shot resolution + NULL re-resolve (#52)' (#61) from docs/journal-institution-reresolve into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-24 08:54:42 -04:00
johannes 8f591edc8b docs(nginx-routing): mark bluegreen sed bug fixed (devops#61)
Both deploy + rollback now parse the upstream from the map line and flip
only that line (address-scoped exact swap); the derived color table is
never touched. Note the failure was silent (standby healthy, traffic stays
on old container).

Session: 3

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 08:54:11 -04:00
johannes 166cb09317 docs(journal): document institution one-shot resolution + NULL re-resolve (#52)
Add a Gotchas section explaining that journal institution is resolved once
at parse time from atm_institution_map, that a NULL means the ATM was
unmapped then (agent uploaded before device provisioned), the scope
fail-open consequence, and the scheduled self-heal added in journal #52.
Cross-reference from the Overview routing bullet.

Session: 2
2026-07-24 08:44:32 -04:00
hiveiq 988f924356 Merge pull request '[session 3] docs(devices,mgmt): MSP_ADMIN scope resolved fresh from mgmt (#196)' (#60) from docs/institutions-scope-196 into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Successful in 1m4s
2026-07-24 08:42:56 -04:00
johannes 399601c222 docs(devices,mgmt): MSP_ADMIN scope resolved fresh from mgmt (#196)
Institution scope is no longer read only from the login-time JWT claim —
devices resolves it fresh from mgmt (source of truth) with fallback, and
mirrors new institutions. Documents the /api/internal/institutions endpoint
and the fresh-scope behaviour. Deployed to prod 2026-07-24.

Session: 3

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 07:52:55 -04:00
hiveiq 658340fa2e [session 2] docs(feedback): reporter notifications (#44) (#59)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-23 15:21:43 -04:00
hiveiq 27e79fdf13 Merge pull request '[session 3] docs(release): cd-main runs for reworked repos (not built by hand)' (#58) from docs/release-cd-main-reworked-repos into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-23 13:28:40 -04:00
johannes 8ddf4e4ab6 docs(release): cd-main runs for reworked repos (not built by hand)
processes.release said cd-main never runs and prod is always built by
hand. That is stale for the wave-1 cd-main rework (auth, mgmt, config,
journal, ai, remote, messaging, agent-proxy, incident), where cd-main
runs on merge to main and builds+pushes hiveiq-<svc>:<sha> (no deploy).
Split the microservice release into reworked (runs-on: ubuntu-latest,
CI builds) vs not-yet-reworked (runs-on: production, build by hand),
and note the Gitea run-status is unreliable so confirm via the registry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 13:26:51 -04:00
hiveiq c972a2c122 [session 2] docs(incident): notes/timeline read scopes by KEY not name (#290) (#57)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Successful in 1m46s
2026-07-23 11:42:45 -04:00
hiveiq 06308e0647 Merge pull request '[session 3] docs(guide): XFS hardware-events coverage — new agent.xfs module + topic (#102)' (#56) from feat/guide-xfs-hardware-events into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Successful in 57s
2026-07-23 11:17:33 -04:00
johannes ee94f94fa1 docs(guide): XFS hardware-events coverage (EPIC hiveops-agent#102)
New agent.xfs module (architect/internal/claude tabs) documenting native
CEN/XFS hardware monitoring via the 32-bit helper, framed built-on-develop
/ ships-dark / not-yet-enabled. Adds hiveops.hardware.events to the Kafka
topic catalog, and hardware-events pointers to technical.agent /
.devices / .incident / .agent-proxy overviews. coverage-reconcile green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 11:05:18 -04:00
hiveiq cf525d5f8f [session 2] docs(browser): technical.browser for 2.5.0 (#55)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Successful in 48s
2026-07-23 09:59:37 -04:00
hiveiq 9552abafed [session 2] docs(cash-stats): devices covers all cassette formats (#183) (#54)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Successful in 1m10s
2026-07-22 15:21:40 -04:00
hiveiq 8cce424b91 [session 1] docs(browser): GPU must run out-of-process (SwiftShader int3 crash, #97) (#53)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-22 13:11:15 -04:00
hiveiq 4fccd30122 [session 1] docs(guide): technical.aria ingest noise filter (aria#12) (#52)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-22 11:53:42 -04:00
hiveiq 33283b749b Merge pull request '[session 2] docs(platform.frontend-template): filter header does not recolor on active filters' (#51) from docs/filter-header-no-recolor into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-22 10:19:16 -04:00
johannes 9bfc996423 docs: correct — blue header lived only in the template, not incident
Incident binds bar-filters-active but its CSS is a no-op (#eef2f7 = the default
bar), so it never recolored. Devices/fleet never bound it. The blue #dbeafe was
the template's alone. No SPA sweep needed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 10:18:40 -04:00
johannes 0b0ca5145e docs(platform.frontend-template): filter header does not recolor on active filters
Records the template change: the Filters sidebar header no longer tints blue
when filters are active — the count pill + active-filter chips signal it. Aligns
with devices/fleet (which never recolored); the old behaviour was the outlier.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 10:17:10 -04:00
hiveiq d3e86d9e2c Merge pull request '[session 2] docs(processes.develop): Refs #N applies to commit subjects too' (#50) from docs/refs-in-commits into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-22 09:23:53 -04:00
johannes c6836bf5b3 docs(processes.develop): Refs #N applies to commit subjects too, not only PRs
Gitea scans commits merged to main for closing keywords, so a commit SUBJECT
like `fix(x): ... close ... (#N)` closes #N on release — even when the intent
was only to reference it. This bypasses the Verify Fix -> Tristan gate exactly
like a PR-body `Closes #N`.

Happened for real: hiveops-incident#329 (carried Verify Fix, assigned for QA)
auto-closed when the fix commit landed on main via the 1.1.7 release, because
the subject read `... + close IN_PROGRESS faults back in service (#328)`.

Extends step 10 and the Do NOT list to say the Refs #N rule covers commit
messages, and to keep close/fix/resolve away from any #ref. Cross-refs the
real incidents and hiveiq-ops/hiveiq-devops#58.

Refs hiveiq-ops/hiveiq-devops#58

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:22:20 -04:00
hiveiq 20034bb95a [session 1] docs(technical.agent): correct UPDATE_AGENT auto-restart note (4.5.x) (#49)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-22 09:09:58 -04:00
hiveiq 3ac2b4ff9e [session 1] docs(technical.agent): installCheck install-time network+credential check (#48)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-22 09:06:40 -04:00
hiveiq fb352c01d2 Merge pull request '[session 2] docs(platform.ci-cd): back-merge main into develop before cutting a release' (#46) from docs/backmerge-before-release into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Successful in 1m8s
2026-07-20 10:14:20 -04:00
johannes e4b894a848 docs(platform.ci-cd): back-merge main into develop before cutting a release
Hotfixes merged straight to `main` are not in `develop`. Nothing warns you
they have diverged; the bill arrives at the next release, as a conflict on
the prod branch.

hiveops-remote hit this on 2026-07-20: main had 5 commits develop had never
seen (OWASP suppressions, jackson-bom fix, jackson bump, cd-main rework,
sonar-pr removal) against develop's 9 including the hiveops-bom 1.0.2 -> 1.0.8
bumps. Both sides had fixed the SAME jackson/spring/tomcat CVEs by different
routes — main suppressed, develop bumped — so develop -> main conflicted in
pom.xml with main's hotfixes at risk of being clobbered.

Documents the two read-only probes (rev-list count, merge-tree exit code),
the back-merge-first ordering, and why resolving a divergence inside the
release PR is the wrong place for it.

Also records the second-order effect: hotfixes that bypass the develop PR
flow lose their issue paperwork. agent#62, bom#6 and devices#55/#60 all sat
open with a shipped fix, no Verify Fix label and no milestone.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 10:00:47 -04:00
hiveiq b5de1a1107 [session 1] docs: four operational traps (journal amounts, core.version pin, log levels, OOM ordering) (#45)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-19 13:14:11 -04:00
hiveiq 2f3435af32 [session 1] docs(processes.develop): explain [session N] in PR titles (#43)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-19 13:09:18 -04:00
hiveiq f745e5c5d6 [session 1] docs(platform.ci-cd): branch lifecycle — auto-delete vs protected develop (#42)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-19 12:43:40 -04:00
hiveiq 5db0c610d2 [session 1] docs(platform.repo-map): document compare-prod-dev.sh drift tool (#40)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-19 12:30:38 -04:00
hiveiq bab63404c8 [session 2] docs(guide): Command Center REBOOT flow + Hyosung applctrl gotcha (#38)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-19 09:38:34 -04:00
hiveiq c301242539 Merge pull request '[session 1] docs(technical.profile): stub Profile SPA module (deploy + default-landing + inbox-badge xref)' (#37) from docs/technical-profile into develop
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-18 11:29:21 -04:00
johannes 8960b03ec6 docs(technical.profile): stub Profile SPA module (frontend-only, deploy, default-landing)
Profile had no technical.* module. Documents: frontend-only SPA (hiveiq-profile-frontend
:5184, no backend/DB — composes auth/mgmt/messaging), PROFILE_VERSION sha-pinning +
single-instance recreate, the profile.bcos.cloud->www.bcos.cloud root-redirect red herring,
and that Profile is the sole is_default module (browser landing page). Inbox unread badge
cross-links [profile.inbox] rather than duplicating. Captured from the 2026-07-17 prod deploy.
2026-07-18 11:26:50 -04:00
hiveiq a8ccab8d7b [session 1] docs(guide): frontend-template Rules & Gotchas tab (#36)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-17 18:30:49 -04:00
hiveiq 97f5934d11 [session 1] docs(guide): technical.browser module (#35)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-17 18:17:54 -04:00
hiveiq 0af43b6f78 [session 1] docs(guide): platform.repo-map — where every repo lives (#34)
CD - Develop (guide → bcos.dev) / build-and-deploy (push) Has started running
2026-07-17 18:08:41 -04:00