Skip to content

Commit 078dd77

Browse files
maruworkclaude
andauthored
Fill in Unreleased changelog (#17)
* fix: close generic-completeness audit findings (C1-C4, U1-U5) - C1: add adop_html.py + HTML template to adop.json manifest; adop_sync now copies runtime_files + template_files so a synced runtime starts. - C2: add `reject` command (proposed/blocked/hold -> reject); summary resolves a standalone reject-note to terminal `reject`. - C3: write-trial guard uses WRITE_TRIAL_TYPES membership so task-scoped and phase-scoped also require an isolated write sandbox. - U1: dashboard falls back to the trial-packet no_impact_envelope. - U2/U3: read block_reason and intake_reason field names. - U4: modal opens with focus on close button and traps Tab. - C4/U5: drop wrong --deprecation-reason hints, fix sample watch id, reconcile reject lifecycle docs in README and design notes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix: close round-2/3 security, sync, and dashboard-fidelity audit findings - R1: adop_sync rejects manifest paths with '..' / absolute / drive-relative roots so apply/push cannot write outside --target. - R2: dashboard surfaces watch-note interest_reason. - R3: pre-trial reject shows reject_reason and no longer claims a trial ran. - R4: scan skips files larger than 5 MB (OOM guard). - R5: adop_sync exits cleanly on malformed adop.json / sync-registry.json. - Orphaned-lock recovery: reclaim a write lock only when older than 30s so a crashed writer cannot block a fixed-id artifact forever. - Docs: SECURITY.md Trust Model section (operator-trusted inputs, opt-in artifact-root boundary, trusted sync source); document `adop_sync apply`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix: dashboard fidelity, Windows concurrency, summary scaling, lint policy - Dashboard: surface retirement_reason / migration target+plan / archive end_date+successor / hold reason for deprecated/migrating/archived/hold lanes (were showing the stale promote judgment or generic text). - Concurrency: _acquire_lock treats Windows PermissionError like FileExistsError so write_next_sequential_artifact retries instead of crashing under contention; finally-cleanup no longer raises on a contended unlink. - Scaling: build_summary / _resolve_scene_states resolve judgments from one in-memory load instead of re-reading the artifact root per trial (was ~O(n^2)). - HTML UX: Historical filter auto-opens the history section. - Lint: ignore E501 (long help/template strings) while keeping line-length=100 for ruff format; apply safe ruff autofixes (import order, unused imports); add pytest-cov coverage config; document network-FS durability limit. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat: schema-version tolerance, cross-project aggregate, coverage gate - Schema durability: split SCHEMA_VERSION (write) from MIN_READABLE_SCHEMA_VERSION (read floor); accept the inclusive range; a too-new version reports "written by a newer adop; upgrade" instead of generic invalid. Additive-only compat contract documented (no in-place migration; append-only records survive upgrades). - Cross-project value: new read-only `adop aggregate --root A --root B [--json]` portfolio view (scene/tool/state per root); design note updated to match. - Coverage: add pytest-cov gate (fail_under=80, a real floor — dual try/except import blocks and __main__ are structurally uncoverable); add adop_sync CLI tests (74%->94%). Measured total ~84%. - Docs: README note on correcting mistakes under append-only (supersede, never edit). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * style: make ruff check + ruff format clean for CI (pre-commit gate) CI on the branch was red. Root cause was pre-existing lint/format debt (carried since main fb6f167), surfaced by `pre-commit run --all-files`: - ruff format: reflow all modules/tests to the configured width. - ruff check: fix the residual E741/E731/E702/F401/F841 (ambiguous `l`, lambda->def, semicolon splits, unused import/vars). Tests (196), phase gate (6/6), and adop lint remain green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(ci): make mypy green by collapsing dead relative-import branch The pre-commit `mypy` hook failed fatally with "No parent module -- cannot perform relative import" on the `try: from . import ...` dual-import idiom: in this flat py-modules layout the relative branch never runs (script, pip-install, and tests all import these as top-level), so it was dead code that only broke mypy. Collapse each module to the absolute imports that actually execute. This also let mypy finally check adop_summary, surfacing a real latent bug (variable `key` reused as both tuple and str) — now fixed by renaming the str key to `note_key`. All CI-equivalent gates pass locally: ruff check, ruff format --check, mypy (23 files), pytest (196), phase gate (6/6), adop lint. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ci: re-trigger PR checks * feat(html): add a back-to-top button to the dashboard Long lane portfolios make the rendered dashboard scroll well past a screen; without a back-to-top control it is awkward to return to the summary/toolbar. Add a fixed, accessible "↑ Top" button that fades in past 400px of scroll and smooth-scrolls to the top. Lives in the canonical template so every `render-html` output gets it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore: declutter repo root (move community files to .github/, drop stray files) First-view tidy-up without breaking tooling: - Move SECURITY/CONTRIBUTING/CODE_OF_CONDUCT/SUPPORT into .github/ (GitHub still recognises them there for the community profile); update the SUPPORT URL in the issue-template config and the README references. - Fold pytest.ini into pyproject [tool.pytest.ini_options]; remove pytest.ini. - Stop tracking the generated .coverage file and gitignore coverage outputs. Tests (197), ruff, ruff format, mypy all green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix: init creates nested overlay parent; summary hides stale structural-gap - P1: `adop init --overlay a/b/c.md` crashed with a raw FileNotFoundError when the parent dir was absent. Create overlay_path.parent before writing/copying. - P3: `adop summary` appended a comparison-time structural_gap ("workflow lacks a bounded evaluation lane") for every scene that ever had a comparison, even once it reached in-trial — self-contradictory. Gate the gap to pre-trial states (watch/proposed/blocked/trial-ready). Tests added for both; ruff/format/mypy/pytest(199)/adop lint green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore: convert to a clean pure-tool repo (drop self-dogfooding apparatus) The repo's first view was dominated by its own dogfooding/coupling-demo setup, not the tool. Remove that apparatus so the published repo is just the tool: - Delete .adop/ (157 self-adoption records) and gitignore it (runtime output, not source; consumer projects create their own). - Delete coupling-demo dev surfaces: eslint.config.js, package.json, .prettierrc.json, .prettierignore, .markdownlint-cli2.jsonc, .trivyignore, renovate.json, Dockerfile.tooling-example, .vscode/. - Delete the tool-surface-examples workflow and scripts/repo-smoke.sh. - Drop the now-dangling npm dependabot ecosystem and the check-renovate pre-commit hook. - Reset adop-overlay.md to an honest canonical-repo overlay (no fake scenes, no references to deleted files). Tool behaviour, scan surface rules, tests, and CLI are unchanged. ruff / ruff format / mypy / pytest (199) / CLI smoke all green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs: add a minimal, self-contained worked example under examples/ Restores a small "ADOP used on a real lane" illustration that the dogfooding cleanup removed — without re-cluttering the root: - examples/walkthrough/.adop/ holds one lint-ci lane (ruff) driven intake -> compare -> trial -> result+judgment -> hold, plus one coupling snapshot (7 lint-clean artifacts). - examples/README.md explains the lane and the view commands. - .gitignore now ignores only the ROOT /.adop/ so this tracked example survives while the canonical repo still keeps no records of its own. examples/ is one root entry and is outside ruff/mypy/pytest/packaging scope, so it does not affect the toolchain. ruff/format/mypy/pytest(199) green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(ci): repair invalid ci.yml YAML that startup-failed every run since fb6f167 The Windows "Consumer smoke" step embedded a PowerShell here-string (@'...'@) with its body flush-left at column 0 inside a `run: |` block. That under-indented content terminated the YAML block scalar early, making ci.yml unparseable — so GitHub failed the workflow at startup (0-second, 0-job "failure") on EVERY push, including pushes to main, from fb6f167 onward. (Linux heredocs are fine: YAML strips the uniform block indent so bash receives them flush-left.) Indent the here-string body/terminator to the block indent. YAML now parses (check-jsonschema: ok) and, after the uniform indent is stripped, PowerShell still receives a valid flush-left here-string. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * test: de-flake concurrent id-minting test on loaded CI (12 -> 5 workers) The first real hosted CI run (after the ci.yml YAML fix) showed this test failing only on windows-latest under `pytest -n auto`: 12 threads competing with other xdist workers on a 2-core runner starved one worker until it exhausted the 64-attempt mint retry budget ("already in progress: wt-006"). No duplicate ids occurred — it is retry-exhaustion under pathological contention, not a product bug. 5 workers keeps the lock/retry + Windows PermissionError path covered while staying well within the retry budget. Full suite green under `pytest -n auto` (199). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ci: trigger hosted run on fixed tree * chore: block secrets/.env/keys from ever being committed Defense in depth so a credential file cannot land in the repo: - .gitignore: ignore .env / *.env / secrets/ / keys/ / *.pem / *.key / *.p12 / *.pfx / id_rsa / id_ed25519 / *credentials*.json so they are never staged by accident. - pre-commit: add detect-private-key and check-added-large-files, plus a local `forbid-secret-files` hook (language: fail) that blocks the commit if any .env / key / secrets-dir file is staged (e.g. via `git add -f`). It skips cleanly when no such file is present, so normal commits are unaffected. `pre-commit run --all-files` stays green; verified the hook blocks a staged .env and .pem. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * test: give concurrent id-mint test an effectively-unbounded retry budget 5 workers still exhausted the 64-attempt budget on a CPU-starved windows-latest xdist runner (wt-004): a descheduled thread loses the mint race many times before peers commit. The test asserts the real invariant (no duplicate ids; PermissionError retried, not raised) — not the retry-budget size — so pass max_attempts=100_000 to remove the starvation-induced flake. Verified: concurrency test stable across repeated runs; full suite green under `pytest -n auto` (199). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs: fill in the Unreleased changelog (was incorrectly 'Nothing yet') Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: maruwork <276148342+maruwork@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 2c60334 commit 078dd77

1 file changed

Lines changed: 29 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,35 @@ All notable changes to this project are documented in this file.
44

55
## Unreleased
66

7-
_Nothing yet._
7+
### Added
8+
9+
- `adop reject`: reject a candidate from `proposed` / `blocked` / `hold` without running a trial (terminal for the scene)
10+
- `adop aggregate`: read-only cross-project portfolio (scene / tool / state) across multiple `--root` artifact roots
11+
- Schema-version tolerance: `MIN_READABLE_SCHEMA_VERSION` keeps older artifacts valid after an upgrade; a too-new `schema_version` reports "written by a newer adop; upgrade adop" instead of a generic invalid
12+
- HTML dashboard: a "Back to top" button
13+
- `examples/`: a minimal, self-contained worked example (`examples/walkthrough/.adop/`)
14+
- Secret-commit guard: `.gitignore` patterns plus pre-commit `detect-private-key`, `check-added-large-files`, and a local `forbid-secret-files` hook
15+
- Coverage gate: `pytest-cov` dev dependency and a `fail_under` threshold (~84% measured)
16+
17+
### Fixed
18+
19+
- Distribution: `adop.json` now lists `adop_html.py` and the HTML template, so a manifest-synced runtime can start and render (previously crashed with `ModuleNotFoundError`)
20+
- Dashboard now surfaces the trial-packet allow/deny envelope, block reason, intake "why now", watch interest, reject reason, and deprecated/migrating/archived/hold reasoning (were blank or showed the stale promote judgment)
21+
- Write-trial guard: `task-scoped` and `phase-scoped` trials now also require an isolated write sandbox
22+
- Windows: artifact-write lock maps `PermissionError` like `FileExistsError` so concurrent id minting retries instead of crashing; stale locks are reclaimed
23+
- Performance: `summary` / state resolution read judgments from a single in-memory load instead of re-reading the artifact root per trial
24+
- `adop init`: creates a nested `--overlay` parent directory instead of crashing with `FileNotFoundError`
25+
- `adop summary`: no longer prints a comparison-time structural gap once a scene has advanced to `in-trial` or later
26+
- CI: repaired `ci.yml` (a Windows PowerShell here-string broke the workflow YAML, startup-failing every run since 0.1.1); de-flaked the concurrent id-mint test on loaded runners
27+
28+
### Changed
29+
30+
- Clean tool-only repository: removed the self-dogfooding `.adop/` records and the tool-surface demo files; moved `SECURITY` / `CONTRIBUTING` / `CODE_OF_CONDUCT` / `SUPPORT` into `.github/`
31+
- Lint: ignore `E501` (long help/template strings) while keeping `line-length` for `ruff format`; dropped the dead relative-import branch so `mypy` passes
32+
33+
### Tests
34+
35+
- Suite grew from 105 to 199 tests
836

937
## 0.1.1 - 2026-06-17
1038

0 commit comments

Comments
 (0)