lintel-api 0.1.0a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. lintel_api-0.1.0a1/.github/workflows/publish-pypi.yml +97 -0
  2. lintel_api-0.1.0a1/.gitignore +7 -0
  3. lintel_api-0.1.0a1/.helix.yml +3 -0
  4. lintel_api-0.1.0a1/AGENTS.md +32 -0
  5. lintel_api-0.1.0a1/PKG-INFO +83 -0
  6. lintel_api-0.1.0a1/README.md +67 -0
  7. lintel_api-0.1.0a1/docs/helix/00-discover/owner-intent.md +39 -0
  8. lintel_api-0.1.0a1/docs/helix/00-discover/product-vision.md +74 -0
  9. lintel_api-0.1.0a1/docs/helix/00-discover/source-inventory.md +62 -0
  10. lintel_api-0.1.0a1/docs/helix/00-discover/sources/manifest.json +140 -0
  11. lintel_api-0.1.0a1/docs/helix/00-discover/sources/umf-commerce.json +135 -0
  12. lintel_api-0.1.0a1/docs/helix/01-frame/concerns.md +70 -0
  13. lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-001-model-projection.md +85 -0
  14. lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-002-relay-reads.md +85 -0
  15. lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-003-commands-outcomes.md +85 -0
  16. lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-004-typescript-clients.md +85 -0
  17. lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-005-batten-embedding.md +85 -0
  18. lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-006-delivery-family.md +85 -0
  19. lintel_api-0.1.0a1/docs/helix/01-frame/prd.md +173 -0
  20. lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-001-model-projection.md +66 -0
  21. lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-002-relay-reads.md +66 -0
  22. lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-003-commands-outcomes.md +66 -0
  23. lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-004-typescript-clients.md +66 -0
  24. lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-005-batten-embedding.md +66 -0
  25. lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-006-delivery-family.md +66 -0
  26. lintel_api-0.1.0a1/docs/helix/02-design/adr/ADR-001-embedded-python-runtime.md +68 -0
  27. lintel_api-0.1.0a1/docs/helix/02-design/adr/ADR-002-graphql-relay-client.md +62 -0
  28. lintel_api-0.1.0a1/docs/helix/02-design/architecture.md +232 -0
  29. lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-001-exposure-and-projection.md +147 -0
  30. lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-002-neutral-execution-port.md +166 -0
  31. lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-003-graphql-relay-profile.md +199 -0
  32. lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-004-typescript-relay-clients.md +174 -0
  33. lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-005-hosting-and-resource-bounds.md +191 -0
  34. lintel_api-0.1.0a1/docs/helix/02-design/contracts/README.md +17 -0
  35. lintel_api-0.1.0a1/docs/helix/02-design/examples/README.md +58 -0
  36. lintel_api-0.1.0a1/docs/helix/02-design/examples/host-profile.json +25 -0
  37. lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.cases.json +94 -0
  38. lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.exposure.json +123 -0
  39. lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.graphql +56 -0
  40. lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.operations.graphql +26 -0
  41. lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.relay.graphql +10 -0
  42. lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.umf.json +182 -0
  43. lintel_api-0.1.0a1/docs/helix/02-design/interfaces/ports.pyi +72 -0
  44. lintel_api-0.1.0a1/docs/helix/02-design/schemas/client-manifest.schema.json +140 -0
  45. lintel_api-0.1.0a1/docs/helix/02-design/schemas/exposure.schema.json +329 -0
  46. lintel_api-0.1.0a1/docs/helix/02-design/schemas/host-profile.schema.json +159 -0
  47. lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-001-model-projection.md +87 -0
  48. lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-002-relay-reads.md +87 -0
  49. lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-003-commands-outcomes.md +87 -0
  50. lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-004-typescript-clients.md +87 -0
  51. lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-005-batten-embedding.md +87 -0
  52. lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-006-delivery-family.md +87 -0
  53. lintel_api-0.1.0a1/docs/helix/02-design/spikes/SPIKE-001-direct-umf.md +94 -0
  54. lintel_api-0.1.0a1/docs/helix/02-design/spikes/SPIKE-002-native-reads.md +110 -0
  55. lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-001-model-projection.md +132 -0
  56. lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-002-relay-reads.md +116 -0
  57. lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-003-commands-outcomes.md +119 -0
  58. lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-004-typescript-clients.md +117 -0
  59. lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-005-batten-embedding.md +116 -0
  60. lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-006-delivery-family.md +115 -0
  61. lintel_api-0.1.0a1/docs/helix/02-design/upstream-changes.md +136 -0
  62. lintel_api-0.1.0a1/docs/helix/03-test/test-plan.md +120 -0
  63. lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-001-model-projection.md +86 -0
  64. lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-002-relay-reads.md +86 -0
  65. lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-003-commands-outcomes.md +86 -0
  66. lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-004-typescript-clients.md +86 -0
  67. lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-005-batten-embedding.md +86 -0
  68. lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-006-delivery-family.md +86 -0
  69. lintel_api-0.1.0a1/docs/helix/04-build/direct-umf-spike.md +69 -0
  70. lintel_api-0.1.0a1/docs/helix/04-build/evidence/packet-checks.json +10 -0
  71. lintel_api-0.1.0a1/docs/helix/04-build/evidence/request-reads-legacy.json +63 -0
  72. lintel_api-0.1.0a1/docs/helix/04-build/evidence/request-reads-native.json +60 -0
  73. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-artifact-checks.json +156 -0
  74. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-direct-umf.graphql +24 -0
  75. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-direct-umf.json +28 -0
  76. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-document-checks.json +7 -0
  77. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-quality-controls.json +8 -0
  78. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-verification.json +102 -0
  79. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s02-artifact-checks.json +12 -0
  80. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s02-checks.json +29 -0
  81. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s02-document-checks.json +7 -0
  82. lintel_api-0.1.0a1/docs/helix/04-build/evidence/s02-native-reads.json +91 -0
  83. lintel_api-0.1.0a1/docs/helix/04-build/evidence/specification-checks.json +57 -0
  84. lintel_api-0.1.0a1/docs/helix/04-build/evidence/specification-instance-results.json +681 -0
  85. lintel_api-0.1.0a1/docs/helix/04-build/evidence/validator-results.json +317 -0
  86. lintel_api-0.1.0a1/docs/helix/04-build/framing-validation.md +72 -0
  87. lintel_api-0.1.0a1/docs/helix/04-build/native-read-spike.md +62 -0
  88. lintel_api-0.1.0a1/docs/helix/04-build/request-read-implementation.md +30 -0
  89. lintel_api-0.1.0a1/docs/helix/04-build/specification-expansion.md +62 -0
  90. lintel_api-0.1.0a1/docs/helix/05-deploy/family-integration.md +48 -0
  91. lintel_api-0.1.0a1/docs/helix/05-deploy/release-notes.md +85 -0
  92. lintel_api-0.1.0a1/docs/helix/README.md +67 -0
  93. lintel_api-0.1.0a1/pyproject.toml +82 -0
  94. lintel_api-0.1.0a1/scripts/check_boundaries.py +108 -0
  95. lintel_api-0.1.0a1/scripts/check_installed.py +46 -0
  96. lintel_api-0.1.0a1/scripts/check_quality.py +55 -0
  97. lintel_api-0.1.0a1/spikes/__init__.py +0 -0
  98. lintel_api-0.1.0a1/spikes/direct_umf/__init__.py +0 -0
  99. lintel_api-0.1.0a1/spikes/direct_umf/run.py +82 -0
  100. lintel_api-0.1.0a1/spikes/native_reads/__init__.py +0 -0
  101. lintel_api-0.1.0a1/spikes/native_reads/fixture.py +264 -0
  102. lintel_api-0.1.0a1/spikes/native_reads/model.umf.json +859 -0
  103. lintel_api-0.1.0a1/spikes/native_reads/probes.py +167 -0
  104. lintel_api-0.1.0a1/spikes/native_reads/run.py +52 -0
  105. lintel_api-0.1.0a1/spikes/request_reads/__init__.py +0 -0
  106. lintel_api-0.1.0a1/spikes/request_reads/qualify.py +415 -0
  107. lintel_api-0.1.0a1/src/lintel/__init__.py +3 -0
  108. lintel_api-0.1.0a1/src/lintel/experimental/__init__.py +0 -0
  109. lintel_api-0.1.0a1/src/lintel/experimental/projection.py +121 -0
  110. lintel_api-0.1.0a1/src/lintel/experimental/schema.py +105 -0
  111. lintel_api-0.1.0a1/src/lintel/py.typed +0 -0
  112. lintel_api-0.1.0a1/tests/test_boundaries.py +45 -0
  113. lintel_api-0.1.0a1/tests/test_direct_umf.py +188 -0
  114. lintel_api-0.1.0a1/uv.lock +932 -0
