Repository navigation
Let other packages plug in, and write the guide to building on jupyddl - #164
Merged
Merged
Conversation
Write down where and why we mean to publish jupyddl as citable research software (.docs/PUBLISHING.md): a Zenodo DOI per release, a JOSS paper, ICAPS workshops for the research results, with a readiness checklist, the paper outline, the AI-usage disclosure JOSS requires, and how contributors can be considered for authorship. The README states the project's aim and its Cite section now says which version the 2021 preprint describes. Add the community files an outside contributor expects: a security policy, a pull-request template, a "Propose an algorithm" issue template, and an "Adding an algorithm" section in CONTRIBUTING.md. Run tests and build on pull requests. They were `on: [push]`, which never fires for a fork, so a contributor's PR showed no checks at all. Fix AGENTS.md drift: the Python floor is 3.10 and Mergify is retired. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014RbGtRHF8XhkiPQCDVHtV2
A package can now add planners, heuristics and generators by declaring `jupyddl.planners`, `jupyddl.heuristics` or `jupyddl.generators` entry points. Once installed, they work from the CLI, the benchmark harness and `jupyddl.solve` by name, without anyone importing the package. Discovery is lazy and defensive (jupyddl/plugins.py): the CLI runs it before building its parser, the library only on a registry miss, so importing jupyddl never scans installed packages. A built-in name always wins, a plugin that fails to import is skipped with a warning, and JUPYDDL_NO_PLUGINS=1 turns it off. `jupyddl plugins` lists what was found. The CLI now reads `requires_heuristic` from the registry at call time, since INFORMED_PLANNERS is fixed at import and cannot know about plugins. .docs/EXTENDING.md walks through a heuristic, a planner from a priority function, a planner from scratch with the budget/observer contract, a generator, testing the guarantees you claim, and shipping as a plugin. tests/test_extending.py runs every Python block in it, so it cannot drift. best_first now accepts a tuple priority for tie-breaking; observers get its first element as `f`, so traces stay numeric. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014RbGtRHF8XhkiPQCDVHtV2
# Conflicts: # .docs/PUBLISHING.md # AGENTS.md # CHANGELOG.md
guilyx
marked this pull request as ready for review
November 3, 2026 07:46
guilyx
pushed a commit
that referenced
this pull request
Nov 3, 2026
4 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
jupyddl is meant to be built on. Before this PR, the only way to add an algorithm was to fork the repo or edit the registry dicts by hand. That second route only reaches the process that does it, so the CLI never saw the result. This PR adds two things.
1. Plugins through entry points (
jupyddl/plugins.py)A package declares one of these in its own
pyproject.toml:After
pip install,jupyddl solve … -s astar-tbworks. So dojupyddl.solve, the benchmark harness andjupyddl generate.PluginWarning.:are refused (that syntax is reserved forlearned:<path>).JUPYDDL_NO_PLUGINS=1turns discovery off.jupyddl pluginslists what was found and what was skipped, and why.requires_heuristicfrom the registry when it runs.INFORMED_PLANNERSis fixed at import, so it couldn't know about plugin planners.2.
.docs/EXTENDING.md, the guideIt covers:
dijkstra, checkh(s0) ≤ h*, and check that a truncated run is not reported as unsolvabletests/test_extending.pyruns every Python block in the guide, so the guide fails CI instead of going stale.Small engine change:
best_firstaccepts a tuple priority for tie-breaking,lambda g, h: (g + h, h). Observers get its first element asf, so traces stay numeric. There is no overhead without an observer.Also: the README, the
.docs/index, the PUBLISHING checklist (the extending-guide row is now ✅), AGENTS.md and the CHANGELOG are updated.web/distis rebuilt.How it was checked
flake8andblackare clean.:-named plugins are skipped and the good one still landsJUPYDDL_NO_PLUGINS=1inconftest.py, so a developer's installed plugins can't change its results.Checklist
flake8 jupyddl tests toolsandpytestpass locallypython tools/build_web.pyre-run;web/distcommittedOPTIMAL_PLANNERSCHANGELOG.mdupdated under UnreleasedThe branch history has a merge commit: it fast-forwards over the already-merged #163 tip, because a force-push was not available. Its tree is identical to the feature commit, and the PR diff against
maincontains only this change. Squash-merge as usual.Generated by Claude Code