rigscope 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +2 -2
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_not-found.html +1 -1
  12. package/.next/server/app/_not-found.rsc +2 -2
  13. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  14. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  16. package/.next/server/app/administration/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/administration.html +1 -1
  18. package/.next/server/app/administration.rsc +2 -2
  19. package/.next/server/app/administration.segments/_full.segment.rsc +2 -2
  20. package/.next/server/app/administration.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/administration.segments/administration/__PAGE__.segment.rsc +2 -2
  22. package/.next/server/app/alerts/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/alerts.html +1 -1
  24. package/.next/server/app/alerts.rsc +2 -2
  25. package/.next/server/app/alerts.segments/_full.segment.rsc +2 -2
  26. package/.next/server/app/alerts.segments/_tree.segment.rsc +2 -2
  27. package/.next/server/app/alerts.segments/alerts/__PAGE__.segment.rsc +2 -2
  28. package/.next/server/app/connections/page_client-reference-manifest.js +1 -1
  29. package/.next/server/app/connections.html +1 -1
  30. package/.next/server/app/connections.rsc +2 -2
  31. package/.next/server/app/connections.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/connections.segments/_tree.segment.rsc +2 -2
  33. package/.next/server/app/connections.segments/connections/__PAGE__.segment.rsc +2 -2
  34. package/.next/server/app/history/page.js +2 -2
  35. package/.next/server/app/history/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/history.html +1 -1
  37. package/.next/server/app/history.rsc +5 -5
  38. package/.next/server/app/history.segments/_full.segment.rsc +5 -5
  39. package/.next/server/app/history.segments/_tree.segment.rsc +2 -2
  40. package/.next/server/app/history.segments/history/__PAGE__.segment.rsc +5 -5
  41. package/.next/server/app/index.html +1 -1
  42. package/.next/server/app/index.rsc +2 -2
  43. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  44. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  45. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  46. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/login.html +1 -1
  48. package/.next/server/app/login.rsc +2 -2
  49. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  50. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  51. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  52. package/.next/server/app/machines/[machineId]/page.js +1 -1
  53. package/.next/server/app/machines/[machineId]/page_client-reference-manifest.js +1 -1
  54. package/.next/server/app/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/processes/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/processes.html +1 -1
  57. package/.next/server/app/processes.rsc +2 -2
  58. package/.next/server/app/processes.segments/_full.segment.rsc +2 -2
  59. package/.next/server/app/processes.segments/_tree.segment.rsc +2 -2
  60. package/.next/server/app/processes.segments/processes/__PAGE__.segment.rsc +2 -2
  61. package/.next/server/app-paths-manifest.json +2 -2
  62. package/.next/server/chunks/168.js +1 -1
  63. package/.next/server/middleware-build-manifest.js +1 -1
  64. package/.next/server/pages/404.html +1 -1
  65. package/.next/server/pages/500.html +1 -1
  66. package/.next/static/chunks/408-4fe7147e38981ee1.js +1 -0
  67. package/.next/static/chunks/app/history/page-22be927a4c3a9c76.js +3 -0
  68. package/.next/static/chunks/app/machines/[machineId]/page-916ee73de5eb067d.js +1 -0
  69. package/.next/static/css/3fbf75e4c471c6a8.css +1 -0
  70. package/CHANGELOG.md +27 -0
  71. package/README.md +53 -136
  72. package/dist/collector.cjs +9 -1
  73. package/dist/hub.cjs +14 -5
  74. package/dist/ops.cjs +8 -4
  75. package/docs/bottlenecks.md +1 -1
  76. package/docs/configuration.md +85 -0
  77. package/docs/development.md +1 -1
  78. package/docs/installation.md +205 -376
  79. package/docs/monitoring.md +112 -0
  80. package/docs/operations.md +103 -68
  81. package/docs/releasing.md +16 -14
  82. package/docs/scale-validation.md +34 -3
  83. package/docs/stress-2026-11-04/180301-probe-m100-u1-s1-20000ms.json +412 -0
  84. package/docs/stress-2026-11-04/180335-probe-m200-u1-s1-20000ms.json +412 -0
  85. package/docs/stress-2026-11-04/180409-probe-m400-u1-s1-20000ms.json +412 -0
  86. package/docs/stress-2026-11-04/180443-probe-m800-u1-s1-20000ms.json +412 -0
  87. package/docs/stress-2026-11-04/180518-probe-m600-u1-s1-20000ms.json +412 -0
  88. package/docs/stress-2026-11-04/180553-probe-m500-u1-s1-20000ms.json +412 -0
  89. package/docs/stress-2026-11-04/180628-probe-m550-u1-s1-20000ms.json +412 -0
  90. package/docs/stress-2026-11-04/180716-probe-m800-u1-s0-20000ms.json +415 -0
  91. package/docs/stress-2026-11-04/180751-probe-m1600-u1-s0-20000ms.json +415 -0
  92. package/docs/stress-2026-11-04/180828-probe-m3200-u1-s0-20000ms.json +416 -0
  93. package/docs/stress-2026-11-04/180941-probe-m2400-u1-s0-20000ms.json +416 -0
  94. package/docs/stress-2026-11-04/181031-probe-m2000-u1-s0-20000ms.json +416 -0
  95. package/docs/stress-2026-11-04/181114-probe-m1800-u1-s0-20000ms.json +416 -0
  96. package/docs/stress-2026-11-04/181203-probe-m100-u64-s64-20000ms.json +418 -0
  97. package/docs/stress-2026-11-04/181304-probe-m200-u64-s64-20000ms.json +418 -0
  98. package/docs/stress-2026-11-04/181405-probe-m400-u64-s64-20000ms.json +418 -0
  99. package/docs/stress-2026-11-04/181507-probe-m500-u64-s64-20000ms.json +418 -0
  100. package/docs/stress-2026-11-04/181609-probe-m450-u64-s64-20000ms.json +418 -0
  101. package/docs/stress-2026-11-04/181845-probe-m2-u2-s2-3000ms.json +419 -0
  102. package/docs/stress-2026-11-04/181931-probe-m500-u64-s64-30000ms.json +420 -0
  103. package/docs/stress-2026-11-04/182108-probe-m1800-u1-s0-120000ms.json +418 -0
  104. package/docs/stress-2026-11-04/182354-probe-m1200-u1-s0-120000ms.json +418 -0
  105. package/docs/stress-2026-11-04/182625-probe-m900-u1-s0-120000ms.json +418 -0
  106. package/docs/stress-2026-11-04/182847-probe-m1050-u1-s0-120000ms.json +418 -0
  107. package/docs/stress-2026-11-04/183112-probe-m1125-u1-s0-120000ms.json +418 -0
  108. package/docs/stress-2026-11-04/193608-probe-m500-u64-s64-120000ms.json +420 -0
  109. package/docs/stress-2026-11-04/193909-probe-m529-u1-s1-15000ms.json +420 -0
  110. package/docs/stress-2026-11-04/193940-probe-m530-u1-s1-15000ms.json +420 -0
  111. package/docs/stress-2026-11-04/194011-probe-m100-u1-s65-10000ms.json +421 -0
  112. package/docs/stress-2026-11-04/README.md +205 -0
  113. package/docs/stress-2026-11-04/index.jsonl +29 -0
  114. package/docs/stress-2026-11-04/manifest.json +13 -0
  115. package/docs/stress-2026-11-04/results.html +22 -0
  116. package/docs/system-installation.md +195 -0
  117. package/package.json +9 -1
  118. package/packaging/system/README.md +1 -1
  119. package/.next/static/chunks/408-18819c6490a5f8d3.js +0 -1
  120. package/.next/static/chunks/app/history/page-3fa5846eca26b7f7.js +0 -3
  121. package/.next/static/chunks/app/machines/[machineId]/page-a5aa1d8676272f38.js +0 -1
  122. package/.next/static/css/e41ccbccc3afaae5.css +0 -1
  123. /package/.next/static/{DZKWF9ur7H5wI0c7RAhdq → npHoP6NSY976Yaye-xi86}/_buildManifest.js +0 -0
  124. /package/.next/static/{DZKWF9ur7H5wI0c7RAhdq → npHoP6NSY976Yaye-xi86}/_ssgManifest.js +0 -0
