refactor(tooling): T-1288 — planet-gen becomes reach atlas planet
The 30-file tree moves under atlas as its third rung (D-243), ten verbs fronting it. Each verb restates its module's options so `--help` describes something; tooling/test_planet_router.py hands every declared option to the module's own argparse and fails on drift, and now runs in make test-tooling. The 2026-09-02 half of this move had converted the top-level imports and the repo roots. Finishing it found what the half-move left: - Lazy in-function imports, and all of sol_data/, still named siblings bare. They resolved only through sys.path.insert hacks, so under reach the first globe render in generate, batch or sol-import would have raised ModuleNotFoundError. Qualified; the hacks are gone. - 247 print() calls and a stdout progress writer that fired once per 8 KB block. Report verbs (audit, quality) write through console.out, progress through console.event, and download progress is throttled to 10% steps so a job log is not tens of thousands of lines. - Every error exit raises ReachError with a fix. Two checks that could not fail: - batch --verify-determinism printed a warning and exited 0 on a mismatch. - import-provinces exited 0 with errors > 0. Both now raise. The 271-body bake is only safe to re-run because the first one holds. sol-import --body is action="append" in the module but the router took one value, so --body GJ0d --body GJ0e kept one. Now repeatable, and _flags repeats list options. test_conformance walked one level, so a nested group was reported as a verb missing @command and its ten verbs were never checked. It recurses now; proven by stripping @command from `planet quality` and watching it fail. Stray PNGs from the 2026-09-03 runaway router-test run are parked in .cache/t1288-stray-pngs/, not committed. Their reliefmaps differ from HEAD while the heightmap regenerated byte-identical — filed as T-1291. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -231,18 +231,26 @@ from tooling.core.command import MARKER
|
||||
from tooling.main import DOMAINS, _load_domain
|
||||
|
||||
report = []
|
||||
for name in sorted(DOMAINS):
|
||||
group = _load_domain(name)
|
||||
ctx = None
|
||||
for verb in group.list_commands(ctx):
|
||||
cmd = group.get_command(ctx, verb)
|
||||
|
||||
def walk(name, group, prefix):
|
||||
# A nested group (`atlas planet`) is not a verb: its callback only keeps it
|
||||
# a group. Recurse into it instead, so the verbs underneath are held to the
|
||||
# contract too -- a one-level walk reported the group and skipped all ten.
|
||||
for verb in group.list_commands(None):
|
||||
cmd = group.get_command(None, verb)
|
||||
if hasattr(cmd, "list_commands"):
|
||||
walk(name, cmd, prefix + verb + " ")
|
||||
continue
|
||||
callback = getattr(cmd, "callback", None)
|
||||
report.append({
|
||||
"domain": name,
|
||||
"verb": verb,
|
||||
"verb": prefix + verb,
|
||||
"decorated": bool(getattr(callback, MARKER, False)),
|
||||
"help": (cmd.help or cmd.short_help or "").strip(),
|
||||
})
|
||||
|
||||
for name in sorted(DOMAINS):
|
||||
walk(name, _load_domain(name), "")
|
||||
print(json.dumps(report))
|
||||
"""
|
||||
result = subprocess.run(
|
||||
|
||||
Reference in New Issue
Block a user