This repository now treats Observer as a specification set, not a single mixed draft.
The current material is a coherent v0 draft intended to turn the original seed idea into a deliverable platform shape.
Observer is an opinionated verification platform.
It is universal in a constrained, deliberate sense:
- tests from multiple ecosystems can register through provider libraries
- discovery lowers into one canonical inventory contract
- suites select from inventory and declare expectations
- the runner executes those suites with deterministic ordering and structured reporting
Observer is not trying to be every testing tool at once. It defines one strong verification model and expects integrations to map into that model.
That model is shared at the semantic boundary, not necessarily at the author-facing syntax boundary. Different language integrations may expose different test-authoring surfaces as long as they lower into the same deterministic platform contract.
Observer has two authoring surfaces:
- a simple surface for the common case
- a full script surface for high-rigor testing
These are not two separate engines.
Both surfaces lower to one canonical suite core. That is the central design rule that keeps Observer coherent.
Observer consists of these layers:
- provider libraries used by language ecosystems such as C, Rust, and Node.js
- provider hosts that expose deterministic list and run operations to Observer
- inventory as the canonical execution contract
- suites that express test intent through simple or full-script surfaces
- runner and report machinery that execute and record outcomes
- product certification that combines ordered suite stages into one product verdict
The current draft locks these priorities:
- deterministic behavior
- canonical inventory and case identity
- one semantic core for simple and advanced verification
- explicit observation and failure handling
- structured machine-readable reporting
- product certification as a first-class platform layer
The normative direction of the platform is split across these documents:
- architecture: specs/00-architecture.md
- provider discovery and execution: specs/10-provider.md
- provider resolution and workspace configuration: specs/11-provider-resolution.md
- Rust provider determinism gate: specs/12-rust-provider-determinism.md
- provider authoring surface: specs/13-provider-authoring.md
- inventory contract: specs/20-inventory.md
- normalization and hashing: specs/25-normalization.md
- suite model and language surfaces: specs/30-suite.md
- runner and reporting: specs/40-reporting.md
- analytics and telemetry proposal: specs/41-analytics.md
- developer console UX proposal: specs/42-console-ui.md
- build analytics and knowledge package proposal: specs/43-build-analytics.md
- build explorer UX proposal: specs/44-build-explorer-ui.md
- multi-build analytics and comparison proposal: specs/45-multi-build-analytics.md
- build comparison explorer UX proposal: specs/46-build-compare-explorer-ui.md
- build comparison-index explorer UX proposal: specs/47-build-compare-index-explorer-ui.md
- analytics implementation milestones: specs/48-analytics-implementation-milestones.md
- analytics Rust module plan: specs/49-analytics-rust-module-plan.md
- workflow verification proposal: specs/50-workflow-verification.md
- product certification proposal: specs/60-product-certification.md
- CMake product-model ingestion draft: specs/61-cmake-product-model-ingestion.md
Examples and intent sketches live in:
- examples: specs/90-examples.md
- sample cube fixture: specs/91-build-cube-sample.json
- sample comparison fixture: specs/92-build-compare-sample.json
- invalid report fixture: specs/93-invalid-report-sample.jsonl
- invalid cube fixture: specs/94-invalid-cube-sample.json
- invalid compare metadata fixture: specs/96-invalid-compare-meta.json
- invalid compare relation-kind fixture: specs/97-invalid-compare-relation-kind.json
- sample compare metadata fixture: specs/98-build-compare-meta-sample.json
- sample compare index fixture: specs/99-build-compare-index-sample.json
- invalid compare-index empty fixture: specs/100-invalid-compare-index-empty.json
- invalid compare-index duplicate-build-id fixture: specs/101-invalid-compare-index-duplicate-build-id.json
- reference implementation plan: specs/95-reference-implementation.md
The earlier single-file draft mixed together:
- seed ideas
- candidate syntax
- normative rules
- examples from different design generations
This spec set separates those concerns.
The main architectural lock-ins are:
- provider discovery is the source of language-native tests
- inventory is the canonical intermediate representation
- simple tests are sugar over the same core model as the full script surface
- case identity is suite item plus inventory test name
- product certification is a top-level contract above suites, not shell glue around suites
- reports distinguish canonical fields from volatile fields
- analytics is observational and non-canonical by default
This draft does not attempt to finalize:
- every concrete surface syntax detail
- plugin ecosystems or arbitrary extension hooks
- broad compatibility shims for all existing test runners
The goal here is stronger: lock the platform shape first, then refine syntax and integrations on top of that shape.
The intended category is not "just another test runner".
Observer can execute tests, but its defining concern is broader:
- explicit discovery and execution contracts
- deterministic and canonical verification artifacts
- staged product certification
- derived analytics and comparison artifacts
- operational truth that can live above language-local test frameworks