@microck/raft 0.5.0 → 0.7.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 (63) hide show
  1. package/README.md +27 -15
  2. package/deploy/build-image.py +4 -2
  3. package/deploy/raft-expire.py +109 -31
  4. package/deploy/verify-controls.py +6 -6
  5. package/deploy/verify-features.py +329 -19
  6. package/deploy/verify-jobs.py +264 -0
  7. package/deploy/verify-limits.py +22 -3
  8. package/deploy/verify-live.py +31 -6
  9. package/deploy/verify-output.py +208 -0
  10. package/deploy/verify-release.py +33 -4
  11. package/deploy/verify-run.py +571 -0
  12. package/deploy/verify-self-update.py +9 -1
  13. package/deploy/verify-sync.py +122 -0
  14. package/docs/benchmarks/read-latency-2026-10-29.json +70 -0
  15. package/docs/boat-capabilities.md +60 -7
  16. package/docs/boat-parity-design.md +1 -0
  17. package/docs/boot-performance.mdx +21 -0
  18. package/docs/contract.md +88 -13
  19. package/docs/first-box.mdx +22 -19
  20. package/docs/guides/background-jobs.mdx +38 -31
  21. package/docs/guides/backup-recovery.mdx +4 -3
  22. package/docs/guides/ci-jobs.mdx +209 -0
  23. package/docs/guides/config-policy.mdx +109 -35
  24. package/docs/guides/files.mdx +2 -2
  25. package/docs/guides/index.mdx +31 -0
  26. package/docs/guides/long-running-services.mdx +9 -3
  27. package/docs/guides/meta.json +7 -2
  28. package/docs/guides/project-setup.mdx +1 -1
  29. package/docs/guides/scripting-ci.mdx +36 -14
  30. package/docs/guides/snapshots-forks.mdx +4 -2
  31. package/docs/guides/troubleshooting.mdx +19 -2
  32. package/docs/guides/upgrades.mdx +11 -9
  33. package/docs/index.mdx +26 -28
  34. package/docs/maintainers/index.mdx +18 -0
  35. package/docs/maintainers/meta.json +12 -0
  36. package/docs/meta.json +5 -9
  37. package/docs/operations.mdx +17 -10
  38. package/docs/publishing.md +14 -4
  39. package/docs/reference/capacity.mdx +2 -1
  40. package/docs/reference/cli.md +135 -43
  41. package/docs/reference/configuration.mdx +10 -6
  42. package/docs/reference/meta.json +3 -1
  43. package/docs/releases/0.2.0.md +1 -0
  44. package/docs/releases/0.2.1.md +1 -0
  45. package/docs/releases/0.3.0.md +1 -0
  46. package/docs/releases/0.4.0.md +1 -0
  47. package/docs/releases/0.5.0.md +1 -0
  48. package/docs/releases/0.6.0.md +17 -0
  49. package/docs/releases/0.7.0.md +23 -0
  50. package/docs/releases/index.mdx +21 -0
  51. package/docs/releases/meta.json +15 -0
  52. package/docs/requirements.mdx +1 -1
  53. package/docs/reviews/docs-audit-2026-10-24.md +92 -0
  54. package/docs/reviews/performance-audit-2026-10-29.md +90 -0
  55. package/docs/site-development.md +1 -0
  56. package/docs/verification.mdx +22 -4
  57. package/package.json +3 -1
  58. package/raft.py +526 -193
  59. package/raft_files.py +13 -1
  60. package/raft_jobs.py +390 -0
  61. package/raft_output.py +166 -0
  62. package/raft_run.py +330 -0
  63. package/skills/raft-cli/SKILL.md +78 -182