@@ -0,0 +1,97 @@
1
+ name: Release Lintel to PyPI
2
+ on:
3
+ release:
4
+ types: [published]
5
+ workflow_dispatch:
6
+ inputs:
7
+ tag:
8
+ description: Existing release tag to publish
9
+ required: true
10
+ type: string
11
+ permissions:
12
+ contents: read
13
+ concurrency:
14
+ group: lintel-pypi-${{ github.event.release.tag_name || inputs.tag }}
15
+ cancel-in-progress: false
16
+ jobs:
17
+ build:
18
+ runs-on: ubuntu-24.04
19
+ timeout-minutes: 15
20
+ env:
21
+ TAG: ${{ github.event.release.tag_name || inputs.tag }}
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ with:
25
+ ref: ${{ github.event.release.tag_name || inputs.tag }}
26
+ persist-credentials: false
27
+ - uses: astral-sh/setup-uv@v6
28
+ with:
29
+ version: '0.13.3'
30
+ - name: Check release identity
31
+ run: |
32
+ python3 - <<'PY'
33
+ import os, tomllib
34
+ from pathlib import Path
35
+ p = tomllib.loads(Path('pyproject.toml').read_text())['project']
36
+ assert p['name'] == 'lintel-api'
37
+ assert os.environ['TAG'] == 'v' + p['version']
38
+ PY
39
+ - name: Validate source and build archives
40
+ run: |
41
+ uv sync --locked --group spike --python 3.11
42
+ uv run --locked python -m ruff check src scripts spikes tests
43
+ uv run --locked python -m ruff format --check src scripts spikes tests
44
+ uv run --locked python scripts/check_boundaries.py
45
+ uv run --locked python -m pytest -q
46
+ uv build
47
+ uvx --from twine==7.0.0 twine check --strict dist/*
48
+ sha256sum dist/* > SHA256SUMS
49
+ - name: Check installed wheel outside the checkout
50
+ run: |
51
+ uv venv --python 3.11 "$RUNNER_TEMP/installed"
52
+ uv pip install --python "$RUNNER_TEMP/installed/bin/python" dist/*.whl
53
+ "$RUNNER_TEMP/installed/bin/python" -I scripts/check_installed.py
54
+ - uses: actions/upload-artifact@v4
55
+ with:
56
+ name: lintel-distributions
57
+ path: |
58
+ dist/*
59
+ SHA256SUMS
60
+ if-no-files-found: error
61
+ publish:
62
+ needs: build
63
+ runs-on: ubuntu-24.04
64
+ timeout-minutes: 10
65
+ environment: pypi
66
+ permissions:
67
+ id-token: write
68
+ steps:
69
+ - uses: actions/download-artifact@v4
70
+ with:
71
+ name: lintel-distributions
72
+ path: incoming
73
+ - name: Verify archive hashes
74
+ working-directory: incoming
75
+ run: sha256sum --check SHA256SUMS
76
+ - uses: pypa/gh-action-pypi-publish@release/v1
77
+ with:
78
+ packages-dir: incoming/dist/
79
+ public-consumer:
80
+ needs: publish
81
+ runs-on: ubuntu-24.04
82
+ timeout-minutes: 10
83
+ steps:
84
+ - uses: actions/checkout@v4
85
+ with:
86
+ ref: ${{ github.event.release.tag_name || inputs.tag }}
87
+ persist-credentials: false
88
+ - uses: astral-sh/setup-uv@v6
89
+ with:
90
+ version: '0.13.3'
91
+ - name: Install and exercise the public package
92
+ env:
93
+ TAG: ${{ github.event.release.tag_name || inputs.tag }}
94
+ run: |
95
+ uv venv --python 3.11 "$RUNNER_TEMP/public"
96
+ uv pip install --no-cache --index-url https://pypi.org/simple --python "$RUNNER_TEMP/public/bin/python" "lintel-api==${TAG#v}"
97
+ "$RUNNER_TEMP/public/bin/python" -I scripts/check_installed.py
@@ -0,0 +1,7 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.py[cod]
4
+ node_modules/
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ dist/
@@ -0,0 +1,3 @@
1
+ flows:
2
+ - id: helix
3
+ root: docs/helix/
@@ -0,0 +1,32 @@
1
+ # Working in Lintel
2
+
3
+ Start at `docs/helix/README.md`. Use the installed HELIX skill and `.helix.yml`;
4
+ keep governed artifacts under `docs/helix/`. Resolve the catalog from the installed
5
+ plugin. Preserve IDs, frontmatter, traceability and unfamiliar metadata.
6
+
7
+ Lintel is an independently packaged, embeddable Python GraphQL/Relay API runtime
8
+ in the UMF family, intended for inclusion in Batten's qualified runtime.
9
+ The owner selected Python/FastAPI, GraphQL + Relay and TypeScript client builds.
10
+ REST/OpenAPI product APIs are outside the MVP. The name is provisional.
11
+
12
+ UMF owns modeling and executable schema semantics; Weft owns SQL compilation;
13
+ the existing access/graph runtimes own execution. Batten owns application
14
+ admission, authenticated authority, confirmation, attribution and resource custody.
15
+ Lintel defines neutral public execution ports; Batten owns its integration adapter
16
+ in Batten. Lintel must not import Batten, and generic Batten core must not import
17
+ Lintel or GraphQL. Never duplicate an engine or bypass Batten's host.
18
+ Do not depend on any consuming application's internals.
19
+
20
+ Use Python 3.11 as the initial library compatibility floor; qualify the actual
21
+ Databricks Apps interpreter separately. Use uv, Ruff, Pyright and pytest.
22
+ Use TypeScript/Bun for Relay client build tooling and real Chromium checks.
23
+ No runtime package installation; no schema-selected code execution; no new
24
+ application environment variables. Configuration is typed, file-based and injected.
25
+ Use fabricated data. Qualify every claim by cohort, subset and observed evidence.
26
+
27
+ The packet specifies desired behavior; src/lintel/experimental contains the bounded
28
+ direct-UMF projection, and spikes/direct_umf its harness. This alpha is not a
29
+ production runtime or full conformance claim.
30
+ Consume UMF JSON directly; do not introduce an intermediate schema API.
31
+ Make upstream changes only for demonstrated gaps. Resolve the named spikes/contracts
32
+ before dependent implementation. Do not commit, push or publish unless asked.
@@ -0,0 +1,83 @@
1
+ Metadata-Version: 2.5
2
+ Name: lintel-api
3
+ Version: 0.1.0a1
4
+ Summary: UMF-driven GraphQL interoperability spikes (not a production runtime)
5
+ Project-URL: Repository, https://github.com/DocumentDrivenDX/lintel
6
+ Project-URL: Issues, https://github.com/DocumentDrivenDX/lintel/issues
7
+ Classifier: Development Status :: 3 - Alpha
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.11
10
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
11
+ Requires-Python: >=3.11
12
+ Requires-Dist: graphql-core==3.3.1
13
+ Requires-Dist: strawberry-graphql==0.339.1
14
+ Requires-Dist: umf-core==0.10.0
15
+ Description-Content-Type: text/markdown
16
+
17
+ # Lintel
18
+
19
+ Dynamic GraphQL + Relay APIs from UMF, with an embeddable Python/FastAPI runtime
20
+ and generated TypeScript operation/fragment artifacts for Batten applications.
21
+
22
+ ## Install the experimental alpha
23
+
24
+ ```sh
25
+ pip install lintel-api==0.1.0a1
26
+ ```
27
+
28
+ Import `project` from `lintel.experimental.projection` and
29
+ `build_probe_schema` / `export_sdl` from `lintel.experimental.schema`.
30
+ These expose the bounded S-01 scalar projection: string, boolean, exact decimal
31
+ text and canonical UUID, with optional-field omission preserved. Supply UMF JSON
32
+ and explicit record/field references; the example below uses the task-board model
33
+ in the source distribution.
34
+
35
+ ```python
36
+ from pathlib import Path
37
+ from lintel.experimental.projection import project
38
+ from lintel.experimental.schema import build_probe_schema
39
+
40
+ plan = project(
41
+ Path("docs/helix/02-design/examples/task-board.umf.json").read_text(),
42
+ ("board", "Task"), "Task", {("board", "title"): "title"},
43
+ )
44
+ schema = build_probe_schema(plan, {"title": "Fabricated task"})
45
+ assert schema.execute_sync("{ probe { title } }").data == {
46
+ "probe": {"title": "Fabricated task"}
47
+ }
48
+ ```
49
+
50
+ The alpha contains laboratory `probe` and `echo` roots. Do not mount them as a
51
+ production API. Native execution/admission, Relay identity/pagination, TypeScript
52
+ clients and Batten embedding are not provided by this wheel. Native qualification
53
+ harnesses and governed specifications are included in the source archive, without
54
+ installing PostgreSQL or its tools as library dependencies. Experimental APIs may
55
+ change between alpha releases. Python 3.11 is the initial qualified interpreter.
56
+
57
+ Lintel is a provisional name. This repository currently contains the HELIX
58
+ specifications and a bounded [direct UMF interoperability spike](docs/helix/02-design/spikes/SPIKE-001-direct-umf.md).
59
+ The spike reads UMF JSON through the public umf-core reader/validator and builds
60
+ a dynamic Strawberry schema. It is not a production API service.
61
+
62
+ Run `uv sync --locked --group spike --python 3.11`, then
63
+ `uv run --locked --group spike python -m spikes.direct_umf.run`.
64
+ [Verification and limits](docs/helix/04-build/direct-umf-spike.md) distinguish
65
+ this proof from native execution, Relay clients and Batten embedding.
66
+
67
+ Start with [the project packet](docs/helix/README.md),
68
+ [scope and MVP](docs/helix/01-frame/prd.md), and
69
+ [architecture](docs/helix/02-design/architecture.md).
70
+
71
+ The intended family documentation location is
72
+ [documentdrivendx.github.io/lintel](https://documentdrivendx.github.io/lintel/).
73
+ The [source repository](https://github.com/DocumentDrivenDX/lintel) is created;
74
+ family-catalog registration and documentation-site publication remain pending.
75
+
76
+
77
+ The [native read spike](docs/helix/02-design/spikes/SPIKE-002-native-reads.md)
78
+ measures pagination, declared-key batching and request consistency on disposable
79
+ PostgreSQL 18. Run `uv sync --locked --group spike --group native-spike`, then
80
+ `uv run --locked --group spike --group native-spike python -m spikes.native_reads.run`.
81
+ Use both dependency groups for `python scripts/check_quality.py` on the current tree.
82
+ [Results and gaps](docs/helix/04-build/native-read-spike.md) keep unsupported
83
+ execution guarantees explicit; no upstream schema API is introduced.
@@ -0,0 +1,67 @@
1
+ # Lintel
2
+
3
+ Dynamic GraphQL + Relay APIs from UMF, with an embeddable Python/FastAPI runtime
4
+ and generated TypeScript operation/fragment artifacts for Batten applications.
5
+
6
+ ## Install the experimental alpha
7
+
8
+ ```sh
9
+ pip install lintel-api==0.1.0a1
10
+ ```
11
+
12
+ Import `project` from `lintel.experimental.projection` and
13
+ `build_probe_schema` / `export_sdl` from `lintel.experimental.schema`.
14
+ These expose the bounded S-01 scalar projection: string, boolean, exact decimal
15
+ text and canonical UUID, with optional-field omission preserved. Supply UMF JSON
16
+ and explicit record/field references; the example below uses the task-board model
17
+ in the source distribution.
18
+
19
+ ```python
20
+ from pathlib import Path
21
+ from lintel.experimental.projection import project
22
+ from lintel.experimental.schema import build_probe_schema
23
+
24
+ plan = project(
25
+ Path("docs/helix/02-design/examples/task-board.umf.json").read_text(),
26
+ ("board", "Task"), "Task", {("board", "title"): "title"},
27
+ )
28
+ schema = build_probe_schema(plan, {"title": "Fabricated task"})
29
+ assert schema.execute_sync("{ probe { title } }").data == {
30
+ "probe": {"title": "Fabricated task"}
31
+ }
32
+ ```
33
+
34
+ The alpha contains laboratory `probe` and `echo` roots. Do not mount them as a
35
+ production API. Native execution/admission, Relay identity/pagination, TypeScript
36
+ clients and Batten embedding are not provided by this wheel. Native qualification
37
+ harnesses and governed specifications are included in the source archive, without
38
+ installing PostgreSQL or its tools as library dependencies. Experimental APIs may
39
+ change between alpha releases. Python 3.11 is the initial qualified interpreter.
40
+
41
+ Lintel is a provisional name. This repository currently contains the HELIX
42
+ specifications and a bounded [direct UMF interoperability spike](docs/helix/02-design/spikes/SPIKE-001-direct-umf.md).
43
+ The spike reads UMF JSON through the public umf-core reader/validator and builds
44
+ a dynamic Strawberry schema. It is not a production API service.
45
+
46
+ Run `uv sync --locked --group spike --python 3.11`, then
47
+ `uv run --locked --group spike python -m spikes.direct_umf.run`.
48
+ [Verification and limits](docs/helix/04-build/direct-umf-spike.md) distinguish
49
+ this proof from native execution, Relay clients and Batten embedding.
50
+
51
+ Start with [the project packet](docs/helix/README.md),
52
+ [scope and MVP](docs/helix/01-frame/prd.md), and
53
+ [architecture](docs/helix/02-design/architecture.md).
54
+
55
+ The intended family documentation location is
56
+ [documentdrivendx.github.io/lintel](https://documentdrivendx.github.io/lintel/).
57
+ The [source repository](https://github.com/DocumentDrivenDX/lintel) is created;
58
+ family-catalog registration and documentation-site publication remain pending.
59
+
60
+
61
+ The [native read spike](docs/helix/02-design/spikes/SPIKE-002-native-reads.md)
62
+ measures pagination, declared-key batching and request consistency on disposable
63
+ PostgreSQL 18. Run `uv sync --locked --group spike --group native-spike`, then
64
+ `uv run --locked --group spike --group native-spike python -m spikes.native_reads.run`.
65
+ Use both dependency groups for `python scripts/check_quality.py` on the current tree.
66
+ [Results and gaps](docs/helix/04-build/native-read-spike.md) keep unsupported
67
+ execution guarantees explicit; no upstream schema API is introduced.
@@ -0,0 +1,39 @@
1
+ ---
2
+ ddx:
3
+ id: lintel.owner-intent
4
+ type: input
5
+ activity: discover
6
+ authoring:
7
+ home: repo
8
+ ---
9
+
10
+ # Owner intent and scope decisions
11
+
12
+ Source: this Codex conversation, 2026-11-02, America/New_York.
13
+
14
+ 1. Frame a separate sibling project with HELIX: scope, architecture, MVP and
15
+ changes needed in UMF and the runtime.
16
+ 2. Include it in the UMF family on DocumentDrivenDX.github.io.
17
+ 3. Use Lintel provisionally as the project name.
18
+ 4. Prefer a Python backend to fit the Databricks Apps FastAPI backend standard.
19
+ 5. Include this runtime in Batten and comprehend building TypeScript clients
20
+ for the same API.
21
+ 6. Prefer GraphQL + Relay; both GraphQL and OpenAPI are unnecessary. Relay's
22
+ type descriptions, pagination and node expansion motivate the selection.
23
+
24
+ The latest choices replace the earlier dual REST/GraphQL and TypeScript-server
25
+ suggestions. FastAPI is the HTTP host; it does not imply a generated REST product API.
26
+ A standalone app factory remains useful for testing and other embedders; Batten
27
+ is the required first consumer. Batten integration is a deliverable, not optional.
28
+
29
+ Planning assumptions: PostgreSQL 18 first; one-hop relationships; startup schema
30
+ construction; request-local cache; no admin UI. These are reversible design
31
+ choices, not additional owner statements. No delivery date, staffing, budget,
32
+ production workspace, IdP or family-catalog source repository was specified.
33
+
34
+ ## Direct UMF input
35
+
36
+ Owner clarification: consume UMF directly. UMF is already the model/schema; do
37
+ not invent an intermediate schema-description API. An ORM may expose its existing
38
+ UMF as JSON if needed. Update the specs and execute the first direct-input spike;
39
+ make only UMF/runtime changes that its evidence demonstrates are necessary.
@@ -0,0 +1,74 @@
1
+ ---
2
+ ddx:
3
+ id: lintel.product-vision
4
+ type: product-vision
5
+ activity: discover
6
+ authoring:
7
+ home: repo
8
+ links:
9
+ - id: lintel.owner-intent
10
+ kind: informed_by
11
+ ---
12
+
13
+ # Lintel product vision
14
+
15
+ ## Mission Statement
16
+
17
+ Give Batten application builders a GraphQL API and typed Relay clients from
18
+ UMF declarations, preserving the host's authority and the data runtime's meaning.
19
+
20
+ ## Positioning
21
+
22
+ For Python application authors and Batten platform maintainers, Lintel is an
23
+ embeddable API runtime that derives GraphQL types and executable access from
24
+ approved UMF models. The alternative is handwritten Strawberry schemas,
25
+ resolvers and separately maintained TypeScript API types for every application.
26
+
27
+ ## Vision
28
+
29
+ An application declares its data and operations once. Its backend publishes a
30
+ bounded API and its browser builds typed queries, fragments and mutations
31
+ against exactly that API. Runtime upgrades remain a platform responsibility.
32
+
33
+ **North Star**: One admitted model drives executable access and TypeScript client
34
+ artifacts, with observable agreement across the application boundary.
35
+
36
+ ## User Experience
37
+
38
+ A builder selects a fabricated task board's records, relationships and commands.
39
+ Batten prepares the model and mounts Lintel. The builder compiles a Relay list
40
+ query and fragments, pages tasks, expands an assignee and submits an approved
41
+ command. The host enforces current authority and returns an attributable outcome.
42
+ An unsupported selected meaning prevents activation with a useful diagnostic.
43
+
44
+ ## Target Market
45
+
46
+ | Attribute | Description |
47
+ | --- | --- |
48
+ | Who | Batten's trusted first-party Python application authors and platform maintainers. Broader demand is unverified. |
49
+ | Pain | Backend models, graph access, browser types and access checks drift when assembled per application. |
50
+ | Current Solution | Handwritten GraphQL schemas/resolvers and application-specific API/client wiring. |
51
+ | Why They Switch | Reuse declared semantics and platform-qualified execution across applications. |
52
+
53
+ ## Key Value Propositions
54
+
55
+ | Value Proposition | Customer Benefit |
56
+ | --- | --- |
57
+ | Model-derived API | Builders maintain fewer copies of identities, fields and operations. |
58
+ | Relay interoperability | Browser teams reuse node refetch, fragments and connection pagination. |
59
+ | Batten embedding | Applications retain host admission, authority and lifecycle controls. |
60
+ | Explicit support limits | Teams see unavailable semantics before exposing a misleading API. |
61
+
62
+ ## Success Definition
63
+
64
+ | Indicator | Measurement |
65
+ | --- | --- |
66
+ | Reduced duplicate modeling | Compare one Batten application's handwritten schema/client definitions before and after adoption. No numeric target is established. |
67
+ | Client/server agreement | Compare generated operation artifacts and actual endpoint results for the same admitted schema. |
68
+ | Safe cohort changes | Observe changed-schema/client diagnostics and consumer regression outcomes during platform upgrades. |
69
+
70
+ ## Why Now
71
+
72
+ UMF has a published Python/native access cohort and Batten is framing packaged
73
+ runtimes and TypeScript application interfaces. The owner requested their shared
74
+ API layer now. Neither upstream availability nor this request proves Lintel delivery.
@@ -0,0 +1,62 @@
1
+ ---
2
+ ddx:
3
+ id: lintel.source-inventory
4
+ type: research-note
5
+ activity: discover
6
+ authoring:
7
+ home: repo
8
+ links:
9
+ - id: lintel.owner-intent
10
+ kind: informed_by
11
+ ---
12
+
13
+ # Source inventory and evidence limits
14
+
15
+ The [manifest](sources/manifest.json) records exact hashes and checkout heads for
16
+ inspected public UMF, Weft and Batten sources. Some primary-checkout files and
17
+ candidate Batten packages are uncommitted. Working-tree hashes identify what was
18
+ read; a Git HEAD alone does not claim those candidate files were published.
19
+ Engine source is neither copied nor imported into Lintel. One small public UMF
20
+ commerce fixture is pinned for offline design/schema inspection; it is not the
21
+ final task-board application and adds no Lintel execution claim.
22
+
23
+ Published UMF 0.5.2 qualification differs from older narrative notes and Batten's
24
+ newer local Weft pin. Use the actual intersecting installed cohort for build work.
25
+ The active UMF Rust-migration proposal is recorded as candidate direction.
26
+ Native, package, browser and deployed claims remain separate.
27
+
28
+ ## Standards and framework references
29
+
30
+ - [GraphQL September 2025](https://spec.graphql.org/September2025/): language and execution reference edition; selected feature support requires tests.
31
+ - [Relay server guide](https://relay.dev/docs/guides/graphql-server-specification/): object refetch and connection conventions.
32
+ - [Relay object identification](https://relay.dev/graphql/objectidentification.htm): Node and node lookup/field-stability requirements.
33
+ - [Relay connections](https://relay.dev/graphql/connections.htm): edges, cursors, PageInfo and supported pagination conventions.
34
+ - [Relay type emission](https://relay.dev/docs/guides/type-emission/): operation/fragment TypeScript artifacts; guide served v21.0.1 during inspection.
35
+ - [Strawberry FastAPI](https://strawberry.rocks/docs/integrations/fastapi): GraphQLRouter, context injection and async resolver behavior. Observed documentation 0.339.1; implementation dependency remains unselected/unlocked.
36
+ - [Strawberry Relay](https://strawberry.rocks/docs/guides/relay): existing Python Relay integration. It does not qualify Lintel's backend pagination.
37
+ - [Databricks Apps development](https://docs.databricks.com/aws/en/dev-tools/databricks-apps/app-development): Python app/configuration development.
38
+ - [Databricks app configuration](https://docs.databricks.com/aws/en/dev-tools/databricks-apps/app-runtime): app.yaml execution configuration.
39
+ - [Databricks app authorization](https://docs.databricks.com/aws/en/dev-tools/databricks-apps/auth): app and user authority are distinct.
40
+
41
+ Reference retrieval was read-only; no workspace access, live app deployment,
42
+ package resolution, GraphQL execution or Relay compilation was performed.
43
+ Public documentation is consulted, not vendored. Version locks and publication
44
+ schema sources belong to the implementation cohort when chosen.
45
+
46
+ ## Family publication lookup
47
+
48
+ The requested root `https://documentdrivendx.github.io/` could not be retrieved,
49
+ and `DocumentDrivenDX/DocumentDrivenDX.github.io` returned 404. This does not prove
50
+ the site/catalog does not exist. Batten's local public configuration identifies
51
+ its project site at `/batten/`; family registry ownership remains unresolved.
52
+
53
+
54
+ ## Specification expansion references
55
+
56
+ The 2026-11-02 expansion rechecked the public Python UMF exports, current core
57
+ 0.10 schema and Batten TablePort; its minimal existing operation shape does not
58
+ claim the newly specified neutral execution protocol.
59
+ [GraphQL over HTTP working draft](https://http-spec.graphql.org/draft/) was consulted
60
+ on 2026-11-02; CONTRACT-005 defines a selected finite profile rather than claiming
61
+ full draft conformance. Relay/GraphQL references above informed the target profile.
62
+ No live provider or compiler execution was performed as research.
@@ -0,0 +1,140 @@
1
+ {
2
+ "recorded": "2026-11-02",
3
+ "sources": [
4
+ {
5
+ "project": "umf",
6
+ "checkout": "/Users/erik/.codex/worktrees/7076/umf",
7
+ "path": "docs/helix/02-design/contracts/CONTRACT-079-unified-python-access.md",
8
+ "sha256": "250cda75996506a5a51f0f6029fbeae39b399e2571e8a2d0b08dee7c20e61239",
9
+ "checkoutHead": "b12a489844f29947ee52115b90f4ccc5c8bc5032",
10
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
11
+ },
12
+ {
13
+ "project": "umf",
14
+ "checkout": "/Users/erik/Projects/umf",
15
+ "path": "docs/helix/05-deploy/sdk-release-notes-0.5.2.md",
16
+ "sha256": "61c939601595a1efe6b1b00be32e5fd846a8429c4534c8753c993e71d809c9fe",
17
+ "checkoutHead": "b12a489844f29947ee52115b90f4ccc5c8bc5032",
18
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
19
+ },
20
+ {
21
+ "project": "umf",
22
+ "checkout": "/Users/erik/Projects/umf",
23
+ "path": "docs/helix/02-design/contracts/CONTRACT-081-table-lifecycle.md",
24
+ "sha256": "067b46a609a238886acd990ca0e84cb6100af6c87479c23b04eb20b8cc2ecd12",
25
+ "checkoutHead": "b12a489844f29947ee52115b90f4ccc5c8bc5032",
26
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
27
+ },
28
+ {
29
+ "project": "umf",
30
+ "checkout": "/Users/erik/Projects/umf",
31
+ "path": "docs/helix/02-design/adr/ADR-006-shared-rust-implementation.md",
32
+ "sha256": "0e483f2b040560daf9c91b35e5ffaefbee2faad90fa7b8ade148b9c1b02f63ee",
33
+ "checkoutHead": "b12a489844f29947ee52115b90f4ccc5c8bc5032",
34
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
35
+ },
36
+ {
37
+ "project": "umf",
38
+ "checkout": "/Users/erik/.codex/worktrees/7076/umf",
39
+ "path": "src/access/index.ts",
40
+ "sha256": "f3befb035ddc935d8b52192666aff3e64d65d1314fb28765762e35c07e6f5422",
41
+ "checkoutHead": "b12a489844f29947ee52115b90f4ccc5c8bc5032",
42
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
43
+ },
44
+ {
45
+ "project": "umf",
46
+ "checkout": "/Users/erik/.codex/worktrees/7076/umf",
47
+ "path": "python/src/umf/__init__.py",
48
+ "sha256": "e9dca8a080364f76a1c370caabd95f35e36c011c6b27fd58a487cadf320aee9d",
49
+ "checkoutHead": "b12a489844f29947ee52115b90f4ccc5c8bc5032",
50
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
51
+ },
52
+ {
53
+ "project": "weft",
54
+ "checkout": "/Users/erik/Projects/weft",
55
+ "path": "README.md",
56
+ "sha256": "685506b3b4c1ccdcfb15fbdd7e287cc801d6edc584d67346393e18dedb416e2d",
57
+ "checkoutHead": "ca86d095d4c362903a3461900dada0157efbdc63",
58
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
59
+ },
60
+ {
61
+ "project": "batten",
62
+ "checkout": "/Users/erik/Projects/batten",
63
+ "path": "docs/helix/00-discover/product-vision.md",
64
+ "sha256": "5947546f62df8de6732834053e7c35ff465ef9631233e992b44fc08281245b28",
65
+ "checkoutHead": "27f087666a56b3136e39cd5c471b954ceb5630ae",
66
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
67
+ },
68
+ {
69
+ "project": "batten",
70
+ "checkout": "/Users/erik/Projects/batten",
71
+ "path": "docs/helix/01-frame/prd.md",
72
+ "sha256": "9402ac744ac3f54ad8d40055dfda7a8a2a3081cbc863961c7bb01e65d994b10f",
73
+ "checkoutHead": "27f087666a56b3136e39cd5c471b954ceb5630ae",
74
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
75
+ },
76
+ {
77
+ "project": "batten",
78
+ "checkout": "/Users/erik/Projects/batten",
79
+ "path": "docs/helix/01-frame/concerns.md",
80
+ "sha256": "10b3a8e99b65252eb01251cb99b2f9c60deb9112514090ec4b66df868bd837f8",
81
+ "checkoutHead": "27f087666a56b3136e39cd5c471b954ceb5630ae",
82
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
83
+ },
84
+ {
85
+ "project": "batten",
86
+ "checkout": "/Users/erik/Projects/batten",
87
+ "path": "docs/helix/02-design/architecture.md",
88
+ "sha256": "1ecc1e3dcf243283a1bf776b0726fad1223dbdafcd378d32d1defddf832cee24",
89
+ "checkoutHead": "27f087666a56b3136e39cd5c471b954ceb5630ae",
90
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
91
+ },
92
+ {
93
+ "project": "batten",
94
+ "checkout": "/Users/erik/Projects/batten",
95
+ "path": "docs/helix/02-design/contracts/CONTRACT-001-public-host-api.md",
96
+ "sha256": "f257b5ff98326667ebac7ece53a4f42cacc74576e55473bdea3b19c25f023eb2",
97
+ "checkoutHead": "27f087666a56b3136e39cd5c471b954ceb5630ae",
98
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
99
+ },
100
+ {
101
+ "project": "batten",
102
+ "checkout": "/Users/erik/Projects/batten",
103
+ "path": "docs/helix/02-design/adr/ADR-015-typescript-app-ui-delivery.md",
104
+ "sha256": "67ff514c2189bc6d7db0b7d1e0569b0bb6267cc8cffc68a005ab897171478b2e",
105
+ "checkoutHead": "27f087666a56b3136e39cd5c471b954ceb5630ae",
106
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
107
+ },
108
+ {
109
+ "project": "batten",
110
+ "checkout": "/Users/erik/Projects/batten",
111
+ "path": "packages/batten-tables/src/batten/tables/__init__.py",
112
+ "sha256": "776914618c7d88b40470df52b6704052c24391b23b7292d07f994fdcbdf43d69",
113
+ "checkoutHead": "27f087666a56b3136e39cd5c471b954ceb5630ae",
114
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
115
+ },
116
+ {
117
+ "project": "batten",
118
+ "checkout": "/Users/erik/Projects/batten",
119
+ "path": "packages/batten-umf-postgres/src/batten/umf_postgres/__init__.py",
120
+ "sha256": "0d755c2288e342d149e8c5389fca6cb606f0efbf3f6b7387a4bacb9f70764869",
121
+ "checkoutHead": "27f087666a56b3136e39cd5c471b954ceb5630ae",
122
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
123
+ },
124
+ {
125
+ "project": "batten",
126
+ "checkout": "/Users/erik/Projects/batten",
127
+ "path": "packages/batten-umf-postgres/pyproject.toml",
128
+ "sha256": "946b9163ce6324064eb178e2552bcad6ee3cce46028998d470765028b4af1a52",
129
+ "checkoutHead": "27f087666a56b3136e39cd5c471b954ceb5630ae",
130
+ "qualification": "Read-only source inspection; working-tree bytes may be uncommitted; not runtime evidence"
131
+ }
132
+ ],
133
+ "pinnedExamples": [
134
+ {
135
+ "path": "docs/helix/00-discover/sources/umf-commerce.json",
136
+ "sha256": "19c018888066d391599d4bc8079ec8f3479266e6ecc55237c57825bc33c3003d",
137
+ "origin": "/Users/erik/.codex/worktrees/7076/umf/tests/unified/commerce.json"
138
+ }
139
+ ]
140
+ }