Release Boundary
May 27, 2026 ยท View on GitHub
Locked Product Boundary
Faultline uses an open-core product boundary:
- Core (free): "What failed?"
- Team (paid): "What keeps failing, who owns it, and what do we do about it?"
This boundary is intentional and should remain stable unless explicitly revised.
Core (free)
Core remains local-first, deterministic, and useful on a single log without team state.
Core includes:
- CLI analysis surfaces (
analyze,batch,workflow,list,explain,fix) - deterministic playbook matching and ranking
- local playbook system and pack composition
- opt-in single-repo local history and forensic recall
- thin diff and deterministic artifact generation
Core may include persistence when it remains local and scoped to a single repository. If a feature depends on cross-repo state, organizational coordination, hosted context, or correlation across multiple repositories, it should not be presented as part of the free default story.
Team (paid)
Team is the coordination and memory layer across repeated runs, repositories, and engineers.
Team includes:
- failure history and aggregation across runs
- recurring failure detection over time
- cross-repo correlation and ownership-aware recurrence
- org-level policy enforcement
- shared playbook layering (org base + repo override)
- managed execution context
- aggregated reporting and trend insights
- stable integration contracts, schema versioning, and sync surfaces
Team is the thing sold and billed, not the individual command user. The CLI may stay local-first, but the paid value comes from persistent coordination state tied to a team context.
Rule of thumb:
- If a feature works on one log or within one repository without cross-repo correlation, it belongs in Core.
- If a feature aggregates, correlates across repositories, coordinates, enforces, or learns across team-wide runs, it belongs in Team.
Faultline ships a deliberately narrow default experience for the next release:
- Diagnose a failing CI log with
faultline analyze - Diagnose several local CI logs with
faultline batch - Inspect a local source tree with
faultline inspect - Turn the winning diagnosis into a deterministic handoff with
faultline workflow - Inspect the bundled catalog with
faultline listandfaultline explain - Use
faultline fixwhen only the top remediation steps are needed
Everything else should either be a bounded companion surface with explicit verification or a hidden maintainer workflow.
report remains a bounded companion surface: useful after stored local runs
exist, but not part of the first-run diagnosis narrative.
Team commands and Team-enriched modes are intentionally outside this default onboarding narrative.
Scope Classification
Ship-Ready Core
analyzetext, markdown, and JSON outputbatchtext, markdown, and JSON output for local multi-log diagnosisworkflowlocal and agent outputinspecttext and JSON output for deterministic source scanninglistandexplainfixas a narrow remediation view over the top diagnosis- bundled playbook catalog under
playbooks/bundled/ - checked-in minimal and real fixture corpora
- deterministic release archives and Docker packaging
- release verification via
make release-checkor the script-backedmake release-verify
Complete Now
reportas a local-only recurrence summary over storedanalyzeruns- explicit
--playbook-packflags for deterministic local catalog composition - hidden
fixturescommands for corpus curation and maintainer workflows
These are supported, but they are not the first-run story. Docs and help text should keep the default emphasis on log diagnosis, source inspection, and workflow handoff.
Gate Behind Flag
- provider-backed GitHub Actions and GitLab CI delta
This path is removed from the shipped analyze surface. It may return later as
a Team enrichment or sync surface, but it should not live inside the local
diagnosis path.
Team-Gated Commands
These commands or modes require Team auth and backend state:
faultline sync(explicit push of local failure artifacts to Team state)faultline policy applyfaultline analyze <log> --report(enriched mode)
Expected behavior pattern:
- without Team auth: deterministic local output only
- with Team auth: deterministic local output plus Team enrichment
Auth and upgrade model:
- login remains optional until a Team surface is used
faultline auth loginshould feel like an upgrade path, not a prerequisite- stored credentials should make later Team usage invisible after setup
- team context, not user identity alone, is the unit of state and billing
Core flags should not be license-gated when they only operate on local input.
Defer Or Remove From Default Narrative
- broad "CI automation platform" framing
- implying that provider-backed delta is part of the standard product path
- treating repo inspection or pack management as the primary onboarding path
- reviving hidden command surfaces without deterministic tests, shipped docs, and a clear release-boundary entry
These capabilities may exist, but they should not define the release boundary.
v0.4 Direction
The current roadmap for v0.4 should extend this boundary rather than replace it:
- keep the default narrative centered on
analyze,batch,inspect,workflow,list,explain, andfix - treat managed inheritance as explicit local pack composition or a future Team sync flow, not runtime network fetch during analysis
- keep the authoring assistant hidden and maintainer-only until it has deterministic validation equivalent to the existing fixture workflows
- add reliability metrics and quarantine recommendations first as additive JSON and workflow outputs, not as new first-run command surfaces
- preserve the no-runtime-network expectation for
analyzeandworkflow - keep history value explicit in output and companion commands rather than turning recurrence into hidden ranking behavior
Team Layer Delivery Contract
When Team features are implemented, preserve these constraints:
- CLI remains local-first and usable without login
- auth is upgrade-driven and only required for Team surfaces
- Team state is tied to team context, not individual user state
- paid value comes from persistent coordination and aggregation, not from crippling local diagnosis
- default analysis path keeps deterministic no-runtime-network behavior unless explicit Team sync/report mode is requested
- initial pricing and packaging should optimize for per-team value before introducing seat-based complexity
Release-Readiness Contract
The repository is release-ready only when all of these stay true:
make testpassesmake reviewpasses after playbook or pattern changesmake fixture-checkpasses on the accepted real corpus baselinemake bayes-checkpasses because Bayes is default ranking behaviormake docs-checkpasses so generated failure docs stay aligned with bundled playbooksmake cli-smokepasses against checked-in examples and workflow snapshotsmake release-check VERSION=<tag>passes before a release cut
Bayes Promotion
--bayes was promoted to the default in v0.4.5. The Bayesian-inspired reranking layer is now active by default on the shipped analysis commands (analyze, workflow). Pass --bayes=false to disable it and revert to the deterministic baseline scorer.
Promotion criteria satisfied before v0.4.5:
make bayes-checkshowed zero regressions across the real fixture corpus (delta 0.000)make bayes-checkshowed no Top-1 or Top-3 rate regression vs the baseline scorer- The comparison report was reviewed as part of the promotion commit
- The release notes document the promotion explicitly
The gate can still be run with --fail-on-regression to verify the corpus state:
./bin/faultline fixtures compare-modes --class real --fail-on-regression
Zero Bayes regressions across 215 accepted real fixtures. make bayes-check exits zero with delta 0.000, top-1 1.000, top-3 1.000 in both modes.
Contribution Rule
New user-facing surfaces should start hidden, flagged, or non-default unless they ship with:
- deterministic command coverage
- fixture-backed regression proof when matching or ranking changes
- behavioral fixture coverage that distinguishes positive matches, near-miss or disallowed-playbook assertions, and strict top-1 expectations rather than relying on raw coverage percentages or fixture filename counts
- checked-in example or snapshot validation when the output is user-facing
- release-check integration when the feature is part of the shipped path