Skip to content

chore: drop the planning/ directory and the curated-release-notes convention - #449

Merged
lesnik512 merged 1 commit into
mainfrom
chore/drop-planning-dir
Aug 30, 2026
Merged

chore: drop the planning/ directory and the curated-release-notes convention#449
lesnik512 merged 1 commit into
mainfrom
chore/drop-planning-dir

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Why

planning/ had accumulated five unrelated jobs behind one name, and the biggest
of them was pulling its weight the least. Curated release notes were a mandatory
gate on every stable tag: release.yml aborted the release if
planning/releases/<tag>.md was missing. That is a hand-written file standing
between a green main and PyPI, and its output is reproducible from the squashed
PR titles this repo already writes carefully.

The other four jobs were not planning either. A link checker is a lint tool. Two
audit workflow scripts are agent tooling. The README.md rules are the repo's
operating instructions, which belong where an agent already reads them.

Design

Each of the five jobs is retired or rehomed:

Job Fate
releases/*.md (30 files) Retired. release.yml always uses GitHub's generated notes.
_templates/release.md Retired with it.
README.md Rules moved into CLAUDE.md as Where a fact goes: the four-home table, the admission check, the INVARIANT: docstring shape.
links.py Retired, with just check-links and its lint-ci line.
scripts/*.mjs (2) Deleted.

3.4.0 was tagged and published before this PR, so the last curated notes file
was used for its intended purpose rather than deleted unread. Every curated body
from 2.15.0 to 3.4.0 is on the
Releases page, byte-identical
to the file that produced it, so nothing is lost by deleting the files.

docs/changelog.md and its nav entry go too: the page's entire content was a
pointer to planning/releases.

writing-integrations.md no longer recommends the external planning-convention
repo, and no longer tells integration authors to write release notes. Both were
claims about what modern-di does.

Links from .github/ and CLAUDE.md are now bare file links with no #anchor,
since anchors were the main thing links.py caught and nothing validates them now.

Non-goals

  • Not replacing the link checker. just docs-build (mkdocs --strict, run on
    every PR) still covers docs/. Root Markdown, .github/, and docs/agents/
    become unchecked. Accepted: docs/agents/ was already unchecked, because
    mkdocs.yml excludes it from the build entirely.
  • Not preserving the architecture/-directory post-mortem that planning/README.md
    carried. The rule it justified survives; the four-month history does not.
  • Not adding a CI gate to release.yml. A tag remains the commitment point.
  • Not archiving the release notes anywhere. GitHub Releases plus git history
    are the two copies.

Verification

  • just lint-ci — clean (ruff format, ruff check, ty).
  • just test-ci — 512 passed, 100% line coverage. No test referenced planning/.
  • just docs-buildmkdocs --strict builds clean with the Changelog nav
    entry removed; nothing else linked to that page.
  • Checked repo-wide: no remaining reference to planning, check-links, or
    links.py in any Markdown, YAML, TOML, Python file, or the justfile.

https://claude.ai/code/session_01FdBFyAZ6nntxXwPjy6Xm7p

…vention

Retires all five of planning/'s jobs: curated release notes and their template,
the where-a-fact-goes rules (moved into CLAUDE.md), the repo-wide link checker,
and two multi-agent audit scripts.

Claude-Session: https://claude.ai/code/session_01FdBFyAZ6nntxXwPjy6Xm7p

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Details
Benchmark suite Current: 143017d Previous: 1110d4c Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 3134503.3243164895 iter/sec (stddev: 2.7749399615333034e-8) 2973498.9286641614 iter/sec (stddev: 1.231159274414513e-8) 0.95
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 3137850.872133636 iter/sec (stddev: 2.881231661949404e-8) 2986010.183962908 iter/sec (stddev: 9.788926322984658e-9) 0.95
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 23434.155169910544 iter/sec (stddev: 0.000005127450579228218) 26560.358180927957 iter/sec (stddev: 0.000004352985959499135) 1.13
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 18321.20428725045 iter/sec (stddev: 0.000004705694571475458) 20691.970569831406 iter/sec (stddev: 0.0000026091460184789175) 1.13
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 460.4672952696038 iter/sec (stddev: 0.00007333408353481653) 429.03756232680587 iter/sec (stddev: 0.00009568077414034088) 0.93
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 444.48742817883215 iter/sec (stddev: 0.000030183977893687496) 391.8991713417992 iter/sec (stddev: 0.00022869199630442898) 0.88
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 397.2560757229045 iter/sec (stddev: 0.00010021629818935621) 376.607403925421 iter/sec (stddev: 0.00002631709265123598) 0.95
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 2256.8502033160275 iter/sec (stddev: 0.00002579116559226861) 2403.974394705907 iter/sec (stddev: 0.00003135419298488846) 1.07
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 1615.0048376803643 iter/sec (stddev: 0.00019058055106452274) 1764.2170385681352 iter/sec (stddev: 0.00024939593097565) 1.09
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 1142.936092528558 iter/sec (stddev: 0.0000355611670627448) 1209.8328682466229 iter/sec (stddev: 0.0000433590848327564) 1.06
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 751251.9943157351 iter/sec (stddev: 4.460350608573049e-8) 747181.5983230952 iter/sec (stddev: 6.238976357299855e-8) 0.99
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 697335.250145131 iter/sec (stddev: 4.581818996730928e-8) 697694.0392206679 iter/sec (stddev: 4.004143405304659e-8) 1.00
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 2358.9616610159337 iter/sec (stddev: 0.000013088472429696477) 2346.777875876585 iter/sec (stddev: 0.000007748725984796808) 0.99
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 61349.97476959026 iter/sec (stddev: 0.000002007024747350427) 61705.370370006065 iter/sec (stddev: 0.0000013613767700774523) 1.01
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 46402.49975859761 iter/sec (stddev: 0.0000027120277591603175) 43549.91286075941 iter/sec (stddev: 0.000003003271181235822) 0.94
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 1956742.9680606495 iter/sec (stddev: 3.679566394610606e-8) 2058891.9270256252 iter/sec (stddev: 2.1811745546945094e-8) 1.05
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 3525270.6914433134 iter/sec (stddev: 1.1765221973931988e-8) 3249700.978769265 iter/sec (stddev: 8.488431554352757e-9) 0.92
benchmarks/test_guard_resolve.py::test_g3_deep_chain 755140.572248651 iter/sec (stddev: 3.493109987967728e-8) 760111.2179524907 iter/sec (stddev: 4.919543864401783e-8) 1.01
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 405255.9919027869 iter/sec (stddev: 9.779577520420318e-8) 411793.20560404117 iter/sec (stddev: 1.2407551889930304e-7) 1.02
benchmarks/test_guard_resolve.py::test_g5_cross_scope 1609744.6212612905 iter/sec (stddev: 3.5102700784211594e-8) 1683729.015264325 iter/sec (stddev: 2.4358361458241133e-8) 1.05
benchmarks/test_guard_resolve.py::test_g9_context_resolve 858002.5695897768 iter/sec (stddev: 8.243584712716222e-8) 842154.799588125 iter/sec (stddev: 1.0466392208282428e-7) 0.98
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 503138.8569149087 iter/sec (stddev: 5.0038791403493e-8) 459896.3485580914 iter/sec (stddev: 4.330749547399607e-7) 0.91
benchmarks/test_guard_resolve.py::test_g18_alias_hop 2410532.7747489726 iter/sec (stddev: 1.1371070293494599e-8) 2237418.1697861045 iter/sec (stddev: 1.1310824821004893e-8) 0.93
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 27953.980517254895 iter/sec (stddev: 0.000003870671796457084) 30220.004047517636 iter/sec (stddev: 0.00000262697023406689) 1.08
benchmarks/test_guard_validate.py::test_g11_validate_wide 17154.76225376437 iter/sec (stddev: 0.000004490324760893902) 17750.225850963463 iter/sec (stddev: 0.000004533922463496549) 1.03

This comment was automatically generated by workflow using github-action-benchmark.

@lesnik512
lesnik512 merged commit 1ea74ee into main Aug 30, 2026
9 checks passed
@lesnik512
lesnik512 deleted the chore/drop-planning-dir branch August 30, 2026 18:31
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