Changelog

What changed, and when.

Generated from the repository’s own changelog at build time, so this page cannot describe a release that did not happen.

Helix NMS+ is pre-GA and in live production use. Releases before 1.5.0 were not consistently tagged, so this record begins there rather than reconstructing a history it cannot verify.

Unreleased

the v1.6.0 line

Release-blocking

  • A failed deploy would have redeployed itself every ten seconds, for ever.

Added

  • The alerting subsystem had never delivered an alert in production.

Security

  • A foreign tenant could write into another organisation.
  • **The only ENROLLMENT-key mint in the product was guarded by a membership row
  • **Rotation — the documented compromise-recovery path — did not retire
  • Forty-one handlers authorised on a membership row merely existing.
  • The webhook sender could reach anything the server could reach. No scheme
  • An orphaned device was adoptable by anyone who knew its serial.
  • Cancelling your own batch could stop another tenant's commands.
  • The M-Pesa STK push took its price and its recipient from the request body,
  • Two org GETs had `auth()` as their whole authorizationlog-settings
  • `ApiKey.lastUsedAt` had zero writers, so revocation was unmeasurable —

Fixed

  • The `/help` renderer was breaking every numbered procedure it served.
  • The deleted V3 device-command channel's client half was still being served.

Changed

  • **Thirty-eight contract pins could not fail, and the class is now closed —
  • **Thirteen pinned statuses disagreed with the measurement while the suite was
  • Two ratchets were budgets for silent regression. The tenancy ceiling sat at
  • OPEN_TENANCY_DEBT 119 → 115 across the day. Three of those are a

Documentation

  • Two agent skills promised safety nets that do not exist — a pre-migration
  • The 2026-07-22 deploy runbook documented a rollback that deploys.

Security

  • MISS-1 — a device id equal to an organisation id granted the organisation.
  • The archive bucket was identified by a name anyone could take.
  • A moved device left the losing org a firmware handle, and a **suspended

Added

  • The device-tenancy ratchet (S1-b) — an AST ESLint rule plus an independent
  • Atomic ownership auditingarchive, move and wipe write an
  • Two documentation guards. documented-surface-counts.test.ts fails when

Added

  • Alerting, end to end. Rule engine wired so syslog signals become alerts;
  • Native ML slices (§6.3): new-template anomaly detection, cross-device
  • Syslog ingest pipeline wired into SyslogServer — parsed, rate-limited,
  • Device page: live port/SFP/uplink state, subscribers-on-device, a polling
  • Darkest-blue glassmorphism design system, with Live Config and Subscribers
  • Billing lifecycle foundations: BillingHold and AuditEvent models, a
  • S1 canonical audit writer — one writer, three entry points with three
  • Helix Internet Monitor integration: the wire contract vendored and pinned
  • Fleet inventory (read-only) of RouterOS login identity, and read-back of

Fixed

  • F-13 — a payment now settles the invoice it paid, on all four payment
  • F-14 / F-27 — a renewal bills a full period, and a delinquent subscription
  • DD-5 — a telemetry gap renders as a gap, not as a confident zero.
  • Offline queue drain age-bounded, so stale destructive commands no longer
  • S-53 — the cron guard fails closed on an unset CRON_SECRET.
  • The fleet-wide audit feed was dead: two provisioning bugs, one per cohort.
  • A unique-constraint failure now names the collision instead of failing opaquely.

1.5.0-beta.1

deployed 2026-08-09, **never tagged**

Security

  • S-23 cross-tenant device-state write via /api/device/heartbeat - closed.
  • S-24 ApiKey revocation and expiry were a no-op on every device-facing
  • S-25 /api/setup/[deviceId] served the decrypted RouterOS group=full
  • S-26 the rate limiter failed open, silently, on any store error -
  • S-10 / S-12 / S-18 / S-19 and F-6 closed in the Week 0 containment

Fixed

  • The production deploy path. deploy-production.yml pulled *before*
  • RELEASE.json is written after the health check, so a failed deploy can no
  • The deploy health gate now checks PM2 process state. /api/health probes
  • All 18 PM2 apps carry env_production; 11 did not, and NODE_ENV is the
  • W0.7: scripts/ci/check-migrations.sh had never once executed - it

Added

  • scripts/audit-fasttrack.ts - read-only fleet audit for D-22, where
  • A status index for the gap register (as-built doc section 4.0): every
  • docs/specs/EDGE_PROFILE_AND_POLL_CHANNEL_SPEC_2026-07-26_2330.md.

Documentation

  • Four drifting agent-instruction files collapsed into pointers to CLAUDE.md,
  • README, DOCUMENTATION_MAP.md and deployment readiness rewritten.

1.5.0

planned scope, superseded by the beta above

Added

  • Reseller Billing v2 — dual collection modes. Any organisation can now
  • Partner consoleGET /api/billing/reseller/console returns a partner's
  • RouterOS v6 onboarding dialectscriptVariant: AUTO | ROS6 | ROS7 on
  • Real health probe/api/health now queries the database, reports
  • CI quality gate.github/workflows/ci.yml runs Prisma validate,
  • Project scaffoldingAGENTS.md, VERSIONING.md, CONTRIBUTING.md,

Fixed

  • Org-wide VPN route deletion (P1) — five compounding defects. Devices were
  • Billing composite indexes restored. Three indexes created for the
  • Pre-migration database backup now actually runs. scripts/deploy.sh never
  • Deploy rollback made coherent — the backup tarball now includes build
  • IPAM race and reallocation — allocation is serialised by a per-block
  • Invalid RouterOS cipherAddNasRouterModal emitted cipher=aes256-sha1,

Changed

  • RouterOS users created by Helix are `group=full`. Deliberate: Helix writes
  • All IPAM routes moved to canonical RBAC guards. The audit found
  • Package renamed temp_apphelix-nms.
  • scripts/fix-migration.sh retired. It ran hardcoded one-off

Security

  • IPAM authorisation gap closed (S-6 for IPAM).
  • Documented but not yet fixed at the time of this entry. Superseded - see

Documentation

  • Restructured: 210 superseded documents archived into 9 categories, with the
  • Recorded three retractions where confident findings were disproven by