docs/02-architecture.md is a legacy doc from when 0pt was planned as a standalone SaaS
product. Its "Stack decisions — OUT (do not add)" table still says:
Rejected
Reason
Superset
Metabase already covers BI — one tool, not two
DataHub / OpenMetadata
enterprise-heavy; catalog = a Postgres table in Next.js + NocoDB
and the "IN" table names | BI | **Metabase** |.
That contradicts the SIAX Cloud analytics decision: 0pt is the canonical
Analytics/Data/Semantic owner — no BI0/Analytics0 repo, no separate Superset platform,
no product-specific BI backend as a parallel capability owner. Apache Superset is the
canonical BI engine (Apache-2.0 with an official embed SDK + guest tokens, so embedding never
needs a commercial tier) and OpenMetadata is the canonical catalog, default ahead of DataHub.
Metabase, DataHub, Lightdash, Rill and Grafana are optional App Catalog apps, never the default.
Why this is a contradiction inside the repo, not just against an external decision
The strongest argument for the change is that 0pt already shipped both "rejected" tools:
src/metadata/openmetadata-adapter.ts and tests/contracts/metadata-features.contract.test.ts
— the OpenMetadata projection adapter, with projectAll() as the rebuild path. STATUS.md line 47 classifies it IMPLEMENTED ("projection, never canonical").
services/infra/docker-compose.data-stack.yml line 99 defines a superset service on apache/superset:latest, with its own metadata Postgres.
docs/compliance/OSS-INVENTORY.md line 74 already inventories superset | Apache-2.0 | services/infra/data-stack.
docs/architecture/ARCHITECTURE.md line 275 lists superset in the engine-deploy compose.
So the OUT table was telling a future contributor to remove things this repository ships.
The change itself
docs/02-architecture.md
IN table: BI row changed from Metabase to Apache Superset, with the licence reasoning.
OUT table: the Superset and DataHub/OpenMetadata rows are struck through and marked
WITHDRAWN rather than deleted, so the reversal stays auditable; one new row records what is non-canonical (Metabase/Lightdash/Rill/Grafana/DataHub as canonical BI or catalog) and
why — Metabase OSS is AGPL with app-/SSO-embedding behind Pro/Enterprise, Lightdash gates
embedding and caching behind an enterprise self-host licence, Rill's documented deployment
is bound to Rill Cloud (breaks zero-SaaS), Grafana is AGPLv3 and is the operational
analysis tool, AUD0-owned.
A correction callout above the OUT table, in the same voice as the existing
"SUPERSEDED 2026-08-11" hosting block, including the governing principle: one definition
of every metric — 0pt Metric Catalog → MetricFlow → {Superset, Cube, native API, INF0}.
Point a product at a BI engine directly and every surface invents its own "average price".
The Components bullet that called embedded Metabase "the target" now says Metabase is not
the canonical BI lens.
docs/07-dependencies.md line 77 repeated the same rejection list and pointed here; Superset
and OpenMetadata are removed from it with an inline correction note.
Verification
Docs only — no workflow files, no .gitignore, no source. So instead of a unit test, a
falsifiable check on the doc itself (asserts the OUT table no longer rejects either tool, and
that the IN table's BI row names Superset):
origin/main -> FAIL (4 findings)
- OUT table still rejects Superset: | Superset | Metabase already covers BI — one tool, not two |
- OUT table still rejects OpenMetadata: | DataHub / OpenMetadata | enterprise-heavy; ...
- IN table BI row does not name Superset: **Metabase**
- IN table BI row is still Metabase
this branch -> PASS
mutation 1: IN row reverted to Metabase -> FAIL (2 findings)
mutation 2: OUT rows un-struck -> FAIL (2 findings)
Each mutation independently turns the check red, so it is not a gate that cannot fall.
node scripts/siax-doctor.mjs: 39/40 on this branch, 39/40 on main — identical. The single
failure (P1-15 CODEOWNERS exists -- missing: CODEOWNERS) is pre-existing on main and is
exactly what PR #19 supplies.
prettier --check already fails on both files on main, so no reformatting was done here — that
would have buried a 31-line change under a whole-file rewrite. format is not part of CI.
## What this changes
`docs/02-architecture.md` is a legacy doc from when 0pt was planned as a standalone SaaS
product. Its **"Stack decisions — OUT (do not add)"** table still says:
| Rejected | Reason |
|---|---|
| Superset | Metabase already covers BI — one tool, not two |
| DataHub / OpenMetadata | enterprise-heavy; catalog = a Postgres table in Next.js + NocoDB |
and the **"IN"** table names `| BI | **Metabase** |`.
That contradicts the SIAX Cloud analytics decision: **0pt is the canonical
Analytics/Data/Semantic owner** — no `BI0`/`Analytics0` repo, no separate Superset platform,
no product-specific BI backend as a parallel capability owner. **Apache Superset is the
canonical BI engine** (Apache-2.0 with an official embed SDK + guest tokens, so embedding never
needs a commercial tier) and **OpenMetadata is the canonical catalog**, default ahead of DataHub.
Metabase, DataHub, Lightdash, Rill and Grafana are optional App Catalog apps, never the default.
## Why this is a contradiction inside the repo, not just against an external decision
The strongest argument for the change is that **0pt already shipped both "rejected" tools**:
- `src/metadata/openmetadata-adapter.ts` and `tests/contracts/metadata-features.contract.test.ts`
— the OpenMetadata projection adapter, with `projectAll()` as the rebuild path.
`STATUS.md` line 47 classifies it **IMPLEMENTED** ("projection, never canonical").
- `services/infra/docker-compose.data-stack.yml` line 99 defines a `superset` service on
`apache/superset:latest`, with its own metadata Postgres.
- `docs/compliance/OSS-INVENTORY.md` line 74 already inventories
`superset | Apache-2.0 | services/infra/data-stack`.
- `docs/architecture/ARCHITECTURE.md` line 275 lists superset in the engine-deploy compose.
So the OUT table was telling a future contributor to remove things this repository ships.
## The change itself
- `docs/02-architecture.md`
- IN table: BI row changed from Metabase to Apache Superset, with the licence reasoning.
- OUT table: the Superset and DataHub/OpenMetadata rows are struck through and marked
WITHDRAWN rather than deleted, so the reversal stays auditable; one new row records what
*is* non-canonical (Metabase/Lightdash/Rill/Grafana/DataHub as canonical BI or catalog) and
why — Metabase OSS is AGPL with app-/SSO-embedding behind Pro/Enterprise, Lightdash gates
embedding and caching behind an enterprise self-host licence, Rill's documented deployment
is bound to Rill Cloud (breaks zero-SaaS), Grafana is AGPLv3 and is the *operational*
analysis tool, AUD0-owned.
- A correction callout above the OUT table, in the same voice as the existing
"SUPERSEDED 2026-08-11" hosting block, including the governing principle: **one definition
of every metric** — 0pt Metric Catalog → MetricFlow → {Superset, Cube, native API, INF0}.
Point a product at a BI engine directly and every surface invents its own "average price".
- The Components bullet that called embedded Metabase "the target" now says Metabase is not
the canonical BI lens.
- `docs/07-dependencies.md` line 77 repeated the same rejection list and pointed here; Superset
and OpenMetadata are removed from it with an inline correction note.
## Verification
Docs only — no workflow files, no `.gitignore`, no source. So instead of a unit test, a
falsifiable check on the doc itself (asserts the OUT table no longer rejects either tool, and
that the IN table's BI row names Superset):
```
origin/main -> FAIL (4 findings)
- OUT table still rejects Superset: | Superset | Metabase already covers BI — one tool, not two |
- OUT table still rejects OpenMetadata: | DataHub / OpenMetadata | enterprise-heavy; ...
- IN table BI row does not name Superset: **Metabase**
- IN table BI row is still Metabase
this branch -> PASS
mutation 1: IN row reverted to Metabase -> FAIL (2 findings)
mutation 2: OUT rows un-struck -> FAIL (2 findings)
```
Each mutation independently turns the check red, so it is not a gate that cannot fall.
`node scripts/siax-doctor.mjs`: **39/40 on this branch, 39/40 on `main`** — identical. The single
failure (`P1-15 CODEOWNERS exists -- missing: CODEOWNERS`) is pre-existing on `main` and is
exactly what PR #19 supplies.
`prettier --check` already fails on both files on `main`, so no reformatting was done here — that
would have buried a 31-line change under a whole-file rewrite. `format` is not part of CI.
Generated with [Claude Code](https://claude.com/claude-code)
`docs/02-architecture.md` was written when 0pt was planned as a standalone SaaS
product. Its "Stack decisions — OUT (do not add)" table rejects Apache Superset
("Metabase already covers BI") and DataHub/OpenMetadata ("enterprise-heavy"),
and the "IN" table names Metabase as the BI choice.
Under the SIAX Cloud analytics decision, 0pt is the canonical
Analytics/Data/Semantic owner — there is no BI0/Analytics0 repo and no separate
Superset platform. Superset is the canonical BI engine (Apache-2.0, official
embed SDK + guest tokens) and OpenMetadata the canonical catalog, default ahead
of DataHub. Metabase, DataHub, Lightdash, Rill and Grafana are optional App
Catalog apps, never the platform default.
This repository had already shipped both of the "rejected" tools, which is what
makes the old rows self-contradicting rather than merely stale:
* src/metadata/openmetadata-adapter.ts + tests/contracts/metadata-features.contract.test.ts
(STATUS.md classifies the OpenMetadata projection IMPLEMENTED)
* services/infra/docker-compose.data-stack.yml defines a `superset` service
(apache/superset:latest), and docs/compliance/OSS-INVENTORY.md line 74
already inventories `superset | Apache-2.0 | services/infra/data-stack`
Falsifiable check used (asserts the OUT table no longer rejects either tool and
that the IN table's BI row names Superset):
origin/main -> FAIL (4 findings)
this branch -> PASS
mutation: BI row back to Metabase -> FAIL
mutation: OUT rows un-struck -> FAIL
Docs only. No workflow files, no .gitignore, no source. `node scripts/siax-doctor.mjs`
gives 39/40 on this branch and 39/40 on main — the one failure (P1-15 CODEOWNERS
missing) is pre-existing and is what PR #19 supplies.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
admin
merged commit into main2026-09-06 07:50:54 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What this changes
docs/02-architecture.mdis a legacy doc from when 0pt was planned as a standalone SaaSproduct. Its "Stack decisions — OUT (do not add)" table still says:
and the "IN" table names
| BI | **Metabase** |.That contradicts the SIAX Cloud analytics decision: 0pt is the canonical
Analytics/Data/Semantic owner — no
BI0/Analytics0repo, no separate Superset platform,no product-specific BI backend as a parallel capability owner. Apache Superset is the
canonical BI engine (Apache-2.0 with an official embed SDK + guest tokens, so embedding never
needs a commercial tier) and OpenMetadata is the canonical catalog, default ahead of DataHub.
Metabase, DataHub, Lightdash, Rill and Grafana are optional App Catalog apps, never the default.
Why this is a contradiction inside the repo, not just against an external decision
The strongest argument for the change is that 0pt already shipped both "rejected" tools:
src/metadata/openmetadata-adapter.tsandtests/contracts/metadata-features.contract.test.ts— the OpenMetadata projection adapter, with
projectAll()as the rebuild path.STATUS.mdline 47 classifies it IMPLEMENTED ("projection, never canonical").services/infra/docker-compose.data-stack.ymlline 99 defines asupersetservice onapache/superset:latest, with its own metadata Postgres.docs/compliance/OSS-INVENTORY.mdline 74 already inventoriessuperset | Apache-2.0 | services/infra/data-stack.docs/architecture/ARCHITECTURE.mdline 275 lists superset in the engine-deploy compose.So the OUT table was telling a future contributor to remove things this repository ships.
The change itself
docs/02-architecture.mdWITHDRAWN rather than deleted, so the reversal stays auditable; one new row records what
is non-canonical (Metabase/Lightdash/Rill/Grafana/DataHub as canonical BI or catalog) and
why — Metabase OSS is AGPL with app-/SSO-embedding behind Pro/Enterprise, Lightdash gates
embedding and caching behind an enterprise self-host licence, Rill's documented deployment
is bound to Rill Cloud (breaks zero-SaaS), Grafana is AGPLv3 and is the operational
analysis tool, AUD0-owned.
"SUPERSEDED 2026-08-11" hosting block, including the governing principle: one definition
of every metric — 0pt Metric Catalog → MetricFlow → {Superset, Cube, native API, INF0}.
Point a product at a BI engine directly and every surface invents its own "average price".
the canonical BI lens.
docs/07-dependencies.mdline 77 repeated the same rejection list and pointed here; Supersetand OpenMetadata are removed from it with an inline correction note.
Verification
Docs only — no workflow files, no
.gitignore, no source. So instead of a unit test, afalsifiable check on the doc itself (asserts the OUT table no longer rejects either tool, and
that the IN table's BI row names Superset):
Each mutation independently turns the check red, so it is not a gate that cannot fall.
node scripts/siax-doctor.mjs: 39/40 on this branch, 39/40 onmain— identical. The singlefailure (
P1-15 CODEOWNERS exists -- missing: CODEOWNERS) is pre-existing onmainand isexactly what PR #19 supplies.
prettier --checkalready fails on both files onmain, so no reformatting was done here — thatwould have buried a 31-line change under a whole-file rewrite.
formatis not part of CI.Generated with Claude Code
`docs/02-architecture.md` was written when 0pt was planned as a standalone SaaS product. Its "Stack decisions — OUT (do not add)" table rejects Apache Superset ("Metabase already covers BI") and DataHub/OpenMetadata ("enterprise-heavy"), and the "IN" table names Metabase as the BI choice. Under the SIAX Cloud analytics decision, 0pt is the canonical Analytics/Data/Semantic owner — there is no BI0/Analytics0 repo and no separate Superset platform. Superset is the canonical BI engine (Apache-2.0, official embed SDK + guest tokens) and OpenMetadata the canonical catalog, default ahead of DataHub. Metabase, DataHub, Lightdash, Rill and Grafana are optional App Catalog apps, never the platform default. This repository had already shipped both of the "rejected" tools, which is what makes the old rows self-contradicting rather than merely stale: * src/metadata/openmetadata-adapter.ts + tests/contracts/metadata-features.contract.test.ts (STATUS.md classifies the OpenMetadata projection IMPLEMENTED) * services/infra/docker-compose.data-stack.yml defines a `superset` service (apache/superset:latest), and docs/compliance/OSS-INVENTORY.md line 74 already inventories `superset | Apache-2.0 | services/infra/data-stack` Falsifiable check used (asserts the OUT table no longer rejects either tool and that the IN table's BI row names Superset): origin/main -> FAIL (4 findings) this branch -> PASS mutation: BI row back to Metabase -> FAIL mutation: OUT rows un-struck -> FAIL Docs only. No workflow files, no .gitignore, no source. `node scripts/siax-doctor.mjs` gives 39/40 on this branch and 39/40 on main — the one failure (P1-15 CODEOWNERS missing) is pre-existing and is what PR #19 supplies. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>