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.
- lintel_api-0.1.0a1/.github/workflows/publish-pypi.yml +97 -0
- lintel_api-0.1.0a1/.gitignore +7 -0
- lintel_api-0.1.0a1/.helix.yml +3 -0
- lintel_api-0.1.0a1/AGENTS.md +32 -0
- lintel_api-0.1.0a1/PKG-INFO +83 -0
- lintel_api-0.1.0a1/README.md +67 -0
- lintel_api-0.1.0a1/docs/helix/00-discover/owner-intent.md +39 -0
- lintel_api-0.1.0a1/docs/helix/00-discover/product-vision.md +74 -0
- lintel_api-0.1.0a1/docs/helix/00-discover/source-inventory.md +62 -0
- lintel_api-0.1.0a1/docs/helix/00-discover/sources/manifest.json +140 -0
- lintel_api-0.1.0a1/docs/helix/00-discover/sources/umf-commerce.json +135 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/concerns.md +70 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-001-model-projection.md +85 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-002-relay-reads.md +85 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-003-commands-outcomes.md +85 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-004-typescript-clients.md +85 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-005-batten-embedding.md +85 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/features/FEAT-006-delivery-family.md +85 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/prd.md +173 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-001-model-projection.md +66 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-002-relay-reads.md +66 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-003-commands-outcomes.md +66 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-004-typescript-clients.md +66 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-005-batten-embedding.md +66 -0
- lintel_api-0.1.0a1/docs/helix/01-frame/user-stories/US-006-delivery-family.md +66 -0
- lintel_api-0.1.0a1/docs/helix/02-design/adr/ADR-001-embedded-python-runtime.md +68 -0
- lintel_api-0.1.0a1/docs/helix/02-design/adr/ADR-002-graphql-relay-client.md +62 -0
- lintel_api-0.1.0a1/docs/helix/02-design/architecture.md +232 -0
- lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-001-exposure-and-projection.md +147 -0
- lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-002-neutral-execution-port.md +166 -0
- lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-003-graphql-relay-profile.md +199 -0
- lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-004-typescript-relay-clients.md +174 -0
- lintel_api-0.1.0a1/docs/helix/02-design/contracts/CONTRACT-005-hosting-and-resource-bounds.md +191 -0
- lintel_api-0.1.0a1/docs/helix/02-design/contracts/README.md +17 -0
- lintel_api-0.1.0a1/docs/helix/02-design/examples/README.md +58 -0
- lintel_api-0.1.0a1/docs/helix/02-design/examples/host-profile.json +25 -0
- lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.cases.json +94 -0
- lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.exposure.json +123 -0
- lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.graphql +56 -0
- lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.operations.graphql +26 -0
- lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.relay.graphql +10 -0
- lintel_api-0.1.0a1/docs/helix/02-design/examples/task-board.umf.json +182 -0
- lintel_api-0.1.0a1/docs/helix/02-design/interfaces/ports.pyi +72 -0
- lintel_api-0.1.0a1/docs/helix/02-design/schemas/client-manifest.schema.json +140 -0
- lintel_api-0.1.0a1/docs/helix/02-design/schemas/exposure.schema.json +329 -0
- lintel_api-0.1.0a1/docs/helix/02-design/schemas/host-profile.schema.json +159 -0
- lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-001-model-projection.md +87 -0
- lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-002-relay-reads.md +87 -0
- lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-003-commands-outcomes.md +87 -0
- lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-004-typescript-clients.md +87 -0
- lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-005-batten-embedding.md +87 -0
- lintel_api-0.1.0a1/docs/helix/02-design/solution-designs/SD-006-delivery-family.md +87 -0
- lintel_api-0.1.0a1/docs/helix/02-design/spikes/SPIKE-001-direct-umf.md +94 -0
- lintel_api-0.1.0a1/docs/helix/02-design/spikes/SPIKE-002-native-reads.md +110 -0
- lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-001-model-projection.md +132 -0
- lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-002-relay-reads.md +116 -0
- lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-003-commands-outcomes.md +119 -0
- lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-004-typescript-clients.md +117 -0
- lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-005-batten-embedding.md +116 -0
- lintel_api-0.1.0a1/docs/helix/02-design/technical-designs/TD-006-delivery-family.md +115 -0
- lintel_api-0.1.0a1/docs/helix/02-design/upstream-changes.md +136 -0
- lintel_api-0.1.0a1/docs/helix/03-test/test-plan.md +120 -0
- lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-001-model-projection.md +86 -0
- lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-002-relay-reads.md +86 -0
- lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-003-commands-outcomes.md +86 -0
- lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-004-typescript-clients.md +86 -0
- lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-005-batten-embedding.md +86 -0
- lintel_api-0.1.0a1/docs/helix/03-test/test-plans/STP-006-delivery-family.md +86 -0
- lintel_api-0.1.0a1/docs/helix/04-build/direct-umf-spike.md +69 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/packet-checks.json +10 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/request-reads-legacy.json +63 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/request-reads-native.json +60 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-artifact-checks.json +156 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-direct-umf.graphql +24 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-direct-umf.json +28 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-document-checks.json +7 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-quality-controls.json +8 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s01-verification.json +102 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s02-artifact-checks.json +12 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s02-checks.json +29 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s02-document-checks.json +7 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/s02-native-reads.json +91 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/specification-checks.json +57 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/specification-instance-results.json +681 -0
- lintel_api-0.1.0a1/docs/helix/04-build/evidence/validator-results.json +317 -0
- lintel_api-0.1.0a1/docs/helix/04-build/framing-validation.md +72 -0
- lintel_api-0.1.0a1/docs/helix/04-build/native-read-spike.md +62 -0
- lintel_api-0.1.0a1/docs/helix/04-build/request-read-implementation.md +30 -0
- lintel_api-0.1.0a1/docs/helix/04-build/specification-expansion.md +62 -0
- lintel_api-0.1.0a1/docs/helix/05-deploy/family-integration.md +48 -0
- lintel_api-0.1.0a1/docs/helix/05-deploy/release-notes.md +85 -0
- lintel_api-0.1.0a1/docs/helix/README.md +67 -0
- lintel_api-0.1.0a1/pyproject.toml +82 -0
- lintel_api-0.1.0a1/scripts/check_boundaries.py +108 -0
- lintel_api-0.1.0a1/scripts/check_installed.py +46 -0
- lintel_api-0.1.0a1/scripts/check_quality.py +55 -0
- lintel_api-0.1.0a1/spikes/__init__.py +0 -0
- lintel_api-0.1.0a1/spikes/direct_umf/__init__.py +0 -0
- lintel_api-0.1.0a1/spikes/direct_umf/run.py +82 -0
- lintel_api-0.1.0a1/spikes/native_reads/__init__.py +0 -0
- lintel_api-0.1.0a1/spikes/native_reads/fixture.py +264 -0
- lintel_api-0.1.0a1/spikes/native_reads/model.umf.json +859 -0
- lintel_api-0.1.0a1/spikes/native_reads/probes.py +167 -0
- lintel_api-0.1.0a1/spikes/native_reads/run.py +52 -0
- lintel_api-0.1.0a1/spikes/request_reads/__init__.py +0 -0
- lintel_api-0.1.0a1/spikes/request_reads/qualify.py +415 -0
- lintel_api-0.1.0a1/src/lintel/__init__.py +3 -0
- lintel_api-0.1.0a1/src/lintel/experimental/__init__.py +0 -0
- lintel_api-0.1.0a1/src/lintel/experimental/projection.py +121 -0
- lintel_api-0.1.0a1/src/lintel/experimental/schema.py +105 -0
- lintel_api-0.1.0a1/src/lintel/py.typed +0 -0
- lintel_api-0.1.0a1/tests/test_boundaries.py +45 -0
- lintel_api-0.1.0a1/tests/test_direct_umf.py +188 -0
- 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,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
|
+
}
|