doctor docs

This commit is contained in:
Dobromir Popov
2026-07-09 23:41:11 +03:00
parent 3d264a500a
commit 81057dd795
11 changed files with 412 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
Status: ready-for-agent
# 01 — Generic capability and recipe report
## What to build
Create a model-agnostic node capability domain object and local versioned recipe-manifest reader. It must represent a selected Model Artifact identity/revision/config fingerprint, Shard range, named recipe ID/version, device/backend identity, validation timestamp/duration, success/failure state, and sanitized diagnostics.
Do not add Qwen-, FLA-, Triton-, CUDA-, ROCm-, or vendor-specific branches. A recipe is generic data; specific runtime behavior remains in the existing backend.
**Code refs:**
- `packages/node/meshnet_node/model_catalog.py` — existing generic HF config/model metadata helpers
- `packages/node/meshnet_node/hardware.py` — device identity/executability inventory
- `packages/node/meshnet_node/model_backend.py` — model/shard loading path
- `packages/node/pyproject.toml` — package data declarations
## Test-first
1. Write a unit test building reports for two arbitrary fixture model IDs and asserting no model-specific normalization/branch is required.
2. Write a manifest-version validation test: valid local manifest loads; malformed/unknown schema produces actionable non-secret diagnostics.
3. Implement the smallest schema, serialization, and local manifest reader needed by later stories.
## Acceptance criteria
- [ ] Capability report has a stable JSON-serializable schema with model identity/fingerprint, shard range, recipe ID/version, backend/device identity, status, timing, and sanitized diagnostic fields
- [ ] Generic arbitrary model IDs are preserved; no Qwen or optional-kernel name is a product default or code-path discriminator
- [ ] Local recipe manifest has an explicit schema/catalogue version
- [ ] Malformed manifest/report input fails locally with actionable diagnostics and never leaks environment secrets
- [ ] Unit tests cover serialization, schema validation, and model-agnostic behavior
## Blocked by
None.

View File

@@ -0,0 +1,35 @@
Status: ready-for-agent
# 02 — Doctor selected model/shard with a bounded real forward
## What to build
Add `meshnet-node doctor`. By default it validates only the selected Model Artifact and Shard from flags/config. Reuse the production model-loading/backend execution path and execute a bounded real forward through the selected Shard; a generic Torch allocation or synthetic benchmark is insufficient.
It emits concise human output plus capability-report JSON. Add explicit `--all-recipes` plumbing for support/CI without making ordinary startup validate unrelated/downloaded models. The default tests must inject a fake/lightweight backend; a real-model test is integration-marked and environment-gated with model identity supplied externally.
**Code refs:**
- `packages/node/meshnet_node/cli.py` — subcommand parser and config/flag resolution
- `packages/node/meshnet_node/model_backend.py``TorchModelShard`, `encode_prompt`, `forward_bytes`
- `packages/node/meshnet_node/torch_server.py` — production backend construction
- `tests/test_node_startup.py`, `tests/test_real_model_backend.py` — startup/backend test patterns
## Test-first
1. Red: `doctor` reports generic hardware availability as ready without invoking model validation.
2. Red: an injected backend forward failure still produces a success capability.
3. Green: selected model/shard invokes one bounded generic forward and yields success only on completion.
4. Add an `integration`-marked, env-gated test whose model ID/source is configurable; it has no model-specific default.
## Acceptance criteria
- [ ] `meshnet-node doctor` resolves the same selected model/shard/config path as startup
- [ ] Default doctor performs a bounded real forward through the selected shard before reporting success
- [ ] `--all-recipes` is explicit and does not change default onboarding cost
- [ ] Failure returns non-zero, writes a failed capability report, and prints a user-actionable category without raw traceback by default
- [ ] Unit tests require no GPU or model download; a separately marked integration smoke test is model-configurable
## Blocked by
`01-generic-capability-report.md`.

View File

