Accept a node that cannot name its illuminator - #385
Conversation
This comment has been minimized.
This comment has been minimized.
`tx_callsign` was the last required field of a node's configuration with no way to say "unknown", which left its producers inventing one: retina-gui substitutes the literal 'Tower' when the tower it selected has no callsign, and retina-simulation's tower resolver falls back to an empty string. Both are the objection 1.1.3 made of a substituted coordinate, that the server cannot later tell the placeholder apart from a name an owner gave it. So the field becomes nullable, on the coordinates' reasoning and by the same route: the validator, the column, and the published schema, which the contract is regenerated from in this commit. The empty string stays refused. Null is the one spelling of "unknown", which is what keeps a stored name distinguishable from its absence, and since the validator has always refused "" there is no legacy sentinel to grandfather the way (0, 0) had to be. A patch rather than a minor bump, on the test 1.1.3 applied to this same change on the coordinates: the document gains no field a client can read, and what a client generating from it sees is a widened type on a field it already had. Nothing in this repo reads the callsign, so no consumer gains null-handling. The producers need their own changes before either stops inventing a name, and those are out of scope here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2be4eba to
467e0f4
Compare
|
Claude finished @Babissimo's task in 1m 53s —— View job Reviewing PR #385
ReviewClean, well-scoped change that mirrors the precedent set for the coordinate fields in migration
Scope claim re-verified: grepped for No bugs, security issues, or inconsistencies found. I don't have a working Python venv in this environment to run |
tx_callsignwas the last required field of a node's configuration with no way to say "unknown", so both producers invent one:retina-guisubstitutes the literal'Tower'when the tower it selected has no callsign (setup.js:1139), andretina-simulation's tower resolver falls back to an empty string. Both are the objection 1.1.3 made of a substituted coordinate: the server cannot later tell the placeholder apart from a name an owner gave it.The field becomes nullable on the coordinates' reasoning and by the same route.
_NULLABLE_CALLSIGNset folded into the published schema's nullable union, andNonelet through the check invalidate_config.node_configs.tx_callsignbecomes nullable, via0009_nullable_tx_callsign. Gradeddestructivefor 0005's reason: code predating this revision has no null-handling for the column, so a rollback across it must reach a human rather than be served as safe. Existing rows keep the names they declared.NODE_API_VERSION1.2.1 → 1.2.2 andcontracts/nodes-v1.openapi.yamlregenerated in the same commit. A patch on the test 1.1.3 applied to this same change on the coordinates: the document gains no field a client can read, and what a client generating from it sees is a widened type on a field it already had.The empty string stays refused. Null is the one spelling of "unknown", which is what keeps a stored name distinguishable from its absence, and since the validator has always refused
""there is no legacy sentinel to grandfather the way(0, 0)had to be.Scope
Nothing in this repo reads the callsign: it is absent from
node_pipeline's_WIRE_FIELDS, no lib underlibs/reads it, and no frontend or dashboard file references it. So no consumer gains null-handling here, and the change is confined to the door, the column and the document.Each producer needs its own change before it stops inventing a name. Out of scope here; the retina-simulation half is tracked in 123zgec2zcz.
Verification
pytest tests/(minustest_mlat_history.py): 3516 passed.test_migrations_produce_the_schema_create_all_producescomparesnotnullper column, so it is what proves the migration and the model agree.scripts.generate_openapi --check: current.pre-commit run --all-files: clean.🤖 Generated with Claude Code