Skip to content

toolplane: say what a create would make, so a person can approve it - #41

Merged
github-actions[bot] merged 1 commit into
developfrom
feat/approve-what-you-can-see
Sep 12, 2026
Merged

github-actions[bot] merged 1 commit into
developfrom
feat/approve-what-you-can-see

Conversation

@traviswu-bigstack

Copy link
Copy Markdown
Contributor

What

describe_instance_profile — an unlisted, read-class control tool that reports the flavour, image, network and project a create_instance would use, so the SaaS can name them in the sentence a person approves.

Adds tunnelproto.InstanceProfile as the shared wire shape, and Tool.Unlisted / Entry.Unlisted so the SaaS can tell a deliberate absence from its own tool list from a stale copy.

Why

Validating the write path end to end on the 1cc lab R630 created a VM, watched it reach ACTIVE, and recorded what its approver had read:

flavour, image, network and project are the cluster's own settings, not chosen by the assistant.

Every word true, and a category rather than a machine. The values live in a file on this node; the SaaS composing the prompt had no way to learn them. There is no undo at the operate level, so the person clicking approve is the last check, and they were being shown the least useful true sentence available.

Reviewer notes

It reports values, not a sentence. The wording a customer reads is product copy that should improve without an agent release on every cluster; the values are facts only this node holds. Each side renders the half it is authoritative for.

Unlisted, and why it is published rather than inferred. The model already cannot choose a flavour or an image — that is the profile's entire purpose — so a tool reporting them would widen what the model sees without widening what it can do. It is not a security boundary: the executor serves the name to whoever holds the tunnel, and the level and impact checks are what decide whether a call runs. Without the flag the SaaS's catalogue comparison would need an exception typed out over there, which is the hand-kept copy toolcatalog exists to abolish.

Configured is false for a half-configured profile, not only an absent one. A profile missing any of the three refuses every create, so reporting it as configured would put values in front of a person for a call that cannot run.

callControl answers this before it looks for a probe runner. The guard it bypasses was written for this case — its comment anticipated "a future control tool that is not scratch-class" — and an agent built without a probe plane still has to be able to say what a create would make. TestDescribeWorksWithoutAProbeRunner pins it.

Break and restore, each watched to fail and then restored:

break failed
flavour no longer crosses the wire TestDescribeReportsTheProfileACreateWouldUse
catalogue stops publishing Unlisted TestEveryAllowlistEntryIsPublished, naming the tool

Full suite GO_TEST_RC=0, zero --- FAIL: lines. go vet clean; gofmt clean except cmd/agent/main_test.go, which is unclean on develop already and untouched here.

Docs

bigstack-handbook#638 — A person approves what they can see, in read-only-plane-end-to-end.md beside the other slices.

A create takes its flavour, image and network from a file on this node, and
the SaaS had no way to learn them. The sentence a person approved therefore
said those values were "the cluster's own settings" — true, and not something
anyone can consent to. Validating the write path end to end on the 1cc lab
R630 showed a VM created and reaching ACTIVE with the approver never told what
it would be.

describe_instance_profile reports them. It is a control operation: this
process answers it from state its own operator wrote, running no command and
calling no API, so it is a read that creates nothing and changes nothing.

Three properties are worth stating because each was a choice.

It reports values and not a sentence. The wording a person reads is product
copy that should improve without an agent release on every cluster; the values
are facts only this node holds. Each side owns the half it is authoritative
for.

It is Unlisted — served to the SaaS, never offered to the model. The model
already cannot choose a flavour or an image, which is the profile's entire
purpose, so advertising a tool that reports them would widen what the model
sees without widening what it can do. The flag is published through
toolcatalog rather than left for the SaaS to infer, because an exception typed
out on that side is the hand-kept copy that package exists to abolish.

It reports Configured false for a half-configured profile, not merely for an
absent one. A profile missing any of the three refuses every create, so
reporting it as configured would put values in front of a person for a call
that cannot run.

callControl now answers this operation before it looks for a probe runner. The
guard it bypasses was written for exactly this case — its comment anticipated
"a future control tool that is not scratch-class" — and an agent built without
a probe plane still has to be able to say what a create would make.

InstanceProfile lives in tunnelproto because both repositories read it: a wire
shape only one side can import gets restated on the other, which is how
cube-ai-advisor#121 and cube-advisor-agent#24 came to be green while
disagreeing about a frame.

Signed-off-by: Travis Wu <travis.wu@bigstack.co>
@traviswu-bigstack
traviswu-bigstack marked this pull request as ready for review September 12, 2026 06:40
@traviswu-bigstack traviswu-bigstack added the done Apply to a PR to trigger the fast-forward merge label Sep 12, 2026
@github-actions
github-actions Bot merged commit d0e7792 into develop Sep 12, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

done Apply to a PR to trigger the fast-forward merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant