Ship a planning registry that reads, and let Slack name it - #28
Merged
Conversation
plan_incident proves the governance with stub bodies, so "summarise the docs in this workspace" got either an honest negative or a hollow success depending on how vague the goal was. plan_docs closes that gap for one bounded job: survey/read/summarise kinds whose bodies really read documentation — read-only, confined to the working directory, symlinks resolved and checked before a byte is read. The bodies are deterministic operator code; the model plans, it does not read. Behaviour keys on NodeBuild.kind, not the instance name the planner invented — the loop test proposes docs_survey-of-kind-survey to pin that. The scripted planner replies now come off the registry module when it ships them (incident replies against the docs catalog were five rounds of unregistered_node), so the free no-model path exercises the same registry the paid one does. From Slack, plan --registry accepts exactly the two registries the package ships and nothing else: the flag's general form imports arbitrary code, which stays refused. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
The gap this closes, demonstrated live today:
plan "summarise the docs in this workspace"returned an honest negative (the incident registry has no kind that reads), while a vaguer goal produced a hollowgoal_metfrom three stub nodes. The planner was never the problem — the registry vocabulary was.grapharc/examples/plan_docs.py— three read-only kinds (survey,read,summarise) whose bodies really read documentation underPath.cwd():.md/.txt/.rst), capped (20 files, 40k chars), skip-listed dirs, and symlinks resolved and checked against the root before a byte is readNodeBuild.kind, not the planner-invented instance name; the loop test proposesdocs_survey-of-kind-surveyspecifically to catch a name-keyed factory (it caught mine)grapharc/cli/plan.py— the scripted planner's replies now come off the registry module when it exportsscripted_planner_replies(incident replies stay the fallback). Without this, the free path against the docs registry was five rounds ofunregistered_nodeand aplanning_failed— verified before and after.Slack gate —
plan --registryaccepts exactly the two shipped registry modules via a newchoice_flagsmechanism; every other value (and the flag onrun) stays refused, since its general form imports arbitrary code.From Slack, free, no key needed:
Six new tests (registry confinement incl. symlink escape, kind-keyed factory via the governed loop, CLI scripted-path regression, gate allowlist). Full suite green,
ruffclean.🤖 Generated with Claude Code