docs: add development and release standards
This commit is contained in:
1 parent
36a0caecd8
commit
72ad19a071
7 files changed
+458
No files matched your search
@@ -0,0 +1,142 @@
|
|||||||
|
# MinerOps Coding Standards
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
This document defines the engineering conventions for MinerOps. Task specifications may add feature-specific requirements, but they should not weaken these standards without an explicit architectural decision.
|
||||||
|
|
||||||
|
## Core Principles
|
||||||
|
|
||||||
|
1. Prefer explicit domain operations over generic CRUD.
|
||||||
|
2. Preserve operational history.
|
||||||
|
3. Enforce critical invariants in PostgreSQL.
|
||||||
|
4. Keep operations atomic.
|
||||||
|
5. Separate network identity from durable asset identity.
|
||||||
|
6. Use server-controlled timestamps and authenticated actor identities.
|
||||||
|
7. Design for self-hosted deployment and safe recovery.
|
||||||
|
8. Prefer clear, maintainable code over clever abstractions.
|
||||||
|
9. Keep each implementation task focused and reviewable.
|
||||||
|
10. Treat safety as more important than convenience for actions affecting miners.
|
||||||
|
|
||||||
|
## Layered Architecture
|
||||||
|
|
||||||
|
```text
|
||||||
|
Router
|
||||||
|
-> Service
|
||||||
|
-> Repository
|
||||||
|
-> PostgreSQL
|
||||||
|
```
|
||||||
|
|
||||||
|
### Router
|
||||||
|
|
||||||
|
Routers may define HTTP routes, validate requests, enforce authentication and permissions, and serialize responses.
|
||||||
|
|
||||||
|
Routers must not contain SQL, manage transactions, implement domain decisions, import database drivers directly, or bypass the service layer.
|
||||||
|
|
||||||
|
### Service
|
||||||
|
|
||||||
|
Services implement domain workflows, coordinate repositories, enforce domain rules, and raise domain exceptions.
|
||||||
|
|
||||||
|
Services must not import FastAPI, raise HTTP-specific exceptions, contain raw SQL, or trust actor identity supplied in request bodies.
|
||||||
|
|
||||||
|
### Repository
|
||||||
|
|
||||||
|
Repositories own database queries, row locking, persistence details, and PostgreSQL-specific integrity behavior.
|
||||||
|
|
||||||
|
Repositories must not import FastAPI, make permission decisions, define HTTP behavior, or commit independently inside a larger service transaction.
|
||||||
|
|
||||||
|
## Domain Operations
|
||||||
|
|
||||||
|
Use explicit operations such as:
|
||||||
|
|
||||||
|
```http
|
||||||
|
POST /api/repairs
|
||||||
|
POST /api/repairs/{repair_id}/complete
|
||||||
|
POST /api/miners/{miner_id}/move
|
||||||
|
POST /api/miners/{miner_id}/replace-control-board
|
||||||
|
```
|
||||||
|
|
||||||
|
Only `POST /api/repairs` is implemented by the modular Repairs domain today.
|
||||||
|
The other routes are illustrative names for possible future explicit workflows,
|
||||||
|
not existing API contracts.
|
||||||
|
|
||||||
|
Avoid broad mutable CRUD endpoints when the request represents a meaningful operational event.
|
||||||
|
|
||||||
|
## Transactions and Concurrency
|
||||||
|
|
||||||
|
Any workflow that changes multiple authoritative records must execute atomically.
|
||||||
|
|
||||||
|
Use row locks and database constraints when concurrent requests could violate an invariant. Do not rely only on pre-insert application checks when PostgreSQL can enforce the rule.
|
||||||
|
|
||||||
|
## Database Integrity
|
||||||
|
|
||||||
|
Use constraints for uniqueness, valid state combinations, referential integrity, one-active-record rules, event-sequence integrity, and actor/timestamp requirements.
|
||||||
|
|
||||||
|
Operational history should generally use `RESTRICT` rather than disappearing through cascades.
|
||||||
|
|
||||||
|
Every migration must support upgrade, safe downgrade or explicit refusal, previous-head testing, re-upgrade, and empty-database-through-head validation. A downgrade must never invent historical values.
|
||||||
|
|
||||||
|
## Identity
|
||||||
|
|
||||||
|
A miner's durable identity must not depend on its current IP address, MAC address, control board, hostname, or location.
|
||||||
|
|
||||||
|
Network identifiers are observations or replaceable hardware attributes and must retain history.
|
||||||
|
|
||||||
|
Actor identity must come from the authenticated principal, never an authoritative request-body field.
|
||||||
|
|
||||||
|
## Time
|
||||||
|
|
||||||
|
Use timezone-aware timestamps. Authoritative operational timestamps are server- or database-controlled. Never use timestamp order as a substitute for an explicit event sequence.
|
||||||
|
|
||||||
|
## Immutable Operational History
|
||||||
|
|
||||||
|
Timeline and audit events are append-only. Once written, an event is never edited, deleted, reordered, or silently replaced. Corrections are new events.
|
||||||
|
|
||||||
|
Sequenced domain timeline events should include an event UUID, parent UUID,
|
||||||
|
sequence, event type, actor UUID, timestamp, and structured JSON payload.
|
||||||
|
|
||||||
|
## API Design
|
||||||
|
|
||||||
|
- Use UUID types for UUID fields.
|
||||||
|
- Use constrained domain values.
|
||||||
|
- Use 404 for missing resources, 409 for state conflicts, 422 for invalid input, and established project behavior for 401 and 403.
|
||||||
|
- Do not expose internal fields without a product requirement.
|
||||||
|
- Keep routes focused.
|
||||||
|
- Protect existing static routes when introducing parameter routes.
|
||||||
|
|
||||||
|
## Permissions
|
||||||
|
|
||||||
|
Permissions describe capabilities, not roles. Implemented examples include
|
||||||
|
`repairs.read` and `repairs.create`. Names such as `repairs.complete` and
|
||||||
|
`miners.move` illustrate possible future capabilities and are not currently
|
||||||
|
registered permissions.
|
||||||
|
|
||||||
|
Every protected route requires unauthenticated, unauthorized, and authorized-role tests. Read-only roles may view history but may not perform actions.
|
||||||
|
|
||||||
|
## Testing and Validation
|
||||||
|
|
||||||
|
Feature work should cover happy paths, validation, permissions, missing records, conflicts, rollback, concurrency where relevant, constraints, migrations, route compatibility, and architecture boundaries.
|
||||||
|
|
||||||
|
Unless a task says otherwise, run:
|
||||||
|
|
||||||
|
- Python compilation
|
||||||
|
- shell syntax validation
|
||||||
|
- focused tests
|
||||||
|
- relevant regression suites
|
||||||
|
- migration upgrade, downgrade, re-upgrade, and empty database
|
||||||
|
- disposable development baseline
|
||||||
|
- router SQL/driver/transaction audit
|
||||||
|
- service/repository FastAPI audit
|
||||||
|
- route-count audit
|
||||||
|
- `git diff --check`
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
Never commit credentials, tokens, environment files, dumps, private configuration, caches, or local database data. Do not log secrets. Apply least privilege and preserve audit history for sensitive actions.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Every implementation task should have a version-controlled specification under `docs/tasks/`. Update roadmaps only after validation passes. Add an ADR only for a genuinely new architectural principle.
|
||||||
|
|
||||||
|
## Review Checklist
|
||||||
|
|
||||||
|
Before approval, confirm scope, transaction boundaries, database invariants, actor attribution, timestamps, immutable history, permissions, migrations, regressions, route behavior, performance risks, and the reviewed file set.
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
# Contributing to MinerOps
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
```text
|
||||||
|
Product decision
|
||||||
|
-> Task specification
|
||||||
|
-> Implementation
|
||||||
|
-> Architecture review
|
||||||
|
-> Focused review and fixes
|
||||||
|
-> Commit
|
||||||
|
-> Push
|
||||||
|
```
|
||||||
|
|
||||||
|
Substantial work should begin from an approved specification in `docs/tasks/`.
|
||||||
|
|
||||||
|
## Before Starting
|
||||||
|
|
||||||
|
1. Confirm repository, branch, working tree, and expected latest commit.
|
||||||
|
2. Read the architecture, product, decisions, coding standards, task
|
||||||
|
specification, and relevant release planning document when one exists.
|
||||||
|
3. Confirm the current Alembic head.
|
||||||
|
4. Report material conflicts before deviating.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
Each task should implement one coherent feature. Adjacent ideas belong in later tasks rather than being bundled into the current change.
|
||||||
|
|
||||||
|
## Branches and Commits
|
||||||
|
|
||||||
|
Do not force-push, rebase shared branches, amend approved commits, or mix unrelated work without explicit approval.
|
||||||
|
|
||||||
|
Use concise conventional commit messages, for example:
|
||||||
|
|
||||||
|
```text
|
||||||
|
feat: add begin repair workflow
|
||||||
|
feat: add repair timeline read APIs
|
||||||
|
fix: restore lifecycle during repair downgrade
|
||||||
|
docs: add MinerOps coding standards
|
||||||
|
```
|
||||||
|
|
||||||
|
Commit only after implementation, validation, review, and file-set confirmation.
|
||||||
|
|
||||||
|
## Completion Report
|
||||||
|
|
||||||
|
Report files created and modified, migrations, routes, permissions, domain behavior, test counts, validation results, risks, and final `git status --short`.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
Follow `docs/CODING_STANDARDS.md` and preserve:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Router -> Service -> Repository -> PostgreSQL
|
||||||
|
```
|
||||||
|
|
||||||
|
Use explicit operational APIs and immutable history.
|
||||||
|
|
||||||
|
## Migrations
|
||||||
|
|
||||||
|
Validate previous head to new head, downgrade, re-upgrade, empty database through head, constraints, indexes, permission assignments, and transactional failure behavior.
|
||||||
|
|
||||||
|
## Review
|
||||||
|
|
||||||
|
Review for scope creep, hidden CRUD, incorrect transactions, application-only invariants, unsafe downgrades, route shadowing, permission regressions, loss of history, N+1 queries, concurrency gaps, and accidental sensitive files.
|
||||||
|
|
||||||
|
## AI-Assisted Work
|
||||||
|
|
||||||
|
AI tools must inspect the repository, follow the task, preserve conventions, report conflicts, run validation, avoid commits and pushes unless instructed, and provide a complete report. Human approval is still required.
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
# MinerOps v0.2: Repair Workflow
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Planning document. The version label and remaining scope are provisional and do
|
||||||
|
not override the current version summary in `README.md` or phase ordering in
|
||||||
|
`docs/ROADMAP.md`.
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Deliver a complete, auditable repair lifecycle based on durable miner identity
|
||||||
|
and immutable history.
|
||||||
|
|
||||||
|
## Completed
|
||||||
|
|
||||||
|
- [x] Begin Repair (`POST /api/repairs`)
|
||||||
|
- [x] Repair detail and timeline read APIs
|
||||||
|
|
||||||
|
## Planned
|
||||||
|
|
||||||
|
- [ ] Return to Service
|
||||||
|
- [ ] Control Board Replacement
|
||||||
|
- [ ] Repair Parts Tracking
|
||||||
|
|
||||||
|
These planned items refer to explicit workflows in the modular Repairs domain.
|
||||||
|
Existing legacy repair, maintenance, location, and parts-summary behavior does
|
||||||
|
not make these workflows complete.
|
||||||
|
|
||||||
|
## Definition of Done
|
||||||
|
|
||||||
|
- all planned tasks are implemented
|
||||||
|
- repair actions are atomic
|
||||||
|
- history is immutable
|
||||||
|
- actor and timestamps are authoritative
|
||||||
|
- critical invariants are enforced in PostgreSQL
|
||||||
|
- migration lifecycle tests pass
|
||||||
|
- repair and inventory regressions pass
|
||||||
|
- no generic repair CRUD is introduced
|
||||||
|
- operator behavior is documented
|
||||||
|
- the release candidate is built from a clean, reproducible repository state
|
||||||
|
|
||||||
|
## Candidate Task Order
|
||||||
|
|
||||||
|
1. `003-return-to-service.md`
|
||||||
|
2. `004-control-board-replacement.md`
|
||||||
|
3. `005-repair-parts-tracking.md`
|
||||||
|
|
||||||
|
These are proposed future files under `docs/tasks/`. They do not exist yet and
|
||||||
|
must not be treated as approved specifications until they are created and
|
||||||
|
reviewed.
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
# MinerOps v0.3: Operations
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Planning document. The version label and candidate scope are provisional and do
|
||||||
|
not override the current version summary in `README.md` or phase ordering in
|
||||||
|
`docs/ROADMAP.md`.
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Add safe operational control for individual miners and groups while preserving
|
||||||
|
guardrails and auditability.
|
||||||
|
|
||||||
|
## Candidate Scope
|
||||||
|
|
||||||
|
- [ ] Miner move workflow
|
||||||
|
- [ ] Maintenance mode
|
||||||
|
- [ ] Bulk tagging and location updates
|
||||||
|
- [ ] Safe reboot and shutdown
|
||||||
|
- [ ] Scheduled actions
|
||||||
|
- [ ] Staggering and cooldown controls
|
||||||
|
- [ ] Action history
|
||||||
|
- [ ] Partial-failure reporting
|
||||||
|
- [ ] Role-based action permissions
|
||||||
|
|
||||||
|
This scope spans the roadmap's Operations and Fleet Control phases. Inventory,
|
||||||
|
identity, maintenance context, and monitoring dependencies remain governed by
|
||||||
|
`docs/ROADMAP.md`.
|
||||||
|
|
||||||
|
The repository already contains early-stage legacy movement, command,
|
||||||
|
scheduling, and action-status behavior. Unchecked items mean the modular,
|
||||||
|
permissioned, fully validated product workflow remains planned; they do not
|
||||||
|
claim that no related code exists.
|
||||||
|
|
||||||
|
## Definition of Done
|
||||||
|
|
||||||
|
Actions are explicit, permissioned, audited, safety-limited, recoverable, and
|
||||||
|
tested for authorization, concurrency, retries, and partial failure.
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
# MinerOps v0.4: Monitoring
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Planning document. The version label and candidate scope are provisional and do
|
||||||
|
not override the current version summary in `README.md` or phase ordering in
|
||||||
|
`docs/ROADMAP.md`.
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Provide reliable current-state and historical visibility across the fleet.
|
||||||
|
|
||||||
|
## Candidate Scope
|
||||||
|
|
||||||
|
- [ ] Configurable discovery
|
||||||
|
- [ ] MAC-based asset reconciliation
|
||||||
|
- [ ] Miner status and telemetry
|
||||||
|
- [ ] Historical retention
|
||||||
|
- [ ] Fleet dashboard
|
||||||
|
- [ ] Room, rack, model, and electrical summaries
|
||||||
|
- [ ] Alert generation and lifecycle
|
||||||
|
- [ ] Notification integrations
|
||||||
|
|
||||||
|
Discovery and network reconciliation depend on the roadmap's Inventory &
|
||||||
|
Identity phase, while electrical summaries depend on Infrastructure. Their
|
||||||
|
presence here does not change those dependencies.
|
||||||
|
|
||||||
|
The repository already contains early-stage discovery, telemetry, retention,
|
||||||
|
dashboard, and infrastructure-summary foundations. Unchecked items describe
|
||||||
|
work needed for a coherent, supported monitoring product rather than an absence
|
||||||
|
of related implementation.
|
||||||
|
|
||||||
|
## Definition of Done
|
||||||
|
|
||||||
|
Observations remain distinct from authoritative inventory, stale data is
|
||||||
|
explicit, discovery does not blindly create assets, retention is documented,
|
||||||
|
alerts are auditable, and monitoring failures cannot corrupt inventory or
|
||||||
|
repair history.
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# MinerOps v1.0
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Planning document. The version label is provisional. This file describes release criteria, not current
|
||||||
|
capabilities or a delivery commitment. It does not override the current version
|
||||||
|
summary in `README.md` or phase ordering and completion status in
|
||||||
|
`docs/ROADMAP.md`.
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Deliver a production-ready, self-hosted operating platform for cryptocurrency
|
||||||
|
mining operations.
|
||||||
|
|
||||||
|
## Release Themes
|
||||||
|
|
||||||
|
- durable inventory and identity
|
||||||
|
- complete repair workflow
|
||||||
|
- safe operational controls
|
||||||
|
- monitoring and alerting
|
||||||
|
- work orders and maintenance
|
||||||
|
- spare parts and component history
|
||||||
|
- electrical mapping
|
||||||
|
- backup, restore, and migration
|
||||||
|
- security, roles, and auditability
|
||||||
|
- documented deployment and upgrades
|
||||||
|
|
||||||
|
## Production Readiness
|
||||||
|
|
||||||
|
v1.0 requires tested backup and restore, safe migrations, health checks,
|
||||||
|
reproducible deployment, encrypted credential handling, HTTPS guidance,
|
||||||
|
database-backed integrity, documented regression coverage for critical
|
||||||
|
workflows, performance testing at representative fleet size, release notes, and
|
||||||
|
documented limitations.
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
# Task NNN: Feature Name
|
||||||
|
|
||||||
|
## Objective
|
||||||
|
|
||||||
|
Describe the operational outcome.
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Summarize relevant current behavior and dependencies.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
List exactly what is included.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
Define every route, request, response, permission, and status code.
|
||||||
|
|
||||||
|
## Permissions
|
||||||
|
|
||||||
|
Define capabilities and role assignments.
|
||||||
|
|
||||||
|
## Domain Rules
|
||||||
|
|
||||||
|
List invariants and lifecycle rules.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
Preserve:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Router -> Service -> Repository -> PostgreSQL
|
||||||
|
```
|
||||||
|
|
||||||
|
## Database and Migration
|
||||||
|
|
||||||
|
Define schema changes, constraints, indexes, migration order, and downgrade behavior.
|
||||||
|
|
||||||
|
## Events and History
|
||||||
|
|
||||||
|
Define immutable events, sequence, actor, timestamp, and structured payload.
|
||||||
|
|
||||||
|
## Models and Validation
|
||||||
|
|
||||||
|
Define UUID, time, enum, normalization, length, and JSON requirements.
|
||||||
|
|
||||||
|
## Repository Requirements
|
||||||
|
|
||||||
|
Define focused query and locking behavior. Avoid N+1 queries and generic CRUD.
|
||||||
|
|
||||||
|
## Service Requirements
|
||||||
|
|
||||||
|
Define validation, workflow, transaction boundaries, and domain exceptions.
|
||||||
|
|
||||||
|
## Router Requirements
|
||||||
|
|
||||||
|
Define dependencies, exception mapping, and route-count constraints.
|
||||||
|
|
||||||
|
## Error Behaviour
|
||||||
|
|
||||||
|
Define 401, 403, 404, 409, 422, and any additional statuses.
|
||||||
|
|
||||||
|
## Concurrency and Atomicity
|
||||||
|
|
||||||
|
Describe races and database enforcement.
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
Cover authorization, domain behavior, rollback, constraints, migrations, regressions, routing, and architecture audits.
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
Run compilation, shell validation, focused and regression tests, migration lifecycle tests, disposable baseline, architecture audits, route audit, and `git diff --check`.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
List required roadmap, release, API, or operator documentation.
|
||||||
|
|
||||||
|
## Explicitly Out of Scope
|
||||||
|
|
||||||
|
List adjacent features that must not be added.
|
||||||
|
|
||||||
|
## Completion Report
|
||||||
|
|
||||||
|
Report files, migration, routes, permissions, tests, validation, limitations, and final `git status --short`.
|
||||||
|
|
||||||
|
Do not commit.
|
||||||
|
Do not push.
|
||||||
Reference in new issue
Block a user