Repository navigation
Extension loading narrates failures and logs everything else; on success the console hears nothing #829
Description
Ruled 2026-09-05. Extension loading narrates failures and logs everything else that is
of interest in debugging, diagnostics and troubleshooting. The console, through the narrator, hears
from loading only when something went wrong.
Today
Loading narrates its success — the module-selection inventory, two lines on every invocation:
[star] [+] scripting runtime (ambient): 28 of 28 modules contribute 141 of 141 methods
[star] [+] full appnet(1) archive(2) commands(7) ...
It is emitted through the one narrator (starlarkbridge.Runtime.reportSelection,
runtime.go:489, Status.Note), and it is the only narration star produces before argv is parsed,
because extensions must be discovered to register their commands before cobra can parse. So it is
the one line --silent cannot reach (#828). It is also, by 2.8's own test, diagnostics narrating
because the diagnostics API does not exist yet (TODO(#507), runtime.go:455).
Failures already reach the console: Warning: failed to load Starlark commands: <extension>: <command>: <cause>.
This issue changes the success path, and makes the failure path deliberate rather than incidental.
The rule
| Event | Destination |
|---|---|
An extension fails to load — parse error, missing run, unresolvable load(), bad spec |
narrate, once, with extension, command, file and cause |
| A config schema fails to register | narrate |
| Search paths walked, and which existed | log |
| Extensions discovered per path; one shadowing another by name, and which won | log |
| Commands registered, and their cobra paths | log |
| Config paths registered | log |
| The module-selection inventory — admitted, partial, refused, per module | log |
| Timing of discovery and load | log |
"Log" is the diagnostics stream: DEBUG through the slog tee once #507 gives it a destination.
Nothing on that list is user-facing progress; every item is what a person reads when a command is
missing, a shadow surprised them, or star started slowly.
Interim, before #507
Gate the inventory on --verbose. -v exists on the root, and this is the same user-visible
contract as the end state. Whatever the destination, move the emit to PersistentPreRun, after
flags are known: -v has the mirror-image pre-parse problem the banner has with --silent.
Done when
- A clean invocation of any star command emits nothing to stderr from loading
- A broken extension is narrated once, naming extension, command, file and cause; the rest of
the tree still loads and the command that failed is absent, not the whole surface -
-v(interim) orDEBUG(A diagnostics API for provider developers #507) shows search paths, discoveries, shadows, registrations, the
inventory, and timings -
--silenton the report line produces the table and nothing else (--silent does not suppress the ambient-runtime banner; two stderr lines survive it #828 closes with this) - The
TODO(#507)atruntime.go:455is resolved or re-pointed here
Epic: #449 · Feature: #504 — related: #828 (the symptom), #507 (the API), #506 (severity as the mechanism), #502 (the tee)
Activity
feat(lint): lint.starlark ships, and star lint all can run a linter f…
feat(lint): star lint starlark resolves plan.* against the surface de…