Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions docs/BACKLOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,16 @@ are closed (status: closed in frontmatter)._
- [ ] **[B-0472](backlog/P1/B-0472-mirror-beacon-two-axis-classification-matrix-2026-05-14.md)** Mirror/Beacon two-axis classification matrix — classify all repos on Axis 2
- [ ] **[B-0473](backlog/P1/B-0473-mirror-beacon-promotion-gate-protocol-2026-05-14.md)** Mirror→Beacon promotion gate protocol — concrete criteria for repo-level graduation
- [ ] **[B-0474](backlog/P1/B-0474-mirror-beacon-axis-adr-2026-05-14.md)** Mirror/Beacon axis ADR — two-axis design decision (extends 2026-04-22 ADR)
- [ ] **[B-0475](backlog/P1/B-0475-axis3-prior-art-substrate-consistency-audit-2026-05-14.md)** Axis-3 prior-art audit — verify three-axis substrate composes without conflict
- [ ] **[B-0476](backlog/P1/B-0476-github-ruleset-divergence-audit-2026-05-14.md)** GitHub ruleset divergence audit — survey rulesets across repos; identify smell signals
- [ ] **[B-0477](backlog/P1/B-0477-axis3-code-english-classification-matrix-2026-05-14.md)** Axis-3 Code/English classification matrix — per-repo two-tier classification with engineering-docs exception
- [ ] **[B-0478](backlog/P1/B-0478-formal-verification-repo-split-evaluation-2026-05-14.md)** Formal-verification sub-axis evaluation — per-property-class split vs co-locate decision
- [ ] **[B-0479](backlog/P1/B-0479-axis3-adr-code-english-formal-verification-design-2026-05-14.md)** Axis-3 ADR — Code/English + formal-verification three-axis design decision
- [ ] **[B-0480](backlog/P1/B-0480-dbpedia-library-choice-adr-prior-art-audit-2026-05-14.md)** DBpedia B-0428.1 — library-choice ADR (dotNetRDF vs RDFSharp) + prior-art audit
- [ ] **[B-0481](backlog/P1/B-0481-dbpedia-fsharp-project-scaffold-nuget-connectivity-2026-05-14.md)** DBpedia B-0428.2 — F# project scaffold + NuGet add + connectivity smoke test
- [ ] **[B-0482](backlog/P1/B-0482-dbpedia-sparql-fsharp-ce-computation-expression-2026-05-14.md)** DBpedia B-0428.3 — SPARQL F# computation expression (query authoring CE)
- [ ] **[B-0483](backlog/P1/B-0483-dbpedia-hkt-mdm-entity-bindings-dv2-hub-satellite-2026-05-14.md)** DBpedia B-0428.4 — HKT-MDM entity bindings + DV2.0 hub-satellite types
- [ ] **[B-0484](backlog/P1/B-0484-dbpedia-end-to-end-demo-project-2026-05-14.md)** DBpedia B-0428.5 — end-to-end demo project + integration test

## P2 — research-grade

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
---
id: B-0428
priority: P1
status: open
status: decomposed
title: "DBpedia via direct dotNetRDF + F# CE — HKT-MDM canonical demo (Path B, do now)"
type: feature
origin: Aaron 2026-05-13 (autonomous-loop substrate cascade)
created: 2026-05-13
last_updated: 2026-05-13
last_updated: 2026-05-14
children:
- B-0480
- B-0481
- B-0482
- B-0483
- B-0484
composes_with:
- B-0043
- memory/feedback_aaron_dbpedia_is_free_master_data_human_curated_fsharp_type_provider_archived_resurrect_for_hkt_mdm_canonical_demo_fork_fsharp_compiler_for_ai_safety_real_hkt_over_clifford_2026_05_13.md
Expand Down Expand Up @@ -170,6 +176,21 @@ HKT over Clifford), open a separate backlog row for:
- Composes with this row's direct-API substrate (transition
path documented in this row's ADR)

## Decomposition (Otto, 2026-05-14)

This row was too broad to implement atomically. Decomposed into 5 dependency-ordered
child rows:

