Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
dc83c21
OpenSpec change release-tags-pypi: proposal (#228)
Oct 17, 2026
698cf30
OpenSpec change release-tags-pypi: alignment review fixes and Brett's…
Oct 17, 2026
56669c1
OpenSpec change release-tags-pypi: council verdicts applied, and clar…
Oct 17, 2026
ea306de
OpenSpec change release-tags-pypi: the wheel's LICENSE is held by the…
Oct 17, 2026
1fcb95c
OpenSpec change release-tags-pypi: delta specs for its two new capabi…
Oct 17, 2026
9571d9c
OpenSpec change release-tags-pypi: design.md (#228)
Oct 17, 2026
28a441a
OpenSpec change release-tags-pypi: tasks.md, the governance and hando…
Oct 17, 2026
8035d77
OpenSpec change release-tags-pypi: design.md records the lead's rulin…
Oct 17, 2026
eb12177
Speckit feature 006-release-pypi: spec.md and its quality checklist (…
Oct 17, 2026
760281b
OpenSpec change release-tags-pypi: tasks.md records the Speckit hando…
Oct 17, 2026
83c69ed
Speckit feature 006-release-pypi: plan, research, data model, contrac…
Oct 17, 2026
01ff6d6
Speckit feature 006-release-pypi: tasks.md, 25 tasks by user story an…
Oct 17, 2026
335d226
Speckit feature 006-release-pypi: /speckit.analyze findings fixed, no…
Oct 18, 2026
b0640a5
Release tags and PyPI: the lead's rulings of 2026-10-18 on 335d226, i…
Oct 18, 2026
5e592ca
Merge main d424b64 into 006-release-pypi (#228): bring the branch up …
Oct 18, 2026
140c5ab
T001: the package's docstring-only __init__ and its committed, unstam…
Oct 18, 2026
cf43b07
tasks.md: T001 done (accepted 140c5ab on model, scope and verify); T0…
Oct 18, 2026
b6ff505
T001: both package files open with the repository's SPDX line (lead's…
Oct 18, 2026
fd554d8
The stamp contract follows T001's SPDX line: the SPDX line, one docst…
Oct 18, 2026
8701f19
The workBenches condition is decided: Brett Heap's position (c), open…
Oct 18, 2026
f35ec31
T002: pyproject.toml declares the openrepotools wheel, per contracts/…
Oct 18, 2026
0da3386
tasks.md: T002 done (accepted f35ec31 on model, scope and verify) (#228)
Oct 18, 2026
0e99729
T003: tests/package_layout.py builds the package's fake installed lay…
Oct 18, 2026
0670b42
tasks.md: T003 done (accepted 0e99729 on model, scope and verify) (#228)
Oct 18, 2026
4ae999d
Merge main f595e44 into 006-release-pypi (#228)
Oct 18, 2026
7921a2e
T004: tests/test_install_pipx.py holds pipx's link, its skip and the …
Oct 18, 2026
d57b75d
T006: hold src/openrepotools to the standard library, and compile it …
Oct 18, 2026
fa44864
T010: rewrite the docstring of test_version_names_the_repository_and_…
Oct 18, 2026
b286953
T005: tests/test_package.py holds pyproject.toml, the payload map, a …
Oct 18, 2026
2e4a633
tasks.md: T005, T006 and T010 done, each built in its own lane-3 task…
Oct 18, 2026
2539a87
tasks.md: T004 done (accepted 7921a2e on model, scope and verify, 09:…
Oct 18, 2026
85ae5f0
Release tags and PyPI: the lead's ruling of 2026-10-18 on T007's repo…
Oct 18, 2026
a5c1538
T007: add the entry module, whose main() execs bash on the packaged i…
Oct 18, 2026
6b13ac2
tasks.md: T007 done (accepted 1134471 on model, scope and verify, 09:…
Oct 18, 2026
b67efa5
T008: openRepoTools leaves pipx's link to pipx, and refuses a venv-sh…
Oct 18, 2026
691c638
tasks.md: T008 done (accepted d5aa53b on model, scope and verify, 09:…
Oct 18, 2026
bf5e6e2
T026: put back the signals Python ignores before the exec, and refuse…
Oct 18, 2026
d3a6115
tasks.md: T026 done (accepted 28d9346 on model, scope and verify, 09:…
Oct 18, 2026
7ffd486
T009: tests/test_package_stamp.py holds the stamp reader, hatch's agr…
Oct 18, 2026
a8b5f7f
tasks.md: T009 done (accepted 55004f2 on model, scope and verify; che…
Oct 18, 2026
7e64851
T012: tests/test_install_pipx.py holds coexistence, pip's script, the…
Oct 18, 2026
e42c744
tasks.md: T012 done (accepted 75e27d0 on model, scope and verify; che…
Oct 18, 2026
902d199
T011: openRepoTools reads its package's stamp and prints its release …
Oct 18, 2026
628a46f
tasks.md: T011 done (accepted bf7264a on model, scope and verify; che…
Oct 18, 2026
3351007
Merge main 586dea2 into 006-release-pypi (#228)
Oct 18, 2026
03c3eb7
T013: openRepoTools names the other source beside pipx's link, refuse…
Oct 18, 2026
755ff9d
006 docs: the documents say what 628a46f does, and the counts follow …
Oct 18, 2026
32d9018
tasks.md: T013 done (accepted 55c9a02 on model, scope and verify: 538…
Oct 18, 2026
c1c1c71
006 docs 2: the stamp's readers say at run time, FR-047 is decided, T…
Oct 18, 2026
b7c111c
PR 1 review: tests for the guard's three non-ASCII folds, the count l…
Oct 18, 2026
65166ea
PR 1 review: the PATH report's silent skip is in cli-output.md, resea…
Oct 18, 2026
08743b0
PR 1 review: design.md's line citations are re-derived (#228)
Oct 18, 2026
fc8e37d
Merge main 08e7550 into 006-release-pypi (#228)
Oct 18, 2026
c4bc7bf
T014: the two hash locks, openRepoShape v1.1.0's byte for byte below …
Oct 18, 2026
f526a0a
T015: tests/test_tests_workflow.py holds tests.yml's triggers, four j…
Oct 18, 2026
cebac37
T016: tests.yml pushes on main and release/v*, and its package job bu…
Oct 18, 2026
43b4e52
T017: AGENTS.md's CI paragraph names tests.yml's four jobs, its two p…
Oct 18, 2026
85a7b05
tasks.md: T014 to T017 done (#228)
Oct 18, 2026
7b5167a
T018: tests/test_release_workflow.py holds release.yml, its hash lock…
Oct 18, 2026
0de7213
T019: release.yml's shape and its build job, adapted step for step fr…
Oct 18, 2026
fb2249f
T020: release.yml's testpypi, install and pypi jobs, adapted from ope…
Oct 18, 2026
a04b9e2
T021: release.yml's RELEASING header, in contracts/workflows.md's six…
Oct 18, 2026
ac2ca2b
PR 3 docs: the empty-index check is the model's, no file but the veri…
Oct 18, 2026
29cc1b3
tasks.md: T018 to T021 done (#228)
Oct 18, 2026
d637841
T022: docs/release-notes/v1.0.0.md is the published v1.0.0 Release bo…
Oct 18, 2026
cb478cc
T023: docs/release-notes/v1.1.0.md drafts the v1.1.0 Release body: th…
Oct 18, 2026
ed72edf
T024: README says what a release is, what --version prints, and what …
Oct 18, 2026
90794a3
tasks.md: T022 to T024 done, and T024's files name tests/test_test_ro…
Oct 18, 2026
3efcd71
PR 4 review: the assembly README cap holds 510, README's text is test…
Oct 19, 2026
5629a84
PR 2 review: the build lock's header says the pipx lock carries the s…
Oct 19, 2026
fa3bd83
PR 2 review: tests.yml's comment and a test docstring say the pipx lo…
Oct 19, 2026
1b41ce7
Merge PR 2 review fixes (fa3bd83) into 006-release-pypi-pr3 (#228)
Oct 19, 2026
9378103
Merge 006-release-pypi-pr3 (1b41ce7) into 006-release-pypi-pr4 (#228)
Oct 19, 2026
26e5d9a
PR 4 re-check: T024's dated entry heads its count as 486 -> 505 here,…
Oct 19, 2026
ef6c18d
T025: quickstart.md names the steps that reach the network, shows ste…
Oct 19, 2026
b3aab89
contracts/cli-output.md's `is partial:` example is the line stamp_rea…
Oct 19, 2026
caa9c0f
T025 is done: tasks.md marks it, with the two documents the lead's ru…
Oct 19, 2026
69c4261
Merge main de6455b into 006-release-pypi-t025-pr, as queue prefix q5k…
Oct 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions specs/006-release-pypi/contracts/cli-output.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ openRepoTools (<repo> @ <ref>)

This is unchanged. `<repo>` is `${OPENREPOTOOLS_REPO:-opensoft/openRepoTools}`
and `<ref>` is `${OPENREPOTOOLS_REF:-main}`. No `OPENREPOTOOLS_PACKAGE_*`
variable changes it. `tests/test_openrepotools_command.py:299-319` keeps its
assertions, and only the docstring at `:300-302` is rewritten.
variable changes it. `tests/test_openrepotools_command.py:323-344` keeps its
assertions, and only the docstring at `:324-327` is rewritten.

The digest label `sorted-ls-tree-r-v1` is one literal. It is held equal to
the pinned `repo_shape.TREE_DIGEST_DEFINITION` and to
Expand All @@ -64,8 +64,8 @@ causes, and [stamp.md](stamp.md) gives each reason's cause:

- `cannot be read (<detail>)`, for example `cannot be read (it is a
directory)`;
- `is partial: <detail>`, for example `is partial: COMMIT is set and DIGEST
is empty`;
- `is partial: <detail>`, for example `is partial: VERSION, TAG, COMMIT and
REPOSITORY are set, but DIGEST is empty`;
- `is malformed: <detail>`, for example `is malformed: TAG is v1.2.0, not
v1.1.0`, or `is malformed: line 4 has a carriage return`.

Expand Down
4 changes: 2 additions & 2 deletions specs/006-release-pypi/plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ Phase 0 and again after Phase 1.
| G2 | Nothing under `upstream/openRepoShape` is edited, and the pin does not move (AGENTS.md; proposal Non-goals) | PASS | PASS: the digest code and `load_yaml` are run from the submodule, and never copied (R9) |
| G3 | The suite reaches no network, and creates no real repository (AGENTS.md) | PASS | PASS: wheel tests take a built wheel by variable (R8); the v1.0.0 notes are checked by their task, not the suite (R15) |
| G4 | Tests skip without the submodule, naming it, and never fail for it (AGENTS.md; `tests-no-submodule`) | PASS | PASS: workflow tests skip like command tests (R9); the `package` job checks out with `submodules: true` and fails on a skip |
| G5 | AGENTS.md and README caps move only by dated entries (`tests/test_repo_hygiene.py:1748`, `:2253`) | PASS | PASS: R16 |
| G5 | AGENTS.md and README caps move only by dated entries (`tests/test_repo_hygiene.py:1981`, `:2516`) | PASS | PASS: R16 |
| G6 | Governed files (CI workflows, and every file recording a pin or a digest) are `[O]` work (Speckit protocol, Build Tiers) | PASS | PASS: `tests.yml`, `release.yml`, both hash locks, the stamp and every action pin are touched only by `[O]` tasks |
| G7 | Every refusal is in the planning phase, and a refusal places nothing (design.md Goals) | PASS | PASS: pipx's link, a venv-shaped link and pip's script are decided in `plan_install_targets`; a broken stamp in `package_init` before the argument loop |
| G8 | Brett Heap decides every tag, cut and upload; no lane act is a build task (proposal "Release owner") | PASS | PASS: environments, publishers, tags, dispatches, uploads, the Release and the assembly README PR stay in the change's `tasks.md` |
Expand Down Expand Up @@ -209,7 +209,7 @@ tests/
├── test_release_workflow.py # NEW: release.yml, both locks, the stamp writer round trip
├── test_tests_workflow.py # NEW: tests.yml's triggers, job ids and package job
├── test_repo_hygiene.py # CHANGED: the standard-library rule, the compile set, caps
└── test_openrepotools_command.py # CHANGED: one docstring (:300-302), assertions unchanged
└── test_openrepotools_command.py # CHANGED: one docstring (:324-327), assertions unchanged
docs/release-notes/
├── v1.0.0.md # NEW: the published body, byte for byte (R15)
└── v1.1.0.md # NEW: the draft
Expand Down
14 changes: 9 additions & 5 deletions specs/006-release-pypi/quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@ git submodule update --init upstream/openRepoShape # the command and workflow
command -v bash jq git python3 # all four are needed
```

Building a wheel (steps 3 and 4) fetches hatchling into pip's isolated build
environment, so it needs the network. Nothing else here does.
Three steps can need the network. Building the wheel (step 3) fetches
hatchling into pip's isolated build environment. A pipx that installs with
pip rather than uv (step 5) fetches pip into a new `PIPX_HOME`'s shared
libraries. Step 8 asks GitHub. Nothing else here does.

## 1. The package's tests, without a wheel

```sh
bash tests/run.sh -k 'test_package or test_install_pipx or test_release_workflow or test_tests_workflow'
bash tests/run.sh -k 'test_package or test_install_pipx or test_release_workflow or test_tests_workflow' -rs
```

- Expect every test to pass, except the built-wheel tests in
Expand All @@ -37,7 +39,7 @@ bash tests/run.sh -k 'repo_hygiene or openrepotools_command or install_'

- The standard-library rule now covers `src/openrepotools/`, and the compile
test compiles it.
- The `--version` tests at `tests/test_openrepotools_command.py:299-319` keep
- The `--version` tests at `tests/test_openrepotools_command.py:323-344` keep
their assertions.
- The README and AGENTS.md caps pass, with any dated entry the change needed.

Expand Down Expand Up @@ -89,7 +91,9 @@ Expect each of these:
- 28 rows in the receipt under
`"$t/user-home/.local/share/openRepoTools/"`;
- `"$t/bin/openRepoTools"` still a link into
`"$t/pipx/venvs/openrepotools/bin/"`.
`"$t/pipx/venvs/openrepotools/bin/"`;
- last, the PATH note, because `$t/bin` is not on `PATH`:
`openRepoTools: note: the first openRepoTools on your PATH is <first, or "none">, not this package's <t>/pipx/venvs/openrepotools/bin/openRepoTools, …`.

Then run `--install` again from the checkout's own `openRepoTools`, with the
same environment:
Expand Down
2 changes: 1 addition & 1 deletion specs/006-release-pypi/tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ index does not serve.

## Phase 9: Polish & cross-cutting concerns

- [ ] T025 [O] Run quickstart.md's steps 1 to 8 on a workstation, as detailed below — files: `specs/006-release-pypi/quickstart.md` — verify: `bash tests/run.sh`
- [X] T025 [O] Run quickstart.md's steps 1 to 8 on a workstation, as detailed below — files: `specs/006-release-pypi/quickstart.md`, `specs/006-release-pypi/plan.md`, `specs/006-release-pypi/contracts/cli-output.md` (the last two added by the lead's ruling, #228 comment 6255121743) — verify: `bash tests/run.sh`
- the wheel built twice and compared;
- the built-wheel tests, with no skip;
- the pipx install into a temporary home;
Expand Down
Loading