@@ -0,0 +1,34 @@
Status: ready-for-agent
# 03 — Fail-closed startup admission lifecycle
## What to build
Gate `run_startup` on a fresh, matching successful capability report before routable Tracker registration. A Node selected for a Model Preset/shard must fail closed if its recipe cannot perform the doctor forward: no ready/registered endpoint and no paid request acceptance.
Keep local diagnostic behavior useful: a failed report may be persisted/exposed locally, but the Node must not advertise the failed model/shard as ready. Define a bounded freshness/match rule so a report cannot be reused for a different model revision, shard, recipe, or backend identity.
**Code refs:**
- `packages/node/meshnet_node/startup.py` — download/load/start/register sequence
- `packages/node/meshnet_node/cli.py``start` and default startup error paths
- `packages/node/meshnet_node/torch_server.py` — server lifecycle
- `tests/test_node_startup.py` — fake startup and registration capture patterns
## Test-first
1. Red: backend validation failure still causes `/v1/nodes/register` to be called.
2. Red: a success report for one arbitrary model/shard is reused for another.
3. Green: matching successful validation reaches registration; failed/stale/mismatched validation exits before registration.
## Acceptance criteria
- [ ] Explicit selected model/shard fails closed before routable registration when validation fails
- [ ] Startup sends only a matching successful capability report with its registration payload
- [ ] Failed, stale, model-mismatched, shard-mismatched, recipe-mismatched, and backend-mismatched reports are rejected locally
- [ ] Existing stub/test startup remains usable through an explicit test-safe capability path, not a production bypass
- [ ] Tests prove the tracker receives no registration on a failed validation
## Blocked by
`01-generic-capability-report.md`, `02-doctor-real-forward.md`.

View File

@@ -0,0 +1,34 @@
Status: ready-for-agent
# 04 — Tracker validated-capability registration and routing gate
## What to build
Extend Node registration, tracker state, network-map visibility, and route selection so a candidate is eligible only when it presents a successful capability report matching the route Model Artifact and Shard. Treat recipe/backend/capability data as evidence, not a trusted performance assertion. Preserve legacy behavior only through an explicit, documented compatibility policy; no new paid route may rely on an absent proof once admission is enforced.
**Code refs:**
- `packages/tracker/meshnet_tracker/server.py``/v1/nodes/register`, tracker node state, route selection, network map
- `tests/test_tracker_routing.py` — registration and route tests
- `packages/node/meshnet_node/startup.py` — registration payload producer
- `docs/adr/0011-auto-shard-and-network-assignment.md` — tracker-owned assignment context
- `docs/adr/0013-rolling-stats-smart-routing.md` — performance routing context
## Test-first
1. Red: a node with no/failed/mismatched capability report can register as route-eligible for a model/shard.
2. Red: route selection includes a candidate whose report is for a different arbitrary model or shard.
3. Green: valid matching candidates route normally; network map exposes only sanitized admission status.
## Acceptance criteria
- [ ] Registration validates the generic capability-report schema and records sanitized capability state
- [ ] Route selection excludes invalid, absent, failed, stale, model-mismatched, shard-mismatched, recipe-mismatched, or catalogue-version-incompatible candidates
- [ ] Valid matching candidates retain normal coverage-first and throughput routing behavior
- [ ] Network map/operator view exposes an actionable admission state without raw exceptions or secrets
- [ ] Protocol compatibility policy for older Nodes is tested and documented
- [ ] Deterministic tracker tests cover arbitrary model IDs, not a Qwen fixture
## Blocked by
`01-generic-capability-report.md`, `03-fail-closed-startup-admission.md`.

View File

@@ -0,0 +1,34 @@
Status: ready-for-agent
# 05 — Model-agnostic operator documentation and hardware-lane contract
## What to build
Document the capability-admission lifecycle, `doctor` usage, failure states, model-agnostic recipe semantics, and the certified hardware-lane release check. Correct setup guidance so it does not imply that an optional accelerator path is universally supported merely because a package can be installed.
Use generic commands/placeholders in primary docs. Any concrete model used for development belongs in a clearly labelled optional example or environment-gated test configuration, never a support guarantee.
**Code refs:**
- `QUICKSTART.md` — node installation/ROCm/optional-backend guidance
- `packages/node/meshnet_node/cli.py` — doctor user-facing output
- `docs/adr/0023-model-agnostic-node-capability-admission.md`
- `tests/test_node_startup.py`, `tests/test_real_model_backend.py` — integration marker conventions
## Test-first / verification
1. Add tests for concise doctor output/category mapping where practical.
2. Verify documentation commands use the generic selected-model interface and explain the distinction between validated versus merely detected hardware.
3. Add a release-CI runbook contract for an opt-in `integration` doctor run per certified hardware lane, with model identity supplied by CI configuration.
## Acceptance criteria
- [ ] Docs explain that readiness requires a successful real-forward capability report
- [ ] Docs distinguish detected hardware, validated recipe, and routable Node states
- [ ] Docs make no model/vendor/optional-kernel universal support promise
- [ ] Certified-lane CI contract is documented, including model-configurable integration environment and expected evidence
- [ ] Signed Node updates are listed as a follow-up; P0 is explicit that it does not dynamically install executable recipes or system dependencies
## Blocked by
`02-doctor-real-forward.md`, `04-tracker-validated-capability-routing.md`.