rigscope 0.0.0-stage → 0.1.0

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 (188) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +13 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/export-marker.json +6 -0
  5. package/.next/images-manifest.json +68 -0
  6. package/.next/next-minimal-server.js.nft.json +1 -0
  7. package/.next/next-server.js.nft.json +1 -0
  8. package/.next/package.json +1 -0
  9. package/.next/prerender-manifest.json +297 -0
  10. package/.next/react-loadable-manifest.json +1 -0
  11. package/.next/required-server-files.json +369 -0
  12. package/.next/routes-manifest.json +114 -0
  13. package/.next/server/app/_global-error/page.js +31 -0
  14. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  15. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  16. package/.next/server/app/_global-error.html +1 -0
  17. package/.next/server/app/_global-error.meta +35 -0
  18. package/.next/server/app/_global-error.rsc +18 -0
  19. package/.next/server/app/_global-error.segments/_full.segment.rsc +18 -0
  20. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +24 -0
  21. package/.next/server/app/_global-error.segments/_tree.segment.rsc +3 -0
  22. package/.next/server/app/_not-found/page.js +1 -0
  23. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  24. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  25. package/.next/server/app/_not-found.html +1 -0
  26. package/.next/server/app/_not-found.meta +35 -0
  27. package/.next/server/app/_not-found.rsc +24 -0
  28. package/.next/server/app/_not-found.segments/_full.segment.rsc +24 -0
  29. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +30 -0
  30. package/.next/server/app/_not-found.segments/_tree.segment.rsc +4 -0
  31. package/.next/server/app/administration/page.js +1 -0
  32. package/.next/server/app/administration/page.js.nft.json +1 -0
  33. package/.next/server/app/administration/page_client-reference-manifest.js +1 -0
  34. package/.next/server/app/administration.html +1 -0
  35. package/.next/server/app/administration.meta +34 -0
  36. package/.next/server/app/administration.rsc +29 -0
  37. package/.next/server/app/administration.segments/_full.segment.rsc +29 -0
  38. package/.next/server/app/administration.segments/_tree.segment.rsc +4 -0
  39. package/.next/server/app/administration.segments/administration/__PAGE__.segment.rsc +35 -0
  40. package/.next/server/app/alerts/page.js +1 -0
  41. package/.next/server/app/alerts/page.js.nft.json +1 -0
  42. package/.next/server/app/alerts/page_client-reference-manifest.js +1 -0
  43. package/.next/server/app/alerts.html +1 -0
  44. package/.next/server/app/alerts.meta +34 -0
  45. package/.next/server/app/alerts.rsc +28 -0
  46. package/.next/server/app/alerts.segments/_full.segment.rsc +28 -0
  47. package/.next/server/app/alerts.segments/_tree.segment.rsc +4 -0
  48. package/.next/server/app/alerts.segments/alerts/__PAGE__.segment.rsc +34 -0
  49. package/.next/server/app/connections/page.js +1 -0
  50. package/.next/server/app/connections/page.js.nft.json +1 -0
  51. package/.next/server/app/connections/page_client-reference-manifest.js +1 -0
  52. package/.next/server/app/connections.html +1 -0
  53. package/.next/server/app/connections.meta +34 -0
  54. package/.next/server/app/connections.rsc +29 -0
  55. package/.next/server/app/connections.segments/_full.segment.rsc +29 -0
  56. package/.next/server/app/connections.segments/_tree.segment.rsc +4 -0
  57. package/.next/server/app/connections.segments/connections/__PAGE__.segment.rsc +35 -0
  58. package/.next/server/app/history/page.js +2 -0
  59. package/.next/server/app/history/page.js.nft.json +1 -0
  60. package/.next/server/app/history/page_client-reference-manifest.js +1 -0
  61. package/.next/server/app/history.html +1 -0
  62. package/.next/server/app/history.meta +34 -0
  63. package/.next/server/app/history.rsc +33 -0
  64. package/.next/server/app/history.segments/_full.segment.rsc +33 -0
  65. package/.next/server/app/history.segments/_tree.segment.rsc +4 -0
  66. package/.next/server/app/history.segments/history/__PAGE__.segment.rsc +37 -0
  67. package/.next/server/app/icon.svg/route.js +1 -0
  68. package/.next/server/app/icon.svg/route.js.nft.json +1 -0
  69. package/.next/server/app/icon.svg.body +1 -0
  70. package/.next/server/app/icon.svg.meta +1 -0
  71. package/.next/server/app/index.html +1 -0
  72. package/.next/server/app/index.meta +29 -0
  73. package/.next/server/app/index.rsc +26 -0
  74. package/.next/server/app/index.segments/__PAGE__.segment.rsc +31 -0
  75. package/.next/server/app/index.segments/_full.segment.rsc +26 -0
  76. package/.next/server/app/index.segments/_tree.segment.rsc +3 -0
  77. package/.next/server/app/login/page.js +1 -0
  78. package/.next/server/app/login/page.js.nft.json +1 -0
  79. package/.next/server/app/login/page_client-reference-manifest.js +1 -0
  80. package/.next/server/app/login.html +1 -0
  81. package/.next/server/app/login.meta +34 -0
  82. package/.next/server/app/login.rsc +26 -0
  83. package/.next/server/app/login.segments/_full.segment.rsc +26 -0
  84. package/.next/server/app/login.segments/_tree.segment.rsc +4 -0
  85. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +32 -0
  86. package/.next/server/app/machines/[machineId]/page.js +1 -0
  87. package/.next/server/app/machines/[machineId]/page.js.nft.json +1 -0
  88. package/.next/server/app/machines/[machineId]/page_client-reference-manifest.js +1 -0
  89. package/.next/server/app/page.js +1 -0
  90. package/.next/server/app/page.js.nft.json +1 -0
  91. package/.next/server/app/page_client-reference-manifest.js +1 -0
  92. package/.next/server/app/processes/page.js +2 -0
  93. package/.next/server/app/processes/page.js.nft.json +1 -0
  94. package/.next/server/app/processes/page_client-reference-manifest.js +1 -0
  95. package/.next/server/app/processes.html +1 -0
  96. package/.next/server/app/processes.meta +34 -0
  97. package/.next/server/app/processes.rsc +30 -0
  98. package/.next/server/app/processes.segments/_full.segment.rsc +30 -0
  99. package/.next/server/app/processes.segments/_tree.segment.rsc +4 -0
  100. package/.next/server/app/processes.segments/processes/__PAGE__.segment.rsc +36 -0
  101. package/.next/server/app-paths-manifest.json +13 -0
  102. package/.next/server/chunks/161.js +1 -0
  103. package/.next/server/chunks/168.js +1 -0
  104. package/.next/server/chunks/266.js +68 -0
  105. package/.next/server/chunks/430.js +116 -0
  106. package/.next/server/chunks/721.js +1 -0
  107. package/.next/server/chunks/751.js +1 -0
  108. package/.next/server/chunks/877.js +1 -0
  109. package/.next/server/chunks/894.js +2 -0
  110. package/.next/server/functions-config-manifest.json +4 -0
  111. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  112. package/.next/server/middleware-build-manifest.js +1 -0
  113. package/.next/server/middleware-manifest.json +6 -0
  114. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  115. package/.next/server/next-font-manifest.js +1 -0
  116. package/.next/server/next-font-manifest.json +1 -0
  117. package/.next/server/pages/404.html +1 -0
  118. package/.next/server/pages/500.html +1 -0
  119. package/.next/server/pages-manifest.json +4 -0
  120. package/.next/server/prefetch-hints.json +123 -0
  121. package/.next/server/preview-props.json +5 -0
  122. package/.next/server/server-reference-manifest.js +1 -0
  123. package/.next/server/server-reference-manifest.json +1 -0
  124. package/.next/server/webpack-runtime.js +1 -0
  125. package/.next/static/DZKWF9ur7H5wI0c7RAhdq/_buildManifest.js +1 -0
  126. package/.next/static/DZKWF9ur7H5wI0c7RAhdq/_ssgManifest.js +1 -0
  127. package/.next/static/chunks/103-c47318242b24e9ac.js +1 -0
  128. package/.next/static/chunks/157-0d36ebf66af048ac.js +1 -0
  129. package/.next/static/chunks/227-417939c480f50747.js +1 -0
  130. package/.next/static/chunks/408-18819c6490a5f8d3.js +1 -0
  131. package/.next/static/chunks/4bd1b696-c7408084347438ae.js +1 -0
  132. package/.next/static/chunks/794-ceeb732a1a81bc27.js +52 -0
  133. package/.next/static/chunks/939-2600d7c8e583d5ef.js +1 -0
  134. package/.next/static/chunks/app/_global-error/page-aba28f88d5781771.js +1 -0
  135. package/.next/static/chunks/app/_not-found/page-a2a510233e4836e2.js +1 -0
  136. package/.next/static/chunks/app/administration/page-4b16b19bb6a39c36.js +1 -0
  137. package/.next/static/chunks/app/alerts/page-fe0e877778c60af8.js +1 -0
  138. package/.next/static/chunks/app/connections/page-99cd54d6929b3f1f.js +1 -0
  139. package/.next/static/chunks/app/history/page-3fa5846eca26b7f7.js +3 -0
  140. package/.next/static/chunks/app/layout-4feff677c4071745.js +1 -0
  141. package/.next/static/chunks/app/login/page-c57e12dbe5146737.js +1 -0
  142. package/.next/static/chunks/app/machines/[machineId]/page-a5aa1d8676272f38.js +1 -0
  143. package/.next/static/chunks/app/page-1ae9fc94c897785b.js +1 -0
  144. package/.next/static/chunks/app/processes/page-e471ed23a1d5632f.js +3 -0
  145. package/.next/static/chunks/framework-ea4f97ca039bd777.js +1 -0
  146. package/.next/static/chunks/main-a458d32948147b84.js +5 -0
  147. package/.next/static/chunks/main-app-f92328c8950d2e53.js +1 -0
  148. package/.next/static/chunks/next/dist/client/components/builtin/app-error-aba28f88d5781771.js +1 -0
  149. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-aba28f88d5781771.js +1 -0
  150. package/.next/static/chunks/next/dist/client/components/builtin/global-error-43cbaa3aa1576eb4.js +1 -0
  151. package/.next/static/chunks/next/dist/client/components/builtin/not-found-aba28f88d5781771.js +1 -0
  152. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-aba28f88d5781771.js +1 -0
  153. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  154. package/.next/static/chunks/webpack-9ca43f4ce1bb8938.js +1 -0
  155. package/.next/static/css/e41ccbccc3afaae5.css +1 -0
  156. package/ARCHITECTURE.md +279 -0
  157. package/CHANGELOG.md +25 -0
  158. package/DESIGN.md +299 -0
  159. package/LICENSE +21 -0
  160. package/README.md +157 -2
  161. package/SECURITY.md +12 -0
  162. package/THIRD_PARTY_NOTICES.md +8847 -0
  163. package/bin/rigscope.cjs +6 -0
  164. package/dist/cli.cjs +9075 -0
  165. package/dist/collector.cjs +5671 -0
  166. package/dist/hub.cjs +8355 -0
  167. package/dist/ops.cjs +4972 -0
  168. package/dist/system.cjs +4333 -0
  169. package/docs/bottlenecks.md +62 -0
  170. package/docs/development.md +46 -0
  171. package/docs/exports.md +39 -0
  172. package/docs/installation.md +477 -0
  173. package/docs/operations.md +515 -0
  174. package/docs/releasing.md +152 -0
  175. package/docs/scale-acceptance.json +412 -0
  176. package/docs/scale-validation.json +1898 -0
  177. package/docs/scale-validation.md +263 -0
  178. package/next.config.js +38 -0
  179. package/package.json +109 -4
  180. package/packaging/README.md +5 -0
  181. package/packaging/collector.env.example +24 -0
  182. package/packaging/hub.env.example +31 -0
  183. package/packaging/system/90-rigscope-rapl.rules +7 -0
  184. package/packaging/system/README.md +5 -0
  185. package/packaging/system/rigscope-collector.service.example +53 -0
  186. package/packaging/system/rigscope-hub.service.example +50 -0
  187. package/packaging/system/rigscope-rapl.sysusers +5 -0
  188. package/packaging/system/rigscope.sysusers +7 -0
