Commit 078dd77
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
8 | 36 | | |
9 | 37 | | |
10 | 38 | | |
| |||
0 commit comments