@@ -0,0 +1,90 @@
1
+ # Performance and discovery audit, 2026-10-29
2
+
3
+ ## Scope and execution
4
+
5
+ The user approved performance fixes, confirmed dead-code removal, documentation
6
+ corrections, a discovery-driven Raft skill, current Boat parity research, and
7
+ verification in disposable task-owned workspaces. The follow-up request
8
+ authorizes committing, pushing, opening a ready-for-review PR and addressing
9
+ review feedback until ready. Production deployment, merging, releases and paid
10
+ provisioning remain outside scope.
11
+ Paid provisioning/research spending: not authorized.
12
+
13
+ Initial checkout was clean at `1fd6d62f`; Jujutsu was initialized colocated.
14
+ Primary agent: gpt-6-astra, high reasoning effort. Three read-only simplification
15
+ reviewers used gpt-6.1-sol with default reasoning. All reviewer jobs are complete.
16
+
17
+ ## Delivered changes
18
+
19
+ - List and capacity collect their data in one SSH connection per host. Doctor
20
+ runs its sequential checks in one connection and retains the worker lock.
21
+ Existing lifecycle and archive safety checks remain in place.
22
+ - Config and doctor accept a location filter, so an unrelated offline host does
23
+ not prevent inspection. Location-filtered default edits are refused.
24
+ - Command help explains behavior and operational constraints. All 38 command
25
+ help paths ran without configuration or writes to an empty controller home.
26
+ - The skill teaches version/help discovery, source lookup, host inspection,
27
+ ownership and cleanup rather than maintaining a command/software catalog.
28
+ The installed skill symlink now targets this repository's canonical skill;
29
+ the old openboat checkout was not edited. Discovery found run in the checkout
30
+ while the installed 0.6.0 command tree correctly omitted it.
31
+ - README examples select persistence explicitly and provide ownership notes.
32
+ Sizing, release notice timing and unreleased run status are corrected.
33
+ - The Boat comparison was refreshed from current official documentation,
34
+ including team sharing, environment versions, AI proxying, telemetry,
35
+ automatic snapshots and retained command history.
36
+
37
+ ## Measurements and verification
38
+
39
+ [Raw timings](../benchmarks/read-latency-2026-10-29.json) record five samples per
40
+ command/version on the same ARM64 Incus 6.0.6 host. Median reductions were 44%
41
+ for list, 43% for capacity and 76% for doctor. These are controller-visible read
42
+ latencies, not boot or guest workload speedups. Update checks were disabled.
43
+
44
+ Passed in the disposable workspace:
45
+
46
+ - Ruff lint and format checks across all Python sources and deployment scripts.
47
+ - Limits, image fixtures, CI orchestration and feature verifiers.
48
+ - Self-update verification through real temporary npm and uv installations.
49
+ - Source, wheel and npm packaging and isolated installation checks.
50
+ - Website Oxlint, Next.js build including TypeScript, search tests, and 37-page
51
+ export/link/search/download verification with 52 local links.
52
+
53
+ Real host checks also passed: batched versus independent native inventory and
54
+ policy reads; doctor and config scoped away from an unreachable inventory entry;
55
+ refusal of location-scoped controller-default edits without creating a file.
56
+ The discovery-guided one-shot job returned exit 7, collected its result file and
57
+ confirmed cleanup. No new mocks were introduced.
58
+
59
+ The initial test source archive omitted images and Git checkout metadata.
60
+ Correcting that disposable fixture fixed packaging and checkout-detection tests;
61
+ no assertions were weakened. A self-update HTTP timeout fixture logged an
62
+ expected broken pipe after its client disconnected; the verifier passed.
63
+
64
+ ## Cleanup and review
65
+
66
+ Task-owned workspaces `paris:rf-bf5bab8180464898` and
67
+ `paris:rf-61cc02e89fc54677` are confirmed absent. Paris inventory was empty after
68
+ cleanup. No background verification jobs or delegates remain active.
69
+
70
+ The reuse and efficiency reviewers reported no actionable findings. The quality
71
+ reviewer found two duplicated-constant sites; both now use the existing project
72
+ and storage constants. Superseded per-call SSH code was removed. Ruff and a
73
+ structural/reference scan found no additional safely removable Python functions;
74
+ graph candidates were parser callbacks, tests or framework entry points.
75
+
76
+ The passive update notice still has its documented bounded wait. Removing it
77
+ would change whether short commands display release notices. Metadata checks
78
+ before mutations remain because they establish ownership and eligibility.
79
+
80
+ ## Evidence limits
81
+
82
+ - Timings are a five-sample exploratory result from one host and network path.
83
+ - Boat capabilities were checked against official documentation, not its live
84
+ infrastructure. Dedicated organization docs describe sharing that older
85
+ overview/API text still describes as creator-private; the comparison notes it.
86
+ - Authenticated GitHub inspection confirmed v0.6.0 remains the latest published
87
+ release. These changes and run are development-branch work, not deployed.
88
+ - The shared fff index returned stale and unrelated results. Exact local reads
89
+ and the freshly built home-ubuntu-raft graph supplied code evidence instead.
90
+ - An unrelated configured host was unreachable; no configuration was changed.
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  title: Documentation site
3
+ description: Edit, build and test the Fumadocs site without touching workspace hosts.
3
4
  ---
4
5
 
5
6
  # Documentation site
@@ -1,16 +1,18 @@
1
1
  ---
2
2
  title: Verification
3
+ description: Read test evidence and run dedicated verification suites with explicit limits.
3
4
  ---
4
5
 
5
6
  # Verification
6
7
 
7
- Raft is verified using real disposable Incus workspaces, guest processes, files, Docker builds, and network connections. Tests contain no mocked services and verify Raft behavior rather than conformance with the hosted Boat service.
8
+ Raft is verified using real disposable Incus workspaces, guest processes, files, Docker builds, and network connections. Native suites exercise real services and verify Raft behavior rather than conformance with the hosted Boat service. Separate local worker and CI-orchestration fault fixtures are labeled below; they do not establish native-host behavior.
8
9
 
9
10
  ## Verification boundaries
10
11
 
11
12
  Tests do not certify arbitrary long-running workloads, host loss, multi-tenant security boundaries, or exact Boat image/version parity. ARM64 host reboot and physical storage capacity are not certified by the AMD64 VM test. Containers share the host kernel and do not offer VM isolation.
12
13
 