@@ -0,0 +1,112 @@
1
+ # Monitoring and alerts
2
+
3
+ This guide explains what Rigscope collects, how long it keeps data, and how
4
+ access and alerts work. For setup, see [Installation](installation.md).
5
+
6
+ ## Collection and sharing
7
+
8
+ Each collector samples its machine once and sends readings independently to up
9
+ to eight hubs. Collection continues when no browser is open. Each hub owns its
10
+ users, permissions, history and alerts.
11
+
12
+ Managed enrollment shares CPU, memory, swap, GPU, disk and network readings,
13
+ plus on-demand process details. Network addresses and full process arguments
14
+ start disabled. Sharing is set separately for each hub; see the
15
+ [configuration reference](configuration.md#sharing-settings).
16
+
17
+ Missing or inaccessible readings stay unavailable. GPU support depends on the
18
+ driver and readable counters; see [Hardware](installation.md#hardware) and
19
+ [Sensor readings](bottlenecks.md).
20
+
21
+ ## History and delivery
22
+
23
+ The hub acknowledges samples after committing them to SQLite. A collector keeps
24
+ unacknowledged samples in a persistent queue for each hub and retries after a
25
+ disconnect. The hub removes duplicates using the collector, run and sequence IDs.
26
+ Replayed samples fill History without replacing current live readings or opening
27
+ alerts for past threshold crossings.
28
+
29
+ Default retention:
30
+
31
+ | Resolution | Kept for |
32
+ | --- | --- |
33
+ | Raw samples | 48 hours |
34
+ | One-minute summaries | 30 days |
35
+ | One-hour summaries | 400 days |
36
+
37
+ Summaries retain minimum and maximum values. History queries limit the number
38
+ of points, series, scanned rows and time spent. The UI marks partial results.
39
+
40
+ Hover over a History or Overview recent-usage chart to inspect a recorded time
41
+ and its bucket averages. The time marker follows across charts in the same view;
42
+ per-core heatmaps show the bucket peak at that time. Missing readings stay
43
+ unavailable. With a chart focused, use Left/Right arrows to move between readings,
44
+ Home/End to jump to the first/last reading, and Escape to dismiss the marker.
45
+
46
+ ### Storage limits
47
+
48
+ Each collector queue keeps up to ten minutes or 64 MiB of queued JSON per hub,
49
+ with a 256 MiB total JSON limit. Physical SQLite files, including WAL files,
50
+ have separate limits of 80 MiB per hub and 640 MiB across eight hubs.
51
+
52
+ The hub's default database limit is 2 GiB, including its WAL file and all tables.
53
+ Retention protects the newest hour of telemetry. If old-data cleanup cannot
54
+ free enough space, the hub stops acknowledging new samples and collectors retry.
55
+ Existing oversized databases report pressure; startup does not run a destructive
56
+ cleanup.
57
+
58
+ These are application limits, not filesystem quotas. A transaction can briefly
59
+ grow the WAL before checkpointing. Blocked checkpoints stop further ingestion
60
+ instead of allowing continued growth. Keep disk space for backups and sidecar
61
+ files. See [Storage pressure recovery](operations.md#storage-budgets-and-pressure-recovery).
62
+
63
+ ## Live readings and process details
64
+
65
+ A receipt becomes stale after `max(15 seconds, 3 × expected delivery interval)`.
66
+ If the cadence is unknown, Rigscope uses 15 seconds and discloses that fallback.
67
+ Connection status, unavailable readings and clock skew are reported separately.
68
+ Rigscope does not synchronize the browser and hub clocks.
69
+
70
+ Process details are scanned while viewers request them. Viewers share one
71
+ collector scan. Pausing, hiding or closing the view releases the extra work;
72
+ expired viewer requests and ended sessions do the same. Process details are
73
+ never persisted.
74
+
75
+ Process CPU uses 100% per logical core. Machine CPU is normalized across all
76
+ logical cores. See [Exports](exports.md) for CSV and JSON behavior.
77
+
78
+ ## Users and administration
79
+
80
+ Use **Administration** to manage users, machine access, names, tags, collector
81
+ revocation and enrollment grants. Administration requires an administrator role
82
+ and the appropriate machine access. Access to all machines alone does not make
83
+ a user an administrator.
84
+
85
+ User changes revoke existing browser sessions. Collector credential changes
86
+ close connections that no longer have access. User records and collector
87
+ credentials persist in SQLite. Browser sessions stay in memory, expire after
88
+ 12 hours and end when the hub restarts.
89
+
90
+ ## Alerts and webhooks
91
+
92
+ Alerts support above/below thresholds, durations, unavailable readings, missing
93
+ receipts, maintenance and recovery. Value, unavailable and stale-receipt rules
94
+ apply to the machines tracked by that hub. Replayed samples do not open past
95
+ incidents.
96
+
97
+ In **Alerts**, configure one HTTPS webhook channel. Its URL, headers and HMAC
98
+ secret are write-only. Loopback HTTP is allowed for controlled test sinks.
99
+ Delivery may be repeated: receivers should deduplicate the `Idempotency-Key`.
100
+ Rigscope makes up to six attempts, with a five-second deadline per request and
101
+ bounded persistent queues.
102
+
103
+ ## Scale and limits
104
+
105
+ There is no fixed machine-count limit. The default limit is 100 concurrent
106
+ collector connections. [Scale validation](scale-validation.md) records synthetic
107
+ workloads of up to 75 machines on one host; those results are not a capacity
108
+ guarantee.
109
+
110
+ Rigscope does not kill processes, change their priorities, control remote
111
+ services, federate hubs or provide a clustered hub. See the
112
+ [hardware notes](installation.md#hardware) for physical testing and sensor limits.
@@ -1,80 +1,107 @@
1
- # Production operations
1
+ # Operations
2
2
 
3
- This guide covers the supported single-host, two-process deployment:
3
+ For an npm installation, use the managed commands below. The
4
+ [manifest archive workflow](#low-level-manifest-archive-workflow) is for operators
5
+ building and deploying from source.
4
6
 
5
- - `dist/hub.cjs` — Node 26 custom server: listener, WebSocket collectors,
6
- browser SSE, authentication and the production Next.js handler from `.next`.
7
- - `dist/collector.cjs` — outbound-only collector with durable per-destination
8
- outboxes.
9
- - `dist/ops.cjs` — inspect, migrate, backup, restore, package, install,
10
- activate, rollback and bounded synthetic measurement.
11
-
12
- There is no Next.js standalone output and no `next start`. The hub runs the
13
- custom server from the installed release directory; the production UI must be
14
- present in `.next`.
15
-
16
- All paths below are examples. Choose a prefix and state directory owned by the
17
- service user. Paths containing spaces are supported by the generated units.
7
+ | Task | Section |
8
+ | --- | --- |
9
+ | Check, upgrade or roll back an npm installation | [Managed CLI operations](#managed-cli-operations) |
10
+ | Reset a lost password | [Password recovery](#password-recovery) |
11
+ | Change localhost/HTTPS access | [Access changes](#access-changes) |
12
+ | Back up or restore a database | [Database commands](#database-commands) |
13
+ | Plan what to back up | [Consistent backup set](#consistent-backup-set) |
14
+ | Handle a full database or queue | [Storage pressure recovery](#storage-budgets-and-pressure-recovery) |
18
15
 
19
16
  ## Managed CLI operations
20
17
 
21
- For a per-user installation created by `rigscope install` (default state
22
- `~/.local/state/rigscope`), the CLI owns the runtime, component units and release pairing:
18
+ These commands apply to an installation created by `rigscope install`. Its
19
+ state directory defaults to `~/.local/state/rigscope`.
20
+
21
+ ### Check health
23
22
 
24
23
  ```sh
25
24
  rigscope status
26
- rigscope doctor [--json]
27
- rigscope upgrade [--from PACKAGE] [--timeout SECONDS]
28
- rigscope rollback [--backup PATH] [--timeout SECONDS]
29
- rigscope recover-password [--user owner] [--password-file PATH] [--enable]
25
+ rigscope doctor
26
+ ```
27
+
28
+ `status` shows services and the dashboard URL. `doctor` checks configuration,
29
+ runtimes, database integrity, listeners, TLS destinations, disk space and sensor
30
+ access. It follows enabled components: a hub-only installation does not need a
31
+ collector. Checks are read-only and omit credentials. Use `doctor --json` for
32
+ structured output.
33
+
34
+ ### Upgrade
35
+
36
+ ```sh
37
+ rigscope upgrade
30
38
  ```
31
39
 
32
- `doctor` is read-only. It checks Node, private configuration and state
33
- permissions, the installed and previous runtimes, the component units, the database
34
- and schema, free space, hub port/Unix-socket state, role-appropriate listener
35
- health, configured destinations with TLS certificate validation, and procfs or
36
- RAPL readability for a collector. A hub without a collector is valid, and a
37
- collector without a local hub database is valid. Output contains counts and
38
- paths, never password hashes, collector tokens or environment values.
39
-
40
- `upgrade` stages the package without touching the active runtime, stops the
41
- running components, takes a consistent pre-upgrade hub database backup when one
42
- exists, and activates the new runtime. It restarts only components that were
43
- running before the upgrade and verifies them within `--timeout` seconds (default
44
- 25). Verification follows the installation's enabled components:
45
-
46
- - the active package reports the staged version;
47
- - restarted component services are active;
48
- - a restarted hub answers `status: "ok"` with the expected version;
49
- - an existing hub database passes integrity and ledger checks and reaches the
50
- staged runtime's supported schema;
51
- - a restarted collector produces a fresh sampling health marker.
52
-
53
- A failed start, migration or health wait restores the previous runtime and the
54
- paired pre-upgrade database when the old runtime cannot read the new schema. The
55
- replaced database is preserved first; credentials, collector identities and
56
- outboxes are not rewritten. `release-state.json` in the state directory records
57
- which runtime each backup belongs to. An inactive installation is staged and
58
- activated without starting; live health is then reported as skipped.
59
-
60
- `rollback` swaps to `runtime-previous` and validates it with the same bounded
61
- health and database checks. If the current schema is compatible it keeps the
62
- database unchanged, including post-upgrade data. If the previous runtime cannot
63
- read it, rollback restores the paired pre-upgrade backup, refuses when no
64
- compatible backup is recorded, and prints where the replaced newer database was
65
- preserved. For installations created before release state existed, pass an
66
- explicit compatible copy with `--backup PATH`. Rollback never silently deletes
67
- the newer database and never runs old code against a newer schema.
68
-
69
- `recover-password` is offline recovery for the durable managed user store. It
70
- requires the hub service to be stopped, takes the hub database lease and
71
- refuses a live or ambiguous lock. Enter the password at the private prompt, or
72
- pass a private `0600` file with `--password-file`. It updates only that managed
73
- user's hash in the database, clears `disabled` only with `--enable`, writes a
74
- bounded `user.password-recovery` audit row and bumps a durable session-epoch
75
- marker. It never edits `config.json` or `HUB_BROWSER_USERS`, so bootstrap
76
- password changes do not overwrite managed users. Restarting the hub invalidates
77
- all in-memory browser sessions; sign in again with the new password.
40
+ Use `--from PACKAGE` for an exact npm version or local archive. The command
41
+ stages the package, stops running components, takes a consistent hub database
42
+ backup and activates the new runtime. It restarts only the components that were
43
+ running, then checks:
44
+
45
+ - the installed and running versions match the new package;
46
+ - restarted services are active;
47
+ - hub health is OK and its database passes integrity/schema checks;
48
+ - a restarted collector produces a fresh sampling marker.
49
+
50
+ The health timeout is 25 seconds; change it with `--timeout SECONDS`. A failed
51
+ start, migration or health check restores the previous runtime. It also restores
52
+ the paired database backup if the old runtime cannot read the new schema,
53
+ preserving the replaced database first.
54
+
55
+ Credentials, collector identities and pending samples are retained.
56
+ `release-state.json` records which backup belongs to each runtime. Upgrading a
57
+ stopped installation leaves it stopped and reports live checks as skipped.
58
+
59
+ ### Roll back
60
+
61
+ ```sh
62
+ rigscope rollback
63
+ ```
64
+
65
+ Rollback uses `runtime-previous` and runs the same health checks. If that runtime
66
+ can read the current database, post-upgrade data stays intact. Otherwise it
67
+ restores the paired pre-upgrade backup and saves the replaced database.
68
+
69
+ A missing compatible backup stops rollback. Older installations without a
70
+ recorded backup can supply a compatible copy with `--backup PATH`. Never point
71
+ old code at a newer database schema.
72
+
73
+ ## Password recovery
74
+
75
+ Stop the installation, enter a new password at the private prompt, then restart:
76
+
77
+ ```sh
78
+ rigscope stop
79
+ rigscope recover-password --user owner
80
+ rigscope start
81
+ ```
82
+
83
+ Recovery requires the hub to be stopped and refuses a live or uncertain database
84
+ lock. For unattended recovery, use `--password-file` with an owned `0600` file.
85
+ It updates the existing user's stored hash. `--enable` also clears that user's
86
+ disabled flag; recovery never creates a user or grants administrator access.
87
+
88
+ The operation records an audit event and invalidates sessions. It keeps
89
+ configuration, history and collector credentials. Sign in again after restart;
90
+ editing bootstrap hashes in `config.json` or `HUB_BROWSER_USERS` does not reset a
91
+ managed account.
92
+
93
+ ## Access changes
94
+
95
+ Follow the commands in [Remote access](installation.md#access-from-another-computer).
96
+ `configure` requires a stopped hub and, when changing its local collector's
97
+ destination, a stopped collector.
98
+
99
+ It validates the HTTPS origin and private socket, backs up the old settings, and
100
+ updates the matching local collector destination. It moves that destination's
101
+ whole queue directory, including SQLite WAL files. Credentials and other hubs
102
+ stay unchanged. An existing target queue stops the conversion to avoid merging
103
+ or discarding pending records. Accounts and the hub history database are retained.
104
+ Rollback targets must support the saved configuration and database schema.
78
105
 
79
106
  ## Low-level manifest archive workflow
80
107
 
@@ -84,6 +111,14 @@ used by `rigscope install` and `rigscope upgrade`. For ordinary installations,
84
111
  follow [installation](installation.md) and the managed commands above. The npm
85
112
  package excludes source helper scripts and does not require users to build it.
86
113
 
114
+ The built deployment runs `dist/hub.cjs` for the dashboard and collector
115
+ connections, and `dist/collector.cjs` for collection. `dist/ops.cjs` provides the
116
+ database and archive tools below. The hub serves the production Next.js output
117
+ from `.next`; it does not use `next start` or standalone output.
118
+
119
+ Choose a prefix and state directory owned by the service user. All paths below
120
+ are examples; generated units support paths containing spaces.
121
+
87
122
  ### Build and package
88
123
 
89
124
  ```sh
@@ -406,7 +441,7 @@ a hub back below the schema its database already uses; `rollback` enforces that
406
441
  boundary, and collector rollback keeps its private state and outboxes. Process
407
442
  detail remains request-scoped and is never persisted or included in the backup
408
443
  set. Separate machines and hubs are upgraded independently. System installations
409
- use the component controls described in [installation](installation.md#system-component-lifecycle).
444
+ use the component controls in [System installation](system-installation.md#system-component-lifecycle).
410
445
 
411
446
  On upgrade from the previous collector endpoint, saved `/api/collector/v1/connect`
412
447
  URLs normalize to `/api/collector/connect` without changing identity, credentials,
package/docs/releasing.md CHANGED
@@ -1,18 +1,21 @@
1
1
  # Releasing Rigscope
2
2
 
3
- The first public version is `0.1.0`. Source and issue links target
4
- `https://github.com/Triet1402/rigscope`. Create that repository and push the
5
- release source before npm publication. The package includes MIT licensing,
3
+ The first public version, `0.1.0`, is published on
4
+ [npm](https://www.npmjs.com/package/rigscope). Source and issues are on
5
+ [GitHub](https://github.com/Triet1402/rigscope). The package includes MIT licensing,
6
6
  dependency notices, the security policy and [release notes](../CHANGELOG.md).
7
7
 
8
+ The commands below use `0.1.0` as an example. For a new release, substitute its
9
+ new version everywhere; do not attempt to republish `0.1.0`. Documentation edits
10
+ can be committed and pushed to GitHub independently. The published archive and
11
+ its bundled documentation stay unchanged; ship updated package documentation
12
+ with the next version. Keep each release tag on the revision used to build it.
13
+
8
14
  ## Recommended release order
9
15
 
10
- 1. Finish the version, public docs, release notes and repository metadata. Commit
11
- those changes. Keep the installation examples in the package ready for the
12
- version being published.
16
+ 1. Update the version, docs, release notes and repository metadata. Commit them.
13
17
  2. Push the source to GitHub and run the manual CI workflow on that revision.
14
- This repository deliberately has no push, pull-request or scheduled CI
15
- triggers. A local result is not a GitHub Actions result.
18
+ CI runs manually; pushes and pull requests do not trigger it.
16
19
  3. Build one npm archive from the final revision. Retain it, its SHA-256 checksum
17
20
  and verification results. Test and publish that archive without rebuilding it.
18
21
  4. Run the publish dry run, check the npm account, and publish the verified archive.
@@ -111,9 +114,8 @@ npm publish ./out/release/rigscope-0.1.0.tgz --access public --tag latest \
111
114
  --registry=https://registry.npmjs.org --dry-run
112
115
  ```
113
116
 
114
- The dry run does not publish, reserve the name, or prove that registry
115
- authorization and two-factor authentication will succeed. The repository
116
- metadata does not establish npm package ownership.
117
+ The dry run checks the package without publishing. It does not verify permission
118
+ to publish or complete two-factor authentication.
117
119
 
118
120
  When releasing, this command actually publishes the verified archive publicly:
119
121
 
@@ -129,8 +131,8 @@ check. Uninstall that test installation afterward. Use the same isolation
129
131
  settings for all test commands so the check does not select a real installation.
130
132
 
131
133
  The public quick start uses `npx --yes rigscope@latest install --boot` and the
132
- installed `rigscope upgrade`. Archive commands remain available before npm
133
- publication and for explicit version selection. Users do not need a global npm
134
+ installed `rigscope upgrade`. Archive commands remain available for downloaded
135
+ releases and testing before publication. Users do not need a global npm
134
136
  installation of Rigscope.
135
137
 
136
138
  GitHub Actions trusted publishing can automate later releases. Configure it for
@@ -146,7 +148,7 @@ It is a separate format from the npm `.tgz`. The low-level installer validates
146
148
  size/hash and required artifacts before activation. Production dependencies must
147
149
  be installed in the staged release; activation never silently runs npm or service
148
150
  commands. See [operations](operations.md#low-level-manifest-archive-workflow) and
149
- [system installation](installation.md#system-installation).
151
+ [system installation](system-installation.md).
150
152
 
151
153
  Configuration, database schema and wire-protocol revisions are internal
152
154
  compatibility checks, independent of the application package version.
@@ -9,6 +9,22 @@ concurrency listed for each case. They do not prove that a larger fleet,
9
9
  different hardware, slower storage or a different browser workload will behave
10
10
  the same way.
11
11
 
12
+ ## Later capacity search
13
+
14
+ The [November 4 capacity stress test](stress-2026-11-04/README.md) extends these
15
+ measurements with an exponential/binary search and two-minute confirmations:
16
+
17
+ - 500 collectors plus 64 live browser sessions passed at one sample and one
18
+ History poll per second per participant.
19
+ - Ingestion without live viewers passed at 1,050 collectors; 1,125 exceeded the
20
+ experiment's 500 ms acknowledgment p95 target.
21
+ - Full-fleet streaming passed with 529 representative machines, but 530 exceeded
22
+ the live feed's 1 MiB buffer guard and disconnected the viewer.
23
+
24
+ That report, its measurement JSON and chart are included in the npm package.
25
+ These results describe a bounded synthetic workload, not long-term capacity.
26
+ The five-case suite below remains the earlier sustained measurement.
27
+
12
28
  ## What was missing
13
29
 
14
30
  The earlier `ops measure` command was a bounded synthetic burst capped at 50
@@ -86,12 +102,13 @@ phase boundary.
86
102
 
87
103
  ### Bounds
88
104
 
89
- - machines: 1–1,000,
105
+ - machines: 1–8,192 (the total-record bound below still applies),
90
106
  - measured phase: up to 1 hour,
91
107
  - sample cadence: at least 100 ms (the protocol rate limit),
92
108
  - records per live batch: 1–32,
93
- - viewers: 1–50 authenticated sessions,
94
- - SSE clients: 1–64,
109
+ - viewers: 1–200 authenticated sessions,
110
+ - SSE attempts: 0–65; the hub still admits at most 64 (zero isolates ingestion,
111
+ and the 65th attempt measures admission rejection),
95
112
  - replay: at most 128 records per reconnect,
96
113
  - estimated live plus replay records: at most 500,000 per case,
97
114
  - database: 512 MiB main+WAL by default (`--database-budget-mb 0` disables the
@@ -201,6 +218,10 @@ payloads, storage and viewer counts.
201
218
 
202
219
  ## Reproduction
203
220
 
221
+ For the later resource-guarded capacity search, including the distinction between
222
+ collector throughput and full-fleet stream limits, see
223
+ [the November 4 stress test](stress-2026-11-04/README.md).
224
+
204
225
  ```sh
205
226
  # full five-case suite (about five minutes)
206
227
  npx tsx scripts/scale-harness.ts --suite \
@@ -213,6 +234,11 @@ npx tsx scripts/scale-harness.ts --case fleet-75m \
213
234
 
214
235
  # retain the throwaway database and configuration for inspection
215
236
  npx tsx scripts/scale-harness.ts --case small-5m --keep
237
+
238
+ # Keep stream parsing independent of collector sample generation
239
+ npx tsx scripts/scale-harness.ts --case fleet-75m \
240
+ --machines 500 --viewers 64 --sse-clients 64 --sse-workers 4 \
241
+ --duration-ms 60000 --json-out /tmp/rigscope-scale-mixed.json
216
242
  ```
217
243
 
218
244
  The short `tests/scale-harness.test.ts` smoke runs the same child with two
@@ -224,6 +250,11 @@ test; it proves the harness paths work in CI.
224
250
  - The hub child and all load generators share one host. The hub event loop uses
225
251
  one thread; the load processes can run on other cores. This is
226
252
  not a distributed-load test and the generator competes with the hub.
253
+ `--sse-workers N` separates stream readers into up to eight processes. With
254
+ workers enabled, a one-second client warmup precedes the measured window;
255
+ without workers, collector generation and stream parsing share an event loop,
256
+ which can under-drive large mixed workloads. Report configuration records
257
+ the worker count and client warmup. The original five results used no workers.
227
258
  - History queries are synchronous SQLite work on the hub event loop.
228
259
  "Concurrent viewers" means overlapping authenticated HTTP requests, not
229
260
  parallel SQLite readers.