Seven pages carried the same broken line, and nobody had ever built one
The samples are compiled now (WikiSampleCompilationTests in tik4net.unittests), and the
first run found six defects:
* `new TikConnectionSetup(HOST, USER, PASS).setup.CreateXConnection()` - a stray receiver
in the opening call, on all seven transport pages that have one.
* `IpProxy.MaxSessions` does not exist; the example now uses MaxClientConnections and
makes the point that survives - an assigned value equal to the declared default is
still not sent.
* The REST listen example invented `onAdded:` / `onChanged:` / `onDeleted:`.
* `long? up = q.MaxLimit?.Upload` - each half of a TikRatePair is itself a TikDataRate,
because a half can hold a word too.
* Safe Mode showed `connection.SafeModeTake()` eight lines under a paragraph saying there
is deliberately no such shim on a plain ITikConnection.
* `Objects.Ip.IpAddress` compiles for nobody: a using-namespace directive imports a
namespace's types, not its nested namespaces.
Two conventions the check needs, both of which also tell the reader something:
`<!-- no-compile: why -->` marks the 22 blocks that cannot compile by design - an elided
body, one link of a fluent chain, code shown *because* it no longer compiles - and a
second test fails if such a marker stops being needed. `<!-- sample-connection: ... -->`
lets a page state what its snippets assume `connection` already is, which CRUD examples
needed because it opens one ITikApiConnection at the top and continues from it.
Also here: WinBox Native documents the two members its interface now declares
(UseGuiNames, CatalogHandlerCount) and where the pre-Open mapping settings live; TikValue
is deferred out of 4.0 with the reason and with what the shipped value types do and do
not cover; the native transports are "experimental" on the roadmap too, matching what
every other page has said all along.
Entity value types: the conversions normalise, and a word is not a gap
Two things the page did not say.
The implicit conversions keep the VALUE, not the spelling: TikDuration time =
"10:00:00" comes back as "10h". That is the point of the type -- both spellings
are one value and compare equal, and ToString() writes the form every transport
accepts -- but it means these must never be compared as strings, and the page
now shows that with the example rather than leaving it to be discovered.
And the part the type only just learned: 'none' is a router STATE, while text we
cannot read is a gap in tik4net, and they used to be the same Token. Kind now
separates Value / Special / Unknown; Special is a typed enum, so a check is
`lease.Special == TikDurationSpecial.None` rather than a string comparison, and a
write is FromSpecial(...) rather than a spelling at the call site. Unknown still
round-trips verbatim but raises a note on the new value.token trace channel --
documented in the channel table -- because a token that behaves perfectly is
exactly how a missing word stays missing.
Also: a bare word in a rate pair applies to both halves. It used to become
"unlimited/0", which is a configuration the router never reported.
Entity reference, value types and helpers: the coverage a reader could not see
Three pages for the part of the library the wiki named once and never listed.
Entity-reference answers one question -- is my menu covered, and what is the
class called -- for a reader who already knows RouterOS. No field descriptions,
no per-entity prose: a table per top-level menu, and five markers explained once
at the top instead of repeated per row (singleton, read-only, ordered, live
counters, has helpers). The table is GENERATED from the [TikEntity] attributes
and guarded by a unit test in the code repo, so it cannot quietly fall behind;
what reflection cannot know is hand-written around it -- why the four *-server
singletons refuse =detail=, and that wireless and wifi are two drivers the router
chooses between, not two spellings.
It also says how to guess a class name without the table, and what to do when the
answer is no, which is the case the page most needs to handle well.
Entity-value-types gives TikDuration, TikDataRate, TikRatePair and
TikRouterAddress a home outside the page you visit to WRITE an entity -- every
reader of the built-in ones meets these types. Each one leads with the RouterOS
spelling it corresponds to, per transport, because that divergence is why the
type exists: 5s vs 00:00:05, 1000000 vs 1M vs 1Gbps, 1000000/2000000 vs 1M/2M.
Entity-helpers collects the 17 verbs that are not CRUD, grouped by what you would
be doing in WinBox rather than by which class they live on.
Home's breadth claim now carries its evidence (169 menus, linked), and
High-level-API-entities becomes the hub that reaches all three.