utterverify 0.1.0__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.
- utterverify-0.1.0/.codecrate.toml +26 -0
- utterverify-0.1.0/.github/workflows/python-publish.yml +171 -0
- utterverify-0.1.0/.github/workflows/tests.yml +18 -0
- utterverify-0.1.0/.gitignore +222 -0
- utterverify-0.1.0/.ledger/ledger.toml +24 -0
- utterverify-0.1.0/.ledger/releaseledger/.ledger-project.toml +6 -0
- utterverify-0.1.0/.ledger/releaseledger/config.toml +57 -0
- utterverify-0.1.0/.ledger/releaseledger/data/.ledger-project.toml +6 -0
- utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +14 -0
- utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0001.md +29 -0
- utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0002.md +29 -0
- utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0003.md +29 -0
- utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0004.md +29 -0
- utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0005.md +29 -0
- utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0006.md +28 -0
- utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/release.md +29 -0
- utterverify-0.1.0/.ledger/releaseledger/write.lock +0 -0
- utterverify-0.1.0/.ledger/taskledger/.ledger-project.toml +6 -0
- utterverify-0.1.0/.ledger/taskledger/config.toml +7 -0
- utterverify-0.1.0/.pre-commit-config.yaml +64 -0
- utterverify-0.1.0/LICENSE +201 -0
- utterverify-0.1.0/PKG-INFO +251 -0
- utterverify-0.1.0/README.md +217 -0
- utterverify-0.1.0/docs/Makefile +32 -0
- utterverify-0.1.0/docs/changelog.md +23 -0
- utterverify-0.1.0/docs/conf.py +101 -0
- utterverify-0.1.0/docs/make.bat +113 -0
- utterverify-0.1.0/docs/make.py +89 -0
- utterverify-0.1.0/docs/requirements.txt +5 -0
- utterverify-0.1.0/pyproject.toml +75 -0
- utterverify-0.1.0/setup.cfg +4 -0
- utterverify-0.1.0/tests/test_bundle.py +409 -0
- utterverify-0.1.0/tests/test_cli.py +381 -0
- utterverify-0.1.0/tests/test_config.py +62 -0
- utterverify-0.1.0/tests/test_doctor.py +425 -0
- utterverify-0.1.0/tests/test_renderplan_contract.py +421 -0
- utterverify-0.1.0/utterverify/__init__.py +30 -0
- utterverify-0.1.0/utterverify/__main__.py +3 -0
- utterverify-0.1.0/utterverify/_version.py +24 -0
- utterverify-0.1.0/utterverify/bundle.py +646 -0
- utterverify-0.1.0/utterverify/cli.py +406 -0
- utterverify-0.1.0/utterverify/config.py +261 -0
- utterverify-0.1.0/utterverify/core.py +419 -0
- utterverify-0.1.0/utterverify/doctor.py +509 -0
- utterverify-0.1.0/utterverify/errors.py +17 -0
- utterverify-0.1.0/utterverify/py.typed +0 -0
- utterverify-0.1.0/utterverify/types.py +102 -0
- utterverify-0.1.0/utterverify.egg-info/PKG-INFO +251 -0
- utterverify-0.1.0/utterverify.egg-info/SOURCES.txt +53 -0
- utterverify-0.1.0/utterverify.egg-info/dependency_links.txt +1 -0
- utterverify-0.1.0/utterverify.egg-info/entry_points.txt +2 -0
- utterverify-0.1.0/utterverify.egg-info/requires.txt +14 -0
- utterverify-0.1.0/utterverify.egg-info/scm_file_list.json +48 -0
- utterverify-0.1.0/utterverify.egg-info/scm_version.json +8 -0
- utterverify-0.1.0/utterverify.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
[codecrate]
|
|
2
|
+
output = "context_utterverify.md"
|
|
3
|
+
keep_docstrings = true
|
|
4
|
+
dedupe = true
|
|
5
|
+
metadata = false
|
|
6
|
+
respect_gitignore = true
|
|
7
|
+
exclude = ["*/.venv/*", "context_utterverify.*"]
|
|
8
|
+
gitignore_allow = ["utterverify/_version.py"]
|
|
9
|
+
include = [
|
|
10
|
+
"**/*.py",
|
|
11
|
+
"**/*.toml",
|
|
12
|
+
"**/*.md",
|
|
13
|
+
"**/*.json",
|
|
14
|
+
"**/*.txt",
|
|
15
|
+
"**/*.csv",
|
|
16
|
+
"**/*.tsv",
|
|
17
|
+
"**/*.yaml",
|
|
18
|
+
"**/*.yml",
|
|
19
|
+
"**/*.ssmd",
|
|
20
|
+
"**/*.typed",
|
|
21
|
+
"LICENSE",
|
|
22
|
+
]
|
|
23
|
+
split_max_chars = 0
|
|
24
|
+
layout = "full"
|
|
25
|
+
profile = "portable-agent"
|
|
26
|
+
emit_standalone_unpacker = true
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
name: Validate and publish 0.1.0
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v0.1.0"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: release-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: false
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
tests:
|
|
17
|
+
name: Tests and static checks (Python ${{ matrix.python-version }})
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
strategy:
|
|
20
|
+
fail-fast: false
|
|
21
|
+
matrix:
|
|
22
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
23
|
+
steps:
|
|
24
|
+
- name: Check out the release tag
|
|
25
|
+
uses: actions/checkout@v4
|
|
26
|
+
with:
|
|
27
|
+
ref: ${{ github.ref }}
|
|
28
|
+
fetch-depth: 0
|
|
29
|
+
- name: Set up Python
|
|
30
|
+
uses: actions/setup-python@v5
|
|
31
|
+
with:
|
|
32
|
+
python-version: ${{ matrix.python-version }}
|
|
33
|
+
- name: Install development dependencies
|
|
34
|
+
run: python -m pip install -e '.[dev]'
|
|
35
|
+
- name: Run tests
|
|
36
|
+
run: python -m pytest -q
|
|
37
|
+
- name: Run Ruff lint
|
|
38
|
+
run: ruff check .
|
|
39
|
+
- name: Check Ruff formatting
|
|
40
|
+
run: ruff format --check utterverify tests
|
|
41
|
+
- name: Run mypy
|
|
42
|
+
run: mypy utterverify
|
|
43
|
+
- name: Compile package
|
|
44
|
+
run: python -m compileall -q utterverify
|
|
45
|
+
|
|
46
|
+
build:
|
|
47
|
+
name: Build and validate distributions
|
|
48
|
+
needs: tests
|
|
49
|
+
runs-on: ubuntu-latest
|
|
50
|
+
steps:
|
|
51
|
+
- name: Check out the release tag
|
|
52
|
+
uses: actions/checkout@v4
|
|
53
|
+
with:
|
|
54
|
+
ref: ${{ github.ref }}
|
|
55
|
+
fetch-depth: 0
|
|
56
|
+
- name: Set up Python
|
|
57
|
+
uses: actions/setup-python@v5
|
|
58
|
+
with:
|
|
59
|
+
python-version: "3.11"
|
|
60
|
+
- name: Install build tooling
|
|
61
|
+
run: python -m pip install --upgrade build packaging twine
|
|
62
|
+
- name: Build wheel and source distribution
|
|
63
|
+
run: python -m build
|
|
64
|
+
- name: Check distribution metadata
|
|
65
|
+
run: python -m twine check dist/*
|
|
66
|
+
- name: Validate version, dependencies, and packaged files
|
|
67
|
+
env:
|
|
68
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
69
|
+
run: |
|
|
70
|
+
python - <<'PY'
|
|
71
|
+
import os
|
|
72
|
+
import re
|
|
73
|
+
import tarfile
|
|
74
|
+
import zipfile
|
|
75
|
+
from email import policy
|
|
76
|
+
from email.parser import Parser
|
|
77
|
+
from pathlib import Path
|
|
78
|
+
|
|
79
|
+
from packaging.specifiers import SpecifierSet
|
|
80
|
+
from packaging.requirements import Requirement
|
|
81
|
+
|
|
82
|
+
tag = os.environ["RELEASE_TAG"]
|
|
83
|
+
assert tag == "v0.1.0", tag
|
|
84
|
+
version = tag.removeprefix("v")
|
|
85
|
+
artifacts = list(Path("dist").iterdir())
|
|
86
|
+
wheels = [path for path in artifacts if path.suffix == ".whl"]
|
|
87
|
+
sdists = [path for path in artifacts if path.name.endswith(".tar.gz")]
|
|
88
|
+
assert len(wheels) == 1, wheels
|
|
89
|
+
assert len(sdists) == 1, sdists
|
|
90
|
+
|
|
91
|
+
wheel_match = re.fullmatch(
|
|
92
|
+
r"utterverify-([^-]+)-[^-]+-[^-]+-[^-]+\.whl", wheels[0].name
|
|
93
|
+
)
|
|
94
|
+
sdist_match = re.fullmatch(r"utterverify-([^-]+)\.tar\.gz", sdists[0].name)
|
|
95
|
+
assert wheel_match is not None, wheels[0]
|
|
96
|
+
assert sdist_match is not None, sdists[0]
|
|
97
|
+
assert wheel_match.group(1) == version, (wheel_match.group(1), version)
|
|
98
|
+
assert sdist_match.group(1) == version, (sdist_match.group(1), version)
|
|
99
|
+
|
|
100
|
+
with zipfile.ZipFile(wheels[0]) as archive:
|
|
101
|
+
metadata_name = next(
|
|
102
|
+
name for name in archive.namelist() if name.endswith(".dist-info/METADATA")
|
|
103
|
+
)
|
|
104
|
+
metadata = Parser(policy=policy.default).parsestr(
|
|
105
|
+
archive.read(metadata_name).decode("utf-8")
|
|
106
|
+
)
|
|
107
|
+
assert metadata["Name"] == "utterverify"
|
|
108
|
+
assert metadata["Version"] == version
|
|
109
|
+
requirements = [
|
|
110
|
+
Requirement(value) for value in metadata.get_all("Requires-Dist", [])
|
|
111
|
+
]
|
|
112
|
+
renderplan = [req for req in requirements if req.name.lower() == "renderplan"]
|
|
113
|
+
assert len(renderplan) == 1, requirements
|
|
114
|
+
specifier = renderplan[0].specifier
|
|
115
|
+
assert specifier == SpecifierSet(">=0.2.1,<0.3"), specifier
|
|
116
|
+
names = set(archive.namelist())
|
|
117
|
+
assert {
|
|
118
|
+
"utterverify/py.typed",
|
|
119
|
+
"utterverify/cli.py",
|
|
120
|
+
"utterverify/__main__.py",
|
|
121
|
+
} <= names
|
|
122
|
+
|
|
123
|
+
with tarfile.open(sdists[0], "r:gz") as archive:
|
|
124
|
+
pkg_info_name = next(
|
|
125
|
+
name for name in archive.getnames() if name.endswith("/PKG-INFO")
|
|
126
|
+
)
|
|
127
|
+
pkg_info = Parser(policy=policy.default).parsestr(
|
|
128
|
+
archive.extractfile(pkg_info_name).read().decode("utf-8")
|
|
129
|
+
)
|
|
130
|
+
assert pkg_info["Name"] == "utterverify"
|
|
131
|
+
assert pkg_info["Version"] == version
|
|
132
|
+
PY
|
|
133
|
+
- name: Smoke-test the wheel in a clean environment
|
|
134
|
+
env:
|
|
135
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
136
|
+
run: |
|
|
137
|
+
smoke_env="$RUNNER_TEMP/utterverify-wheel-smoke"
|
|
138
|
+
python -m venv "$smoke_env"
|
|
139
|
+
"$smoke_env/bin/python" -m pip install dist/*.whl
|
|
140
|
+
test "$("$smoke_env/bin/utterverify" --version)" = "utterverify ${RELEASE_TAG#v}"
|
|
141
|
+
"$smoke_env/bin/utterverify" --help >/dev/null
|
|
142
|
+
- name: Upload validated distributions
|
|
143
|
+
uses: actions/upload-artifact@v4
|
|
144
|
+
with:
|
|
145
|
+
name: utterverify-dist-v0.1.0
|
|
146
|
+
path: dist/*
|
|
147
|
+
if-no-files-found: error
|
|
148
|
+
retention-days: 7
|
|
149
|
+
|
|
150
|
+
publish:
|
|
151
|
+
name: Publish validated distributions to PyPI
|
|
152
|
+
needs: build
|
|
153
|
+
if: github.ref == 'refs/tags/v0.1.0'
|
|
154
|
+
runs-on: ubuntu-latest
|
|
155
|
+
environment:
|
|
156
|
+
name: pypi
|
|
157
|
+
url: https://pypi.org/p/utterverify
|
|
158
|
+
permissions:
|
|
159
|
+
contents: read
|
|
160
|
+
id-token: write
|
|
161
|
+
steps:
|
|
162
|
+
- name: Download validated distributions
|
|
163
|
+
uses: actions/download-artifact@v4
|
|
164
|
+
with:
|
|
165
|
+
name: utterverify-dist-v0.1.0
|
|
166
|
+
path: dist/
|
|
167
|
+
- name: Publish to PyPI
|
|
168
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
169
|
+
with:
|
|
170
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
171
|
+
packages-dir: dist/
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: tests
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
pull_request:
|
|
5
|
+
jobs:
|
|
6
|
+
test:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
strategy:
|
|
9
|
+
matrix:
|
|
10
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: actions/setup-python@v5
|
|
14
|
+
with:
|
|
15
|
+
python-version: ${{ matrix.python-version }}
|
|
16
|
+
- run: python -m pip install -e '.[dev]'
|
|
17
|
+
- run: python -m pytest -q
|
|
18
|
+
- run: ruff check .
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
*.lcov
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
cover/
|
|
54
|
+
|
|
55
|
+
# Translations
|
|
56
|
+
*.mo
|
|
57
|
+
*.pot
|
|
58
|
+
|
|
59
|
+
# Django stuff:
|
|
60
|
+
*.log
|
|
61
|
+
local_settings.py
|
|
62
|
+
db.sqlite3
|
|
63
|
+
db.sqlite3-journal
|
|
64
|
+
|
|
65
|
+
# Flask stuff:
|
|
66
|
+
instance/
|
|
67
|
+
.webassets-cache
|
|
68
|
+
|
|
69
|
+
# Scrapy stuff:
|
|
70
|
+
.scrapy
|
|
71
|
+
|
|
72
|
+
# Sphinx documentation
|
|
73
|
+
docs/_build/
|
|
74
|
+
|
|
75
|
+
# PyBuilder
|
|
76
|
+
.pybuilder/
|
|
77
|
+
target/
|
|
78
|
+
|
|
79
|
+
# Jupyter Notebook
|
|
80
|
+
.ipynb_checkpoints
|
|
81
|
+
|
|
82
|
+
# IPython
|
|
83
|
+
profile_default/
|
|
84
|
+
ipython_config.py
|
|
85
|
+
|
|
86
|
+
# pyenv
|
|
87
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
88
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
89
|
+
# .python-version
|
|
90
|
+
|
|
91
|
+
# pipenv
|
|
92
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
93
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
94
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
95
|
+
# install all needed dependencies.
|
|
96
|
+
# Pipfile.lock
|
|
97
|
+
|
|
98
|
+
# uv
|
|
99
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
100
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
101
|
+
# commonly ignored for libraries.
|
|
102
|
+
# uv.lock
|
|
103
|
+
|
|
104
|
+
# poetry
|
|
105
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
106
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
107
|
+
# commonly ignored for libraries.
|
|
108
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
109
|
+
# poetry.lock
|
|
110
|
+
# poetry.toml
|
|
111
|
+
|
|
112
|
+
# pdm
|
|
113
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
114
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
115
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
116
|
+
# pdm.lock
|
|
117
|
+
# pdm.toml
|
|
118
|
+
.pdm-python
|
|
119
|
+
.pdm-build/
|
|
120
|
+
|
|
121
|
+
# pixi
|
|
122
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
123
|
+
# pixi.lock
|
|
124
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
125
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
126
|
+
.pixi/*
|
|
127
|
+
!.pixi/config.toml
|
|
128
|
+
|
|
129
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
130
|
+
__pypackages__/
|
|
131
|
+
|
|
132
|
+
# Celery stuff
|
|
133
|
+
celerybeat-schedule*
|
|
134
|
+
celerybeat.pid
|
|
135
|
+
|
|
136
|
+
# Redis
|
|
137
|
+
*.rdb
|
|
138
|
+
*.aof
|
|
139
|
+
*.pid
|
|
140
|
+
|
|
141
|
+
# RabbitMQ
|
|
142
|
+
mnesia/
|
|
143
|
+
rabbitmq/
|
|
144
|
+
rabbitmq-data/
|
|
145
|
+
|
|
146
|
+
# ActiveMQ
|
|
147
|
+
activemq-data/
|
|
148
|
+
|
|
149
|
+
# SageMath parsed files
|
|
150
|
+
*.sage.py
|
|
151
|
+
|
|
152
|
+
# Environments
|
|
153
|
+
.env
|
|
154
|
+
.envrc
|
|
155
|
+
.venv
|
|
156
|
+
env/
|
|
157
|
+
venv/
|
|
158
|
+
ENV/
|
|
159
|
+
env.bak/
|
|
160
|
+
venv.bak/
|
|
161
|
+
|
|
162
|
+
# Spyder project settings
|
|
163
|
+
.spyderproject
|
|
164
|
+
.spyproject
|
|
165
|
+
|
|
166
|
+
# Rope project settings
|
|
167
|
+
.ropeproject
|
|
168
|
+
|
|
169
|
+
# mkdocs/Zensical documentation
|
|
170
|
+
/site
|
|
171
|
+
|
|
172
|
+
# mypy
|
|
173
|
+
.mypy_cache/
|
|
174
|
+
.dmypy.json
|
|
175
|
+
dmypy.json
|
|
176
|
+
|
|
177
|
+
# Pyre type checker
|
|
178
|
+
.pyre/
|
|
179
|
+
|
|
180
|
+
# pytype static type analyzer
|
|
181
|
+
.pytype/
|
|
182
|
+
|
|
183
|
+
# Cython debug symbols
|
|
184
|
+
cython_debug/
|
|
185
|
+
|
|
186
|
+
# PyCharm
|
|
187
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
188
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
189
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
190
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
191
|
+
# .idea/
|
|
192
|
+
|
|
193
|
+
# Abstra
|
|
194
|
+
# Abstra is an AI-powered process automation framework.
|
|
195
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
196
|
+
# Learn more at https://abstra.io/docs
|
|
197
|
+
.abstra/
|
|
198
|
+
|
|
199
|
+
# Visual Studio Code
|
|
200
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore that
|
|
201
|
+
# can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
202
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer, you
|
|
203
|
+
# could uncomment the following to ignore the entire vscode folder
|
|
204
|
+
# .vscode/
|
|
205
|
+
# Temporary file for partial code execution
|
|
206
|
+
tempCodeRunnerFile.py
|
|
207
|
+
|
|
208
|
+
# Ruff stuff:
|
|
209
|
+
.ruff_cache/
|
|
210
|
+
|
|
211
|
+
# PyPI configuration file
|
|
212
|
+
.pypirc
|
|
213
|
+
|
|
214
|
+
# Marimo
|
|
215
|
+
marimo/_static/
|
|
216
|
+
marimo/_lsp/
|
|
217
|
+
__marimo__/
|
|
218
|
+
|
|
219
|
+
# Streamlit
|
|
220
|
+
.streamlit/secrets.toml
|
|
221
|
+
utterverify/_version.py
|
|
222
|
+
context_utterverify*.*
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
schema_version = 3
|
|
2
|
+
|
|
3
|
+
[project]
|
|
4
|
+
uuid = "6c47d374-a6eb-4748-acb8-1e8d6c44106d"
|
|
5
|
+
name = "utterverify"
|
|
6
|
+
|
|
7
|
+
[ledgers.taskledger.mounts.data]
|
|
8
|
+
storage = "external"
|
|
9
|
+
root = "../ledger"
|
|
10
|
+
|
|
11
|
+
[ledgers.taskledger.mounts.runtime]
|
|
12
|
+
storage = "user-data"
|
|
13
|
+
|
|
14
|
+
[ledgers.taskledger.mounts.logs]
|
|
15
|
+
storage = "user-data"
|
|
16
|
+
|
|
17
|
+
[ledgers.taskledger.mounts.indexes]
|
|
18
|
+
storage = "cache"
|
|
19
|
+
|
|
20
|
+
[ledgers.releaseledger.mounts.data]
|
|
21
|
+
storage = "project"
|
|
22
|
+
|
|
23
|
+
[ledgers.releaseledger.mounts.indexes]
|
|
24
|
+
storage = "cache"
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
config_version = 2
|
|
2
|
+
# Branch-scoped release state. This block is safe to commit.
|
|
3
|
+
ledger_ref = "main"
|
|
4
|
+
ledger_parent_ref = ""
|
|
5
|
+
ledger_branch_guard = "off"
|
|
6
|
+
# Cross-ledger identity. Local record IDs stay unchanged.
|
|
7
|
+
|
|
8
|
+
[ledger]
|
|
9
|
+
code = "rl"
|
|
10
|
+
# Release defaults.
|
|
11
|
+
|
|
12
|
+
[release]
|
|
13
|
+
default_changelog = "CHANGELOG.md"
|
|
14
|
+
default_status = "planned"
|
|
15
|
+
allow_dirty_worktree = true
|
|
16
|
+
# Changelog build defaults.
|
|
17
|
+
|
|
18
|
+
[changelog]
|
|
19
|
+
output = "docs/changelog.md"
|
|
20
|
+
header = ""
|
|
21
|
+
body = """## {% if release.date %}[{{ release.version }}] - {{ release.date }}{% else %}[{{ release.version }}] - Unreleased{% endif %}
|
|
22
|
+
|
|
23
|
+
{% for group in groups %}
|
|
24
|
+
### {{ group.title }}
|
|
25
|
+
{% for entry in group.entries %}
|
|
26
|
+
- {% if entry.breaking %}**BREAKING:** {% endif %}{{ entry.summary }}
|
|
27
|
+
{% endfor %}
|
|
28
|
+
|
|
29
|
+
{% endfor %}
|
|
30
|
+
"""
|
|
31
|
+
footer = "<!-- generated by releaseledger -->"
|
|
32
|
+
trim = true
|
|
33
|
+
render_always = false
|
|
34
|
+
postprocessors = []
|
|
35
|
+
standard = ""
|
|
36
|
+
group_mode = "extended"
|
|
37
|
+
link_references = false
|
|
38
|
+
repository_url = ""
|
|
39
|
+
tag_prefix = "v"
|
|
40
|
+
compare_url_template = ""
|
|
41
|
+
release_url_template = ""
|
|
42
|
+
preamble = ""
|
|
43
|
+
semver = false
|
|
44
|
+
unreleased = true
|
|
45
|
+
# Git-first release evidence.
|
|
46
|
+
|
|
47
|
+
[git]
|
|
48
|
+
enabled = true
|
|
49
|
+
tag_creation = "local"
|
|
50
|
+
default_base = "previous_release_tag"
|
|
51
|
+
default_head = "HEAD"
|
|
52
|
+
previous_tag_patterns = ["v{version}", "{version}"]
|
|
53
|
+
include_merges = "nontrivial"
|
|
54
|
+
require_clean_worktree = false
|
|
55
|
+
max_commits = 500
|
|
56
|
+
max_diff_chars_per_commit = 12000
|
|
57
|
+
candidate_status = "draft"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{"data":{"status":"planned"},"event":"release.created","event_id":"event-0001","record_revisions":{"release:0.1.0":1},"release_version":"0.1.0","schema_version":2}
|
|
2
|
+
{"data":{"kind":"changed","status":"accepted"},"entry_id":"entry-0001","event":"entry.added","event_id":"event-0002","record_revisions":{"entry:0.1.0/entry-0001":1,"release:0.1.0":2},"release_version":"0.1.0","schema_version":2}
|
|
3
|
+
{"data":{"kind":"fixed","status":"accepted"},"entry_id":"entry-0002","event":"entry.added","event_id":"event-0003","record_revisions":{"entry:0.1.0/entry-0002":1,"release:0.1.0":3},"release_version":"0.1.0","schema_version":2}
|
|
4
|
+
{"data":{"kind":"changed","status":"accepted"},"entry_id":"entry-0003","event":"entry.added","event_id":"event-0004","record_revisions":{"entry:0.1.0/entry-0003":1,"release:0.1.0":4},"release_version":"0.1.0","schema_version":2}
|
|
5
|
+
{"data":{"kind":"added","status":"accepted"},"entry_id":"entry-0004","event":"entry.added","event_id":"event-0005","record_revisions":{"entry:0.1.0/entry-0004":1,"release:0.1.0":5},"release_version":"0.1.0","schema_version":2}
|
|
6
|
+
{"data":{"kind":"changed","status":"accepted"},"entry_id":"entry-0005","event":"entry.added","event_id":"event-0006","record_revisions":{"entry:0.1.0/entry-0005":1,"release:0.1.0":6},"release_version":"0.1.0","schema_version":2}
|
|
7
|
+
{"data":{"kind":"docs","status":"accepted"},"entry_id":"entry-0006","event":"entry.added","event_id":"event-0007","record_revisions":{"entry:0.1.0/entry-0006":1,"release:0.1.0":7},"release_version":"0.1.0","schema_version":2}
|
|
8
|
+
{"data":{"added_source_refs":[],"fields":["summary"],"removed_source_refs":[],"source_refs_mode":"unchanged"},"entry_id":"entry-0001","event":"entry.updated","event_id":"event-0008","record_revisions":{"entry:0.1.0/entry-0001":2},"release_version":"0.1.0","schema_version":2}
|
|
9
|
+
{"data":{"added_source_refs":[],"fields":["summary"],"removed_source_refs":[],"source_refs_mode":"unchanged"},"entry_id":"entry-0002","event":"entry.updated","event_id":"event-0009","record_revisions":{"entry:0.1.0/entry-0002":2},"release_version":"0.1.0","schema_version":2}
|
|
10
|
+
{"data":{"added_source_refs":[],"fields":["summary"],"removed_source_refs":[],"source_refs_mode":"unchanged"},"entry_id":"entry-0003","event":"entry.updated","event_id":"event-0010","record_revisions":{"entry:0.1.0/entry-0003":2},"release_version":"0.1.0","schema_version":2}
|
|
11
|
+
{"data":{"added_source_refs":[],"fields":["summary"],"removed_source_refs":[],"source_refs_mode":"unchanged"},"entry_id":"entry-0004","event":"entry.updated","event_id":"event-0011","record_revisions":{"entry:0.1.0/entry-0004":2},"release_version":"0.1.0","schema_version":2}
|
|
12
|
+
{"data":{"added_source_refs":[],"fields":["summary"],"removed_source_refs":[],"source_refs_mode":"unchanged"},"entry_id":"entry-0005","event":"entry.updated","event_id":"event-0012","record_revisions":{"entry:0.1.0/entry-0005":2},"release_version":"0.1.0","schema_version":2}
|
|
13
|
+
{"data":{"added_source_refs":[],"fields":["summary"],"removed_source_refs":[],"source_refs_mode":"unchanged"},"entry_id":"entry-0006","event":"entry.updated","event_id":"event-0013","record_revisions":{"entry:0.1.0/entry-0006":2},"release_version":"0.1.0","schema_version":2}
|
|
14
|
+
{"data":{"released_at":"2026-11-08"},"event":"release.finalized","event_id":"event-0014","record_revisions":{"release:0.1.0":8},"release_version":"0.1.0","schema_version":2}
|
utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0001.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 2
|
|
7
|
+
entry_id: entry-0001
|
|
8
|
+
release_version: 0.1.0
|
|
9
|
+
kind: changed
|
|
10
|
+
summary:
|
|
11
|
+
Changed dependency bounds and doctor checks to match RenderPlan 0.2.1 and
|
|
12
|
+
SpeechScope 0.1.1
|
|
13
|
+
status: accepted
|
|
14
|
+
audience: null
|
|
15
|
+
scopes: []
|
|
16
|
+
source_refs: []
|
|
17
|
+
paths:
|
|
18
|
+
- pyproject.toml
|
|
19
|
+
- utterverify/doctor.py
|
|
20
|
+
issues: []
|
|
21
|
+
prs: []
|
|
22
|
+
sources: []
|
|
23
|
+
contributors: []
|
|
24
|
+
breaking: false
|
|
25
|
+
internal: false
|
|
26
|
+
order: 1
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
Dependency bounds and doctor compatibility checks now match the public RenderPlan 0.2.1 handoff API and supported SpeechScope release.
|
utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0002.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 2
|
|
7
|
+
entry_id: entry-0002
|
|
8
|
+
release_version: 0.1.0
|
|
9
|
+
kind: fixed
|
|
10
|
+
summary:
|
|
11
|
+
Fixed bundle verification to reject mismatched plan identity and rendered
|
|
12
|
+
artifacts before ASR
|
|
13
|
+
status: accepted
|
|
14
|
+
audience: null
|
|
15
|
+
scopes: []
|
|
16
|
+
source_refs: []
|
|
17
|
+
paths:
|
|
18
|
+
- utterverify/bundle.py
|
|
19
|
+
- utterverify/core.py
|
|
20
|
+
issues: []
|
|
21
|
+
prs: []
|
|
22
|
+
sources: []
|
|
23
|
+
contributors: []
|
|
24
|
+
breaking: false
|
|
25
|
+
internal: false
|
|
26
|
+
order: 2
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
Bundle verification validates set, chapter, and plan identities plus complete manifests, canonical WAV paths, and recorded WAV hashes before ASR; any preflight mismatch stops evaluation.
|
utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0003.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 2
|
|
7
|
+
entry_id: entry-0003
|
|
8
|
+
release_version: 0.1.0
|
|
9
|
+
kind: changed
|
|
10
|
+
summary:
|
|
11
|
+
Changed verification to use prepared RenderPlan text with compound-aware
|
|
12
|
+
exact-content thresholds
|
|
13
|
+
status: accepted
|
|
14
|
+
audience: null
|
|
15
|
+
scopes: []
|
|
16
|
+
source_refs: []
|
|
17
|
+
paths:
|
|
18
|
+
- utterverify/core.py
|
|
19
|
+
- README.md
|
|
20
|
+
issues: []
|
|
21
|
+
prs: []
|
|
22
|
+
sources: []
|
|
23
|
+
contributors: []
|
|
24
|
+
breaking: false
|
|
25
|
+
internal: false
|
|
26
|
+
order: 3
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
SpeechScope receives each prepared SpeechItem.text as its reference. The default requires zero compound-aware lexical and character error while allowing compound-boundary variants; it is not strict whitespace-tokenized word equality.
|
utterverify-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/0.1.0/entries/entry-0004.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 2
|
|
3
|
+
object_type: release_entry
|
|
4
|
+
versioning:
|
|
5
|
+
schema_version: 1
|
|
6
|
+
revision: 2
|
|
7
|
+
entry_id: entry-0004
|
|
8
|
+
release_version: 0.1.0
|
|
9
|
+
kind: added
|
|
10
|
+
summary:
|
|
11
|
+
Added direct configuration and segment-level provenance to human and JSON
|
|
12
|
+
verification results
|
|
13
|
+
status: accepted
|
|
14
|
+
audience: null
|
|
15
|
+
scopes: []
|
|
16
|
+
source_refs: []
|
|
17
|
+
paths:
|
|
18
|
+
- utterverify/cli.py
|
|
19
|
+
- utterverify/types.py
|
|
20
|
+
issues: []
|
|
21
|
+
prs: []
|
|
22
|
+
sources: []
|
|
23
|
+
contributors: []
|
|
24
|
+
breaking: false
|
|
25
|
+
internal: false
|
|
26
|
+
order: 4
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
Direct and bundle workflows report reference text, plan and manifest identities, WAV hashes, reports, and per-segment statuses in human and JSON output; fail-fast results identify skipped occurrences as not evaluated.
|