package/README.md CHANGED
@@ -1,3 +1,158 @@
1
- # Temporary Holding Version
1
+ # Rigscope
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Your machines, in view. A self-hosted Linux system and process monitor for one machine or a small fleet. A collector samples each machine and connects outbound to one or more independently operated hubs. Each hub owns its users, permissions, SQLite history and alerts.
4
+
5
+ Requires Linux, Node.js 26+ with npm, and a working systemd user manager for background services. Install a published release with:
6
+
7
+ ```sh
8
+ npx --yes rigscope@latest install --boot
9
+ ~/.local/bin/rigscope
10
+ ```
11
+
12
+ If the npm release is not available yet, use the [release archive instructions](docs/installation.md#install-from-an-archive). No global npm installation or source checkout is required.
13
+
14
+ Save the generated `owner` password and open the printed URL. The default installation starts separate hub and collector services. `--boot` enables user lingering; without it, startup is at login. The installer reports any host authorization needed. Add `~/.local/bin` to PATH to use the commands below. Bare `rigscope` shows status.
15
+
16
+ ```sh
17
+ rigscope status
18
+ rigscope logs hub
19
+ rigscope stop collector
20
+ rigscope start collector
21
+ rigscope upgrade
22
+ rigscope rollback
23
+ ```
24
+
25
+ For a foreground trial before installing services, run `npx --yes rigscope@latest try`. It uses separate trial state and stops with Ctrl+C. For a collector reporting to an existing hub, install with `--role collector`, then use `rigscope connect https://your-hub.example.com` and paste an Add machine grant at the private prompt. Each collector supports up to eight hubs.
26
+
27
+ Rigscope includes real resource telemetry, fleet and machine views, durable History, on-demand Processes, alerts/webhooks and user/collector administration. Process inspection is read-only; kill, renice, service control, hub federation and clustering are outside this release. Missing readings remain unavailable, and stale data retains its freshness status.
28
+
29
+ [Installation and hardware](docs/installation.md) · [Operations and recovery](docs/operations.md) · [Release notes](CHANGELOG.md) · [Development](docs/development.md) · [Releasing and verification](docs/releasing.md) · [Architecture](ARCHITECTURE.md) · [Design](DESIGN.md)
30
+
31
+ [Bottleneck readings](docs/bottlenecks.md) explains optional sensors and their limits. [Exports](docs/exports.md) describes visible-data CSV/JSON downloads. [Scale validation](docs/scale-validation.md) records synthetic workloads on one host; it is not a capacity guarantee.
32
+
33
+ Maintained by [Triet (@Triet1402)](https://github.com/Triet1402). Licensed under [MIT](LICENSE); dependency attribution is in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). See [SECURITY.md](SECURITY.md) to report vulnerabilities privately.
34
+
35
+ ## Advanced configuration
36
+
37
+ Managed installations use `rigscope config` and private settings described in
38
+ [installation](docs/installation.md#hub-configuration). The environment variables
39
+ below apply to source development and raw hub/collector services; setting them in
40
+ your shell does not reconfigure a managed service.
41
+
42
+ Keep state/configuration directories 0700 and files 0600. Do not commit them.
43
+
44
+ | Hub variable | Behavior |
45
+ | --- | --- |
46
+ | `HUB_HOST`, `HUB_PORT` | Loopback-only listener; defaults `127.0.0.1:8081`. Port `0` is useful for isolated tests. |
47
+ | `HUB_PUBLIC_ORIGIN`, `HUB_SOCKET_PATH` | Required together for remote mode. Exact HTTPS origin and private absolute Unix socket. No TCP listener in this mode. |
48
+ | `HUB_DATABASE_PATH` | Authoritative SQLite telemetry/users/alerts/collector registry. Defaults beside `HUB_STATE_FILE`, otherwise `$XDG_STATE_HOME/rigscope/hub/telemetry.sqlite` (falling back to `~/.local/state`). |
49
+ | `HUB_BROWSER_USERS` | First-run bootstrap JSON: `{username,passwordHash,machineIds,admin?}`. Scope is `"*"` or a machine-ID array; `[]` grants no machine access. |
50
+ | `HUB_ADMIN_USERS` | Comma-separated usernames explicitly elevated during first import. When absent, an existing bootstrap account named `owner` is migrated as administrator. Other users need an explicit `admin:true`. |
51
+ | `HUB_COLLECTORS` | First-run bootstrap JSON: `{collectorId,machineId,token}`; bounded by JSON bytes rather than machine count. Credentials travel only in bearer headers. |
52
+ | `HUB_MAX_COLLECTOR_CONNECTIONS` | Concurrent collector socket budget; defaults to 100. Positive integer; tune to measured deployment capacity. |
53
+ | `HUB_STATE_FILE` | Private enrollment-file import source for existing installations; enables the enrollment endpoint. Preserve it with deployment configuration for recovery. |
54
+ | `HUB_ENROLLMENT_GRANTS` | Bootstrap grants `{token,expiresAt}`; at most 15 minutes. Consumed grants remain consumed across migration/restart. |
55
+
56
+ From a source checkout, generate salted scrypt hashes with
57
+ `scripts/hash-browser-password.cjs`, which reads passwords from stdin. Managed
58
+ installation generates the initial account automatically. Keep hashes private. The database imports existing
59
+ users/credentials once; later configuration restarts do not overwrite managed users
60
+ or resurrect revoked credentials. Administration changes apply to active sessions
61
+ and collector connections. Existing owner passwords and scopes are preserved.
62
+
63
+ | Collector variable | Behavior |
64
+ | --- | --- |
65
+ | `COLLECTOR_MODE` | `real` by default; `mock` is explicit synthetic telemetry and never scans real processes. |
66
+ | `COLLECTOR_STATE_FILE` | Private persistent identity, enrolled destinations and pending enrollment recovery proof. Defaults under `$XDG_STATE_HOME/rigscope/collector.json`. |
67
+ | `COLLECTOR_INTERVAL_MS` | Shared sampling cadence; defaults 1000 ms, minimum 100 ms. GPU polling has a 1-second local floor. |
68
+ | `COLLECTOR_HUBS` | Optional explicit destinations `{url,token,sharing?,intervalMs?}`; at most eight. Otherwise use saved enrollment. |
69
+ | `COLLECTOR_HOSTNAME` | Metadata only; real mode defaults to OS hostname. |
70
+
71
+ Destination `sharing` accepts `cpu`, `memory`, `swap`, `gpus`, `disks`, `network`,
72
+ `networkAddresses`, `processes`, `processArguments`. CPU/memory remain required when
73
+ an object is supplied. Missing fields default to true, except swap follows memory
74
+ and process arguments default false. Review local sharing before upgrading a
75
+ restricted destination to broader metrics. Environment variables are never collected.
76
+ Policy is applied before queueing, to restored pending metrics before sending, and
77
+ to every process result separately for each hub.
78
+
79
+ ## Source enrollment, rotation and replacement
80
+
81
+ For a managed installation, use `rigscope connect` as described in
82
+ [Add machines and hubs](docs/installation.md#add-machines-and-hubs). The following
83
+ commands require a source checkout with development dependencies installed.
84
+
85
+ Create a short-lived grant through an authorized administration flow. On the machine,
86
+ set `COLLECTOR_ENROLL_URL` to its full `ws[s]://…/api/collector/connect` URL and
87
+ `COLLECTOR_ENROLL_TOKEN` privately, then run:
88
+
89
+ ```sh
90
+ npm run collector:enroll
91
+ ```
92
+
93
+ The collector saves a random recovery proof before requesting a credential. A retry
94
+ after a lost successful response recovers the same credential using that proof;
95
+ collector ID or hostname alone is insufficient. Restart the collector to apply changes.
96
+
97
+ Rotation/replacement requires a grant explicitly bound to the existing hub-local
98
+ machine mapping. Use `npm run collector:enroll -- --replace-enrollment` to replace a
99
+ saved destination. Revocation invalidates open connections and old recovery proofs.
100
+ Replacement never matches a machine by hostname or address.
101
+
102
+ ## Monitoring behavior and bounds
103
+
104
+ - Samples are acknowledged only after a durable SQLite commit. Retries deduplicate
105
+ by collector/run/sequence. Replay fills History without replacing live state or
106
+ triggering historical threshold incidents.
107
+ - Per-destination outboxes retain pending metrics across collector restart, prioritize
108
+ live telemetry, and bound replay/in-flight work. Defaults: ten minutes or 64 MiB
109
+ of queued JSON per destination, 256 MiB aggregate queued JSON. Separate physical
110
+ budgets count main database files plus WAL: 80 MiB per destination and 640 MiB
111
+ across eight destinations. SQLite page caps, bounded writes, checkpoints and
112
+ pressure rejection enforce these budgets; they are not OS filesystem quotas.
113
+ - History defaults: raw 48 hours, one-minute rollups 30 days, one-hour rollups 400 days.
114
+ Rollups preserve minima/maxima. Queries have point, series, scanned-row and elapsed
115
+ budgets; partial results are disclosed. The hub defaults to a 2 GiB physical
116
+ database/WAL budget shared by telemetry, users, enrollment and alerts. Retention
117
+ protects the newest hour; when it cannot reclaim enough space, ingestion returns
118
+ busy without acknowledging records. Existing oversized databases enter pressure
119
+ mode; they are not destructively vacuumed at startup. Atomic writes may briefly
120
+ grow WAL before checkpointing; blocked checkpoints surface pressure and stop
121
+ subsequent ingestion rather than permitting continued growth.
122
+ - Receipt freshness is `max(15 seconds, 3 × expected delivery interval)`. Unknown cadence
123
+ uses a disclosed 15-second fallback. Connection state, collection availability and
124
+ clock skew remain separate. Browser/hub clocks are not calibrated.
125
+ - Process detail uses renewable viewer interests and one shared collector scan. Pausing,
126
+ hiding/closing a view, session termination or lease expiry releases extra work.
127
+ Process detail is never persisted. CPU is 100% per core; machine CPU is normalized
128
+ across logical cores. Missing/inaccessible readings remain unavailable.
129
+ - User sessions are in memory with a fixed twelve-hour lifetime; a hub restart requires
130
+ signing in again. Users/scopes/password hashes and collector credentials persist.
131
+ - Physical checks cover the Ubuntu RTX 3090 rig and the laptop’s RTX 5060 plus Radeon
132
+ 860M iGPU. Intel sensor and ARM/RISC-V naming paths have deterministic fixture coverage;
133
+ physical validation for those paths remains outstanding. See the [hardware support notes](docs/installation.md#hardware).
134
+ - There is no fixed machine-count limit. The default concurrent collector connection
135
+ budget is 100; [scale validation](docs/scale-validation.md) records synthetic
136
+ workloads up to 75 machines on one host and is not a capacity guarantee.
137
+ Remote kill/renice, service control, hub federation and clustering are out
138
+ of scope for this read-only release.
139
+
140
+ ## Alerts and administration
141
+
142
+ Administration requires an explicit administrator role as well as machine scope.
143
+ Use it to manage accounts/scopes, display names/tags, collector revocation and
144
+ short-lived enrollment/replacement grants. User changes revoke existing browser
145
+ sessions; credential changes close invalid collector connections. Wildcard scope
146
+ alone does not grant administration.
147
+
148
+ Alerts support above/below thresholds, duration, unavailable readings, missing
149
+ receipts, maintenance and recovery. Value, unavailable and stale-receipt rules
150
+ apply to every machine the hub tracks. Replay never opens historical incidents.
151
+ Configure one HTTPS webhook channel in Alerts (loopback HTTP only for controlled
152
+ test sinks). URL, headers and HMAC secret are write-only. Delivery is at-least-once:
153
+ receivers should deduplicate the `Idempotency-Key`. Six attempts, a five-second
154
+ request deadline and bounded persistent queues prevent unbounded delivery work.
155
+
156
+ See [operations](docs/operations.md) for packaging, private service configuration,
157
+ boot enablement, backups, tested restores, upgrades/rollback and measurements.
158
+ The managed installer starts services by default; low-level archive tools print service commands for explicit execution.
package/SECURITY.md ADDED
@@ -0,0 +1,12 @@
1
+ # Security policy
2
+
3
+ Report suspected vulnerabilities privately to
4
+ [mtrietvu@gmail.com](mailto:mtrietvu@gmail.com).
5
+
6
+ Include the affected Rigscope version, a description of the issue, reproduction
7
+ steps and its potential impact. Redact passwords, tokens, private telemetry and
8
+ other sensitive information. Keep vulnerability details out of public issues
9
+ until a fix or disclosure plan has been agreed.
10
+
11
+ Rigscope is an early release. No guaranteed response time or long-term security
12
+ support window is offered. Use the latest available release.