13
- Storage accounting covers shared pools rather than per-box quotas. Large backup transfers hold the host lifecycle lock, which delays expiration checks.
14
+ Shared-pool boxes have no per-box quota. Own-disk boxes have enforced ext4 limits
15
+ and reservation accounting; the coverage matrix distinguishes both modes. Large backup transfers hold the host lifecycle lock, which delays expiration checks.
14
16
 
15
17
  ## Coverage matrix
16
18
 
@@ -34,7 +36,7 @@ Storage accounting covers shared pools rather than per-box quotas. Large backup
34
36
  | Development image | Real developer-user tool checks, immutable selection and credential-path archive rejection |
35
37
  | Deployment/firewall | Repeat deployment removes stale rules without restarting Incus; failed filtering blocks normal and socket startup; boot timestamps prove filtering precedes Incus |
36
38
  | Storage contract | Disposable oversized pool is rejected without automatic resizing |
37
- | CLI options and errors | Help for all 34 commands and `host add`; default location, TTL and desktop port; all eight sizing profiles; global and per-location reports; invalid TTLs, sizes, required arguments, handles, paths, snapshot names, jobs and ports |
39
+ | CLI options and errors | Command help, including `run` and `host add`; default location, TTL and desktop port; all eight sizing profiles; global and per-location reports; invalid TTLs, sizes, required arguments, handles, paths, snapshot names, jobs and ports |
38
40
 
39
41
  ## Command and option audit (2026-10-06)
40
42
 
@@ -58,7 +60,7 @@ The [final runtime validation](https://github.com/Microck/raft/actions/runs/3754
58
60
 
59
61
  ## New workspace controls
60
62
 
61
- `python3 deploy/verify-features.py --location lab` verifies `doctor` readiness against the installed worker, recursive trees and unsafe-archive rejection, templates from a running source, snapshot deletion, CPU/RAM overrides, disposable timer deletion, retention preview/apply, and host note policies for `new`, `fork`, `note` and `recover` (it sets a policy on the host and clears it at the end). It uses only its own fixtures. Run the archive, controller-default and policy-message checks without `--location` to avoid allocating boxes.
63
+ `python3 deploy/verify-features.py --location lab` verifies `doctor` readiness against the installed worker, recursive trees and unsafe-archive rejection, templates from a running source, snapshot deletion, CPU/RAM overrides, disposable timer deletion, prune preview/apply, host note policies for `new`, `fork`, `note` and `recover`, and stopped-box retention: it sets a 1-hour policy, backdates one stopped box and the policy start, and checks that the next timer run deletes only that box, records the stop time of a box stopped natively and logs to the journal. It sets policies on the host and clears them at the end, and uses only its own fixtures. Every live suite runs the CLI in a private `HOME` holding only `incus.json`, so controller defaults such as `disposable true` never change their boxes. Run the archive, controller-default, policy-message and host worker retention checks without `--location` to avoid allocating boxes; the worker check runs the real worker against a fake `incus` on `PATH`.
62
64
 
63
65
  The live suite also holds a controller stdin pipe open while running real remote
64
66
  readers through both captured and streamed lifecycle transactions. Both must
@@ -241,3 +243,19 @@ On 2026-10-06, `raft limits` (since renamed `raft capacity`, with the admission
241
243
  Allocation fixtures validated mixed sizing budgets, frozen containers, low RAM and disk conditions, host reserves, and admission limits. The four-stopped-box admission test verified that creation, forking, and recovery reject a fifth container when slots are exhausted. These are conservative allocation checks, not workload saturation benchmarks.
242
244
 
243
245
  </details>
246
+
247
+ ## Disposable CI command verification
248
+
249
+ `python3 deploy/verify-run.py` runs explicit orchestration fault-injection tests,
250
+ real Linux signal/deadline handling, real Git filtering and safe archive traversal,
251
+ and the actual ownership-check cleanup program against an isolated fake Incus
252
+ executable. These are not native-host evidence. They cover failed/uncertain
253
+ creation, upload failures, nonzero payload preservation, artifacts, cleanup
254
+ failures, cancellation, timeouts, existing destinations and ignored credentials.
255
+
256
+ `python3 deploy/verify-run.py --location lab` additionally creates real temporary
257
+ boxes on the explicitly selected host, uploads a source tree, executes successful
258
+ and failing commands, retrieves result directories, checks timeout cleanup and
259
+ compares the host inventory before/after. Native AMD64 and ARM64 image CI runs
260
+ this suite. A new PR must have those actual runs pass before claiming native
261
+ verification; local fault-injection success alone does not establish it.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microck/raft",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Self-hosted Linux workspaces powered by Incus, an open-source alternative to boat.dev",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -20,6 +20,8 @@
20
20
  "files": [
21
21
  "raft.py",
22
22
  "raft_files.py",
23
+ "raft_run.py",
24
+ "raft_jobs.py", "raft_output.py",
23
25
  "deploy/*.py",
24
26
  "deploy/*.sh",
25
27
  "deploy/*.conf",