Commit Graph
452 Commits
Author SHA1 Message Date
dependabot[bot] b97f90871f chore(deps): bump the actions group across 1 directory with 3 updates
Bumps the actions group with 3 updates in the / directory: [actions/setup-node](https://github.com/actions/setup-node), [anchore/sbom-action](https://github.com/anchore/sbom-action) and [actions/upload-artifact](https://github.com/actions/upload-artifact).


Updates `actions/setup-node` from 7.0.0 to 7.1.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/820762786026740c76f36085b0efc47a31fe5020...949feb2413d6458794dcd2491c4babbbce0c15c1)

Updates `anchore/sbom-action` from 0.24.2 to 0.24.3
- [Release notes](https://github.com/anchore/sbom-action/releases)
- [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md)
- [Commits](https://github.com/anchore/sbom-action/compare/3ad7283483fc7af8ff2b4ea19663c2d5ca935e26...66cbf4bc1f1c0d2edc94016e65bc221b6bb0ad6c)

Updates `actions/upload-artifact` from 7.0.1 to 7.0.2
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a...cf430e030ddbb5b0abf93d22962f4752f3646cd9)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: anchore/sbom-action
  dependency-version: 0.24.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-22 11:14:37 +00:00
hermes-gadget bec753b5e9 Merge fix: roll back public-feed flag when ACL reconcile fails (UKM-CODE-07)
Compensating write restores the previous enabled state when the broker ACL reload fails.
2026-10-21 01:28:02 +01:00
Hermes Agent a9ae4b0cee fix(owner): roll back public-feed flag when ACL reconcile fails
UKM-CODE-07: setEnabled committed before the broker ACL reload and the 503
path left the database changed. A failed disable therefore reported an error
while the broker still granted public-feed reads. Restore the previous flag
when reconcile throws, so the database matches the state the broker enforces.
2026-10-21 01:08:12 +01:00
hermes-gadget b414c58987 Merge fix: gate channel plaintext to public channels (UKM-C-02)
PUBLIC_CHANNELS remain public; env-supplied secrets require PUBLIC_DECRYPT_CHANNELS. Feed route 404s non-public names; packet detail strips confidential plaintext.
2026-10-21 01:01:46 +01:00
Hermes Agent 9c65605515 Merge remote-tracking branch 'origin/main' into fix/public-decrypt-channels
# Conflicts:
#	docker-compose.yml
2026-10-21 00:46:12 +01:00
Hermes Agent 9b77aac103 fix(security): gate channel plaintext to public channels
UKM-C-02: every key in MESHCORE_CHANNEL_SECRETS was publishable by name via
/feed/messages, and packet detail returned payload.decrypted for any hash.
Committed PUBLIC_CHANNELS remain public; env-supplied secrets are now
confidential unless their name is explicitly listed in
PUBLIC_DECRYPT_CHANNELS. The feed route 404s for non-public names, the
history query fails closed, and packet detail strips decrypted/_summary
unless the channel hash is public.
2026-10-21 00:45:29 +01:00
hermes-gadget 4895bb3c2d Merge fix: fail-closed owner authorization and ACL modes (UKM-CODE-13)
Defaults are now enforce/apply; shadow is explicit opt-in and warns at boot. CI smoke stack explicitly opts into shadow.
2026-10-21 00:40:15 +01:00
Hermes Agent 9094d900fb test(ci): opt the empty-volume smoke stack into shadow owner mode
The CI stack has no owner-auth database or ACL file; with enforce/apply now
the default, the backend health gate cannot pass there. Shadow is opt-in by
design, so the CI overlay says so explicitly. Production keeps enforce/apply.
2026-10-21 00:24:33 +01:00
Hermes Agent cecc6b0ff9 fix(owner): fail closed on authorization and ACL modes
UKM-CODE-13: owner authorization and ACL reconciliation defaulted to
shadow in code and compose, so a host without the production .env served
owner data from ACL-file identity and never applied the ACL cutover while
looking healthy. Default to enforce/apply, require an explicit shadow
opt-in, and log a single boot warning when shadow is selected.

Production already sets both explicitly, so behaviour is unchanged there.
2026-10-21 00:13:26 +01:00
hermes-gadget 866e5c7583 Merge fix: node_status_samples.status migration (061)
Adds the additive status column migration the reconciled backend requires; production applied it during the 2026-10-20 deployment.
2026-10-20 23:55:53 +01:00
Hermes Agent 9117ec5e62 chore(deps): refresh frontend lockfile for vite audit fix
npm audit began failing on GHSA-698v-4r3x-3vcv / GHSA-r825-w8mm-5pxw /
GHSA-587h-7wmj-h5pm (launch-editor, Windows-only dev server). npm audit fix
bumps the locked vite patch release; tests and build pass, 0 vulnerabilities.
2026-10-20 23:39:06 +01:00
Hermes Agent b9672524b2 fix(db): add node_status_samples.status migration
The reconciled backend reads the MQTT status envelope from this column.
It was deferred during reconciliation because live already used 057 for
region scope; renumber as 061 so fresh installs and the live schema match.
2026-10-20 23:22:41 +01:00
hermes-gadget 1ef0cf38a5 Merge reconciliation: deployed 2026-10-20 tree with main
Reconciles the live UKMesh production tree with main. Preserves deployed behaviour; incorporates contributor work; migrations 60/60; CI green. See PR #133.
2026-10-20 22:59:39 +01:00
Hermes Agent af2ec56b0c test(e2e): defer owner live-poll lifecycle spec
Same main-only owner cadence as the session-polling spec; the deployed
client is authoritative in Stage 1. Fourth and final deferred E2E item.
2026-10-20 13:18:55 +01:00
Hermes Agent e9ad13ebb7 test(e2e): defer main-only virtualiser and owner-polling specs
Stage 1 keeps the deployed implementation authoritative. The measured-row
feed virtualiser and /api/owner/session cadence are main-only changes that
the reconciliation deliberately did not adopt; the specs assert them, so
mark them fixme and record both as Stage 2 items in docs/deferred-tests.md.
2026-10-20 13:03:40 +01:00
Hermes Agent d2f24b7caf ci: use liveness for alert-receiver in the smoke stack
CI has no ALERT_FORWARD_URL, so the receiver reports archive-only mode as
not-ready on /readyz by design (503) and the stack never settles. Probe
/healthz in CI only; production keeps the strict delivery readiness gate.
2026-10-20 12:45:42 +01:00
Hermes Agent 663901257a ci: scale tagger-worker to zero in the smoke stack
The worker exits 2 when TYPESAFE_API_KEY is empty, which CI does not provide,
so restart:always turns it into a crash loop and 'up --wait' never settles.
Build the image (so the service is valid) but do not start it in CI.
2026-10-20 12:30:16 +01:00
Hermes Agent 75112d229e ci: build tagger-worker in the smoke stack
The reconciled compose starts tagger-worker (a production service) but the
CI build list predated it, so 'up --no-build' failed with 'No such image'.
Build it with the rest of the application images.
2026-10-20 12:26:26 +01:00
Hermes Agent ec59330618 fix(ram): keep tag columns in merged rows for SQL parity
The SQL projection returns tags/tag_confidence; RAM-merged rows omitted them,
so the F01/F05/F12/F13 parity suite failed once production's tag joins were
reconciled in. Carry nulls on the merged row and exclude both fields from the
overlay Object.assign so a pending row can never clobber committed tags.
2026-10-20 12:13:34 +01:00
Hermes Agent 8164fd43e2 chore(ci): allowlist reviewed MeshCore public-channel key
The recovery commit re-introduced the documented public channel constant in
backfill-region-names.mjs and rebuildRegionParticipation.ts. It is published
protocol material, not a credential; gitleaks now allows the exact string
while private channel material still enters only via MESHCORE_CHANNEL_SECRETS.
2026-10-20 12:04:59 +01:00
Hermes Agent 9fb5acc06e merge: reconcile deployed 2026-10-20 tree with origin/main
- Keeps every production behaviour from the deployed tree: public feed,
  owner packet sharing (including the Oct-12 publish/claim timeout fix),
  regions, privacy rematerialisation, RAM/durable ingest, owner last-hop
  prewarm.
- Takes main's additive work since the fork: ingest repair series, 1-byte
  path evidence, gitleaks ignore, dependabot pins, publicStatus,
  workloadPolicy and health diagnostics.
- Resolves 26 conflicts; per-file decisions recorded in the campaign
  DECISIONS.md and merge-proposal notes.
- Restores the two migrations missing from the deployed tree byte-exact
  (052_node_identity_packets_raw_columns, 055_message_tags) and defers
  main's unapplied 057 status-column migration to docs/deferred-migrations.
- Fresh-database bootstrap verified: base schema plus 60 migrations apply
  in order; a second run reports no pending migrations.
2026-10-20 11:59:02 +01:00
Hermes Agent 48fb91acda chore(recovery): capture deployed 2026-10-20 working tree
Exact snapshot of the tree that produced the running images (HEAD 1f94bd8)
including the 199 uncommitted/untracked production changes: regions, owner
packet sharing, public feed, RAM ingest, privacy rematerialisation, path-beta
updates, migrations 052-060, tests and deploy scripts.

Excluded: .env*/knowledge.md/.private-config (gitignored secrets); runtime
backup receipts restored to HEAD; mosquitto ACL/passwd are gitignored (kept
in the private pre-change snapshot). No functional changes.
2026-10-20 11:37:34 +01:00
hermes-gadget 2ef09ec6a9 Merge pull request #132 from gadgethd/fix/gitleaks-ignore-1d24322-public-channel-key
fix(ci): ignore reviewed MeshCore public-channel material (full-history gitleaks)
2026-10-17 04:27:07 +01:00
hermes-gadget 227b582a63 fix(ci): ignore reviewed MeshCore public-channel material in full-history scan
The full-history gitleaks scan flags the documented MeshCore public channel
key (publicly known 16-byte material; see MeshCore docs/companion_protocol.md)
at two files that exist only in history (deploy-sync commit 1d24322; both
files were later removed from main). Add the exact reviewed fingerprints to
.gitleaksignore, matching the existing channelRegistry precedent. No scan
scope, rule, or workflow changes; the local full-history scan reports no leaks.
2026-10-17 04:11:33 +01:00
hermes-gadget 3777cc9a2d Merge pull request #126 from gadgethd/fix/map-1byte-hop-evidence
fix(map): leave ambiguous 1-byte path hops unresolved instead of guessing
2026-10-14 02:14:59 +01:00
gadgethd 0a55c67fb5 fix(map): leave ambiguous 1-byte path hops unresolved instead of guessing
The default live-arc renderer resolved every path prefix against live nodes; a 1-byte prefix matches dozens of nodes, so DM chains (no sender anchor) and other 1-byte paths were drawn as confident guessed relays. A hop whose 2-hex-char prefix matches more than one node is now left unresolved; single-candidate 1-byte hops and multi-byte prefixes keep the nearest-candidate pick. Disclaimer copy updated to match; adds unit tests.
2026-10-14 00:58:31 +00:00
hermes-gadget e0a27dbebe Merge pull request #125 from gadgethd/experiment/ram-first-ingest-20261011
experiment(ingest): RAM-first MQTT ingestion + shared live data (stacked on #122)
2026-10-12 01:57:46 +01:00
hermes-gadget d3d7c2bff8 Merge pull request #122 from gadgethd/perf/mqtt-ingest-20261011
perf(ingest): bounded durable MQTT persistence and safe N=1 recovery
2026-10-12 01:37:29 +01:00
gadgethd ed8bb6a7e7 docs(ingest): finalize F01-F17 paired integrity and resource evidence 2026-10-11 23:44:53 +00:00
Codex c02aa32fd9 fix(ram): verify F09/F14 headroom and F15/F16 runtime recovery
Bound encoded quarantine and Redis recovery memory, verify actual principals, loaded metrics, held PostgreSQL SIGTERM and retention/drain rollback. Close F01 enrichment waits and preserve F13 decrypted/JSON summary contracts. All 479 backend tests, typecheck/build, 11 ingest integration and strict 5 operational gates pass.
2026-10-11 22:56:17 +00:00
gadgethd c683acdec8 fix(ingest): enforce F01 public batches and F05/F12/F13 read parity
Expose the F16 credentialed public source for revocable CoreScope projections; preserve stable identities, generation fences and bounded overlap paging.
2026-10-11 22:26:54 +00:00
gadgethd c98c2f53e2 docs: record verified F06-F08/F17 repair checkpoint 2026-10-11 21:47:08 +00:00
gadgethd 6ed4296e98 fix(ingest): close F06/F07 snapshot and historical handoff gaps 2026-10-11 21:27:25 +00:00
gadgethd e0bddc1d8b docs: hand off full Sol review repair state 2026-10-11 20:56:41 +00:00
gadgethd d1aa6ebb84 merge: carry perf handoff into RAM stack 2026-10-11 20:50:47 +00:00
gadgethd 8cace8e46f chore(ingest): preserve RAM review handoff materials 2026-10-11 20:50:44 +00:00
gadgethd 89680782c3 chore(ingest): preserve review handoff materials 2026-10-11 20:50:38 +00:00
gadgethd 07e6157ac8 docs: record final ingest repair and bench evidence 2026-10-11 20:45:07 +00:00
gadgethd f70fe058bf fix(ram): wait for Redis readiness in standalone drain 2026-10-11 20:41:17 +00:00
gadgethd 022b7c8a23 Report quarantined SQL poison and block unsafe RAM drain 2026-10-11 17:35:48 +00:00
gadgethd 8bfc5ce4a7 Connect real Redis integration fixture before issuing commands 2026-10-11 17:30:38 +00:00
gadgethd 647e6a0900 Count transaction-owned batch statement in PG integration probe 2026-10-11 17:26:24 +00:00
gadgethd 21b1eda80a Finish RAM ingestion recovery and bounded drain 2026-10-11 17:23:14 +00:00
gadgethd 91cc3c29c5 fix(ram): repair identity, lock, handoff and writer recovery (F01 F02 F05 F06 F09 F10 F11 F12 F14 F15 F16) 2026-10-11 16:58:31 +00:00
gadgethd ebab933b50 Merge repaired perf ingest into RAM stack (#122 review fixes) 2026-10-11 16:35:37 +00:00
gadgethd cbf78a8a6c fix(ingest): align replay identity and gate shared sessions (F03 F04 F14 F15) 2026-10-11 16:18:39 +00:00
gadgethd 29f9633db7 fix(ram): bounded quarantine for undecodable entries (no silent loss)
Undecodable stream values were acknowledged and deleted without recovery
evidence. They now go to a bounded quarantine stream (approx MAXLEN 500,
raw value size-capped, digest + byte length recorded) before the original is
acknowledged and deleted, so a malformed entry can neither block the stream
nor disappear without a trace. The structured log carries only id, length
and digest, and the quarantine counter is exported as
meshcore_ram_ingest_quarantined_total.
2026-10-11 14:57:14 +00:00
gadgethd 8d9da1b7c7 fix(ram): defer commit-dependent follow-ups to the writer post-commit hook
In RAM mode persistOnce returns at admission, so the post-ingest callbacks
that previously ran after durable persistence would fire against rows that
are not in PostgreSQL yet:

- the link queue (link worker reads packet rows) now enqueues from the RAM
  writer after the batch commit, and the live packet subscriber skips it in
  RAM mode;
- the live-map follow-ups (multibyte path evidence, slow-mode scheduling,
  pre-resolution) move to the same post-commit hook, sharing the durable
  path in-flight bound and drop counters via schedulePostPersistFollowUps;
- changes that are safe at admission stay there: WS broadcasts, node emits,
  resolve-cache invalidation and owner forwarding (self-contained envelope).

Regression test: the hook fires with the persisted batch after bookkeeping,
and never on failed commits.
2026-10-11 14:56:22 +00:00
gadgethd 5071f5f6a9 fix(ram): observer aggregation in merged reads + message-history type filter
- Merged live reads now aggregate pending observations per packet hash, the
  same way the SQL aggregates observers: one row per RF packet with combined
  observer arrays, IATAs and RX/TX counts. A hash already present in the
  database result is augmented with genuinely new observations only (an
  observer already listed is treated as the same observation, so retained
  overlap entries cannot double-count).
- The WS initial-state message history merge is restricted to group-text
  packets (packet_type 5), matching the getRecentMessages contract, with
  headroom in the pending sample so the type filter does not starve.
- Regression tests: multi-observer aggregation, augment-without-double-count,
  and the type filter (messages vs all-types).
2026-10-11 14:52:29 +00:00
gadgethd 1c3914b791 feat(ram): atomic admissions, honest queue metrics, safe retention handoff
- Admission bounds (packet count, byte budget) are enforced in one atomic
  Lua step with a conservative byte counter (value + fixed overhead);
  concurrent MQTT connections can no longer race past the same capacity
  check, refusals still never acknowledge, and the counter is kept honest
  across crashes by release-at-commit.
- Oldest-pending gauge reads oldest-first: the previous XREVRANGE sample
  reported the NEWEST entry age and could hide stuck deliveries.
- Committed entries are retained for a handoff-overlap window instead of
  being deleted at commit, closing the gap where a reader sees neither a
  pre-commit DB snapshot nor the post-commit stream. A retention sweep
  removes entries only when provably safe: acknowledged (absent from the
  PEL), at or below the newest commit boundary (numeric id comparison),
  and past a minimum retention guard. Failed-batch PEL entries are never
  swept.
2026-10-11 14:49:47 +00:00