| Row | Title | Type | Depends on |
|-----|-------|------|------------|
| [B-0480](B-0480-dbpedia-library-choice-adr-prior-art-audit-2026-05-14.md) | Library-choice ADR + prior-art audit | research (gate) | — |
| [B-0481](B-0481-dbpedia-fsharp-project-scaffold-nuget-connectivity-2026-05-14.md) | F# project scaffold + NuGet + connectivity smoke | feature | B-0480 |
| [B-0482](B-0482-dbpedia-sparql-fsharp-ce-computation-expression-2026-05-14.md) | SPARQL F# computation expression | feature | B-0481 |
Comment on lines +184 to +188
| [B-0483](B-0483-dbpedia-hkt-mdm-entity-bindings-dv2-hub-satellite-2026-05-14.md) | HKT-MDM entity bindings + DV2.0 hub-satellite | feature | B-0482 |
| [B-0484](B-0484-dbpedia-end-to-end-demo-project-2026-05-14.md) | End-to-end demo project (closes B-0428) | feature | B-0483 |

**Work on B-0480 first.** All subsequent rows depend on the library-choice ADR.

## Composes with

- B-0043 (universal-company-government-information-substrate)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
---
id: B-0480
priority: P1
status: open
title: "DBpedia B-0428.1 — library-choice ADR (dotNetRDF vs RDFSharp) + prior-art audit"
type: research
origin: B-0428 decomposition (Otto, 2026-05-14)
created: 2026-05-14
last_updated: 2026-05-14
parent: B-0428
depends_on: []
composes_with:
- B-0428
- B-0481
- B-0482
- B-0483
- B-0484
- docs/backlog/P3/B-0043-universal-company-government-information-substrate.md
- memory/feedback_aaron_dbpedia_is_free_master_data_human_curated_fsharp_type_provider_archived_resurrect_for_hkt_mdm_canonical_demo_fork_fsharp_compiler_for_ai_safety_real_hkt_over_clifford_2026_05_13.md
---

# B-0480 — DBpedia library-choice ADR + prior-art audit

**Gate row for B-0481..B-0484.** No code is written until this row closes.

## Purpose

1. Survey all prior-art in the codebase relevant to B-0428 (F# CE patterns,
existing SPARQL/RDF substrate, B-0043 scope).
2. Choose between **dotNetRDF 3.x** and **RDFSharp 3.x** via an ADR.
3. Document the Path-A (type-provider) transition plan in the same ADR so
future work knows the intended upgrade path.

## Pre-start checklist

Per `.claude/rules/backlog-item-start-gate.md`:

- [ ] Survey existing F# CE patterns in `src/Core/Dsl.fs` (CircuitBuilder model)
- [ ] Check `Directory.Packages.props` for any existing RDF/SPARQL packages
- [ ] Read B-0043 to confirm demo scope alignment
- [ ] Walk `composes_with:` chain (B-0428, B-0043, PR #2913, PR #2915)
- [ ] Otto-364: WebSearch current NuGet download counts + GitHub star counts for
both libraries before asserting recency

## Prior-art surfaces to audit

| Surface | Path | What to verify |
|---------|------|----------------|
| F# CE model | `src/Core/Dsl.fs` | CircuitBuilder pattern — applies to SparqlBuilder |
| Package manifest | `Directory.Packages.props` | Confirm no RDF packages already present |
| B-0043 parent | `docs/backlog/P3/B-0043-*.md` | Scope of universal-business-templates |
Comment on lines +47 to +51
| PR #2913 | GitHub | HKT-MDM universality — confirm `M<'T>` substrate shape |
| DV2.0 rule | `.claude/rules/dv2-data-split-discipline-activated.md` | Hub-satellite partition applies |
| Aaron's DBpedia memory | `memory/feedback_aaron_dbpedia_is_free_master_data_*.md` | Confirm Path A vs Path B ordering |

## Evaluation criteria for library choice

| Criterion | dotNetRDF 3.x | RDFSharp 3.x |
|-----------|---------------|--------------|
| Last NuGet publish | Verify via search | Verify via search |
| CI offline capability | Needs recording or mocking | Needs recording or mocking |
| SPARQL 1.1 query support | Yes | Yes |
| RDF-Star support | Yes (claimed) | Partial |
| API surface size | Large | Small/focused |
| F# ergonomics | Verify | Verify |

**Use Otto-364 WebSearch to verify current NuGet activity before asserting.**

## ADR output

Path: `docs/DECISIONS/2026-05-14-dbpedia-library-choice-dotnetrdf-vs-rdfsharp.md`

Must include:

1. Decision: which library, version pinned
2. Rationale (table above filled in with current data)
3. CI strategy: how SPARQL queries are tested in CI (live endpoint / recorded
fixture / mock; offline-first preferred per `dotnet test` isolation requirement)
4. Path-A transition plan: when F# compiler fork lands, how to migrate from
direct-API CE (B-0482) to a proper type provider
5. Where in the solution the new project lives: `src/DBpedia/` under `Zeta.sln`

## Definition of done

- [ ] ADR written and merged at canonical path above
- [ ] CI strategy decision recorded in ADR
- [ ] Path-A transition plan recorded in ADR
- [ ] `composes_with:` pointers backfilled on B-0428 and B-0043
- [ ] B-0481 can begin immediately after this merges (no remaining blockers)
- [ ] B-0480 status set to `closed`

## Why P1 / gate

All four implementation rows (B-0481..B-0484) depend on the library
choice. Executing the ADR first prevents throwaway implementation work
if the library choice flips mid-stream.
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
---
id: B-0481
priority: P1
status: open
title: "DBpedia B-0428.2 — F# project scaffold + NuGet add + connectivity smoke test"
type: feature
origin: B-0428 decomposition (Otto, 2026-05-14)
created: 2026-05-14
last_updated: 2026-05-14
parent: B-0428
depends_on:
- B-0480
composes_with:
- B-0428
- B-0480
- B-0482
- B-0483
- B-0484
---

# B-0481 — F# project scaffold + NuGet add + connectivity smoke test

**Depends on B-0480 (library choice ADR must be closed first).**

## Purpose

Create the `src/DBpedia/` F# project, wire it into `Zeta.sln`, add the chosen
NuGet package (from B-0480's ADR), and prove the SPARQL endpoint is reachable
with a minimal query. Everything in B-0482..B-0484 builds on this foundation.

## Pre-start checklist

Per `.claude/rules/backlog-item-start-gate.md`:

- [ ] Confirm B-0480 is `closed` and ADR is merged
- [ ] Read ADR to confirm library name + version + CI strategy
- [ ] Check existing project structure in `Zeta.sln`
- [ ] Confirm `Directory.Packages.props` does not already have the package

## Work items

### 1. New F# project

```
src/DBpedia/
DBpedia.fsproj ← references the library from B-0480 ADR
Client.fs ← minimal SPARQL client wrapper
tests/DBpedia.Tests/
DBpedia.Tests.fsproj
ConnectivityTests.fs ← smoke test(s)
```

`DBpedia.fsproj` must:

- Target `net10.0` (matches existing projects)
- Reference chosen library (pinned version from ADR)
- Include in `Zeta.sln`

### 2. Package manifest

Add to `Directory.Packages.props`:

```xml
<PackageVersion Include="<chosen-library>" Version="<pinned-version>" />
```

### 3. Minimal `Client.fs`

A thin type over the library's SPARQL query client:

```fsharp
module Zeta.DBpedia.Client

// Opaque endpoint handle — keeps library leakage off the public surface
type Endpoint = private Endpoint of <LibraryType>

let dbpedia : Endpoint = ...
let query (endpoint: Endpoint) (sparql: string) : Result<..., DbspError> = ...
```

Error surface: `Result<_, DbspError>` per the repo-wide result-over-exception rule.

### 4. CI strategy (per ADR)

Implement whichever CI strategy the ADR chose:

- **Recorded fixture** (preferred): capture one real DBpedia response; replay
in CI without network access
- **Live endpoint** (fallback): mark test `[<Fact(Skip="Requires live DBpedia endpoint — use recorded fixture for CI")>]`
so the test is skipped by default; remove `Skip=` only when running locally against DBpedia

The smoke test must:

- Execute the query below (or recorded equivalent):
```sparql
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label WHERE { <http://dbpedia.org/resource/Berlin> rdfs:label ?label . FILTER (LANG(?label) = 'en') }
```
- Assert at least one `rdfs:label` result
- Pass under `dotnet test Zeta.sln -c Release`

## Build gate check

```bash
dotnet build -c Release # 0 warnings 0 errors
dotnet test Zeta.sln -c Release
```

Both must pass before PR opens.

## Definition of done

- [ ] `src/DBpedia/DBpedia.fsproj` added to `Zeta.sln`
- [ ] `tests/DBpedia.Tests/DBpedia.Tests.fsproj` added to `Zeta.sln`
- [ ] Chosen NuGet package in `Directory.Packages.props`
- [ ] Connectivity smoke test passes (live or recorded per ADR)
- [ ] `dotnet build -c Release` — 0 warnings 0 errors
- [ ] `dotnet test Zeta.sln -c Release` — all tests green
- [ ] B-0482 can begin immediately after this merges
- [ ] B-0481 status set to `closed`

## Why P1

Foundation row: B-0482, B-0483, and B-0484 all add code on top of this project.
Establishing a green build with the library wired in de-risks all three.
Loading
Loading