Skip to content

Release v1.9.0 — go-public, first PyPI release, onboarding docs - #366

Merged
Polichinel merged 11 commits into
mainfrom
development
Jul 27, 2026
Merged

Release v1.9.0 — go-public, first PyPI release, onboarding docs#366
Polichinel merged 11 commits into
mainfrom
development

Conversation

@Polichinel

Copy link
Copy Markdown
Contributor

Release PR: v1.9.0 to main.

  • Go-public readiness: redactions, SSH key-only verified, C-318 recorded
  • PyPI packaging: metadata, Trusted Publishing workflow, runbook (TestPyPI-rehearsed)
  • Onboarding: model_consumer_quickstart, guides index, credential gaps closed
  • CI restored to green: C-319 (lock contamination), C-320 (deploy gates in CI), C-321 (401 mapping)

After merge: repo → public, tag v1.9.0, GitHub Release triggers the PyPI publish.

🤖 Generated with Claude Code

Polichinel and others added 11 commits July 27, 2026 14:40
Pre-public hygiene: the admin account name and personal hostname were
committed in server runbooks and a post-mortem. Replaced with
<your-user> / <user>@<workstation> placeholders (matching the
convention already used in hetzner_deployment_guide.md).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…elease runbook

- pyproject: authors, keywords, classifiers, [project.urls] (mirrors the
  views-frames template; License:: classifier omitted per PEP 639)
- publish_package.yml: Trusted Publishing workflow copied from views-frames
  (release:published trigger, first-publish-safe version guard, uv build/publish)
- ci.yml: python-version 3.10 -> 3.12 (requires-python is >=3.12; CI never
  exercised a supported interpreter)
- docs/guides/publishing_to_pypi.md: release runbook incl. TestPyPI rehearsal

Verified locally: uv build succeeds, twine check PASSED, wheel ships only the
nine datafactory_* packages, sdist ships only /src + license/readme.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…edential gaps

- NEW model_consumer_quickstart.md: nothing -> running a datafactory-backed
  views-models model (verified against the actual dataloader path; the two
  ask-a-human items are explicit as Step 0)
- NEW docs/guides/README.md: index of all guides by task and audience
- credential_setup.md: GDL_API_TOKEN section (SHDI) was missing entirely;
  anonymous-sources note; stale _resolve_storage_options path fixed
  (dataset.py -> backends_zarr.py, also in ADR-026)
- README: PyPI install line, Prerequisites table (who needs which
  credentials), guides row in Where-to-Find-What, remote example now
  imports DEFAULT_REMOTE
- Consumer guides: code examples use DEFAULT_REMOTE instead of the bare
  IP (docs convention: the address appears only in netrc setup blocks);
  viewser_transition_guide install line -> PyPI floor pin

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ER] trade-off

Recorded alongside the go-public/PyPI decision so the known-temporary
status of plain-HTTP serving is on the record, not in our heads.
Tier 4; trigger: external consumers or non-courtesy-protected data;
cheap fix: domain + Caddy auto-HTTPS. Cross-refs C-97 (auth model vs
this entry's auth transport) and the server-hardening cluster.
Header: 317→318 IDs, 27→28 open, Tier 4 14→15. Register falsification
tests green (7/7).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… (C-320)

C-319 (Tier 2): test_consumer_provenance invoked generate_consumer_data.main()
in-process; since v1.8.1 that acquires the REAL /var/lock/views-pipeline.lock
and holds it for process lifetime — the pytest process became the holder and
all 42 later subprocess-writer tests were correctly refused by their own lock.
Fix: set VIEWS_PIPELINE_LOCK_HELD=1 (the existing cooperating-child seam)
around the in-process main(). Proven: poisoner+victim files green in one
pytest process.

C-320 (Tier 3): the four deploy-gate falsification tests (merge topology x3,
issue hygiene x1) assumed a full clone and authenticated gh — neither holds
in Actions, so CI was red on EVERY branch including the entire v1.8.1 release
chain, unnoticed. Fix: gates skip-with-reason where the environment cannot
answer (merge-base exit 128, gh unauthenticated) and still enforce locally.

Register: C-319/C-320 registered-and-resolved; header 318->320 IDs,
287->289 resolved; struck-through 103->105. Lesson recorded: release ritual
must confirm CI green on release commits.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…r guard

The Prior: chain grew past the search-window guard
(test_falsification_merge_readiness F1). Older segments were already
duplicated in git history — the line ends with 'Earlier history in git
log' by design. Kept: 2026-07-27 go-public update, 2026-07-22 ops
sitting, 2026-07-21 incident.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…verified key-only

Pre-public sshd audit found PasswordAuthentication unset (= yes) on the
internet-open SSH port. Fixed live via /etc/ssh/sshd_config.d/99-key-only.conf,
verified with sshd -T and a fresh key login before closing the old session.
Go-public gate passed; IP-allowlist scope of C-88 stays [DEFER].

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 401->PermissionError mapping only caught OSError, but aiohttp's
ClientResponseError (what a real no-netrc request raises) is not an
OSError — first-time users saw a raw client error instead of the
PermissionError + netrc hint the credential guide promises. Found
empirically by the TestPyPI clean-room rehearsal's no-credential probe;
the prior unit test simulated the failure as OSError, a fixture that
did not mirror the real exception type (C-315 lesson-family).

Non-OSError exceptions carrying 401/Unauthorized now map to the
documented PermissionError; everything else re-raises untouched.
Regression tests pin both branches.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Go-public + PyPI readiness: packaging, onboarding docs, CI green (C-318/C-319/C-320)
First PyPI release. Product plan v12 title + v1.9 addendum updated
(go-public, PyPI, onboarding docs, CI-green restoration C-319/C-320/C-321).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Polichinel
Polichinel merged commit ae414a7 into main Jul 27, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant