One task, Low-level API: the byte counters are in neither print form
The five ADO.NET-like CLI tabs still said 'detail' brings back the byte
counters. It does not -- measured over the raw CLI: as-value gives 8 fields,
detail 14, and rx-byte/tx-byte are in neither; they need 'print stats'. The
Level-1 tabs were corrected when they were rewritten, so these five now carry
the same wording.
Low-level-API: the two raw entry points fail differently on the transports that
have no command language. CreateRawCommand throws at run time, but
CallCommandSync is not on ITikRestConnection / ITikWinboxNativeConnection at
all, so writing it does not compile. The page named only the throw.
One task: rewrap the three "not a program" paragraphs
Line breaks only.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
One task: the four "not a program" tab titles match the others
Literal em dash and separator in the four new summary lines, the way the other
29 tabs are written, and the Rest tab keeps its "(RouterOS 7.1+)" qualifier.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
One task: the low level speaks each transport's own language, or none
Rewrote the Level-1 section against a live RouterOS 7.24 router.
Every tab declared ITikConnection and called CallCommandSync, which does not
compile: the method is on ITikRawSentenceConnection. The seven programs now ask
the transport's own factory for the connection (CreateApiConnection,
CreateTelnetConnection, ...) and get a type that has it.
The five CLI tabs sent API sentence words. This level sends what it is given
unchanged, so on a terminal it takes a RouterOS CLI line; they now send
':put [/interface print detail as-value where comment="..."]' and
'/interface set *2 comment="..."'. All seven programs were compiled and run
against the router; OUTPUT is what they printed, including the empty-result and
refusal branches.
Rest, RestSsl, WinboxNative and WinboxNativeMac declare no RawCommand and have
no CallCommandSync at all, so their four tabs now explain why the level does not
exist there and point at the ADO.NET-like and O/R mapper tabs, which do work.
Also measured: the CLI summary column set is 8 fields, 'detail' raises it to 14,
and the byte counters are in neither - they need 'print stats'. The counts of
programs are corrected from 33 to 29.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
One task: say that the low-level tabs are API-sentence-only, pending a rewrite
The recovery transports, documented for the recovery case
All three MAC pages promised access to a router with no reachable IP and
then passed a host in every example. They now show the case they are for:
address the setup by MAC alone and give no host.
Two consequences are worth stating rather than discovering: the MAC has to
be given (MNDP answers "the MAC of the router at this address", which a
MAC-only session has no address to ask about), and the local interface is
found by trying, so a machine with many adapters wants room in
ConnectTimeout.
Thirty-three complete programs, one per tab
The page argued that the code does not change between transports and
showed one sample per API level, leaving the reader to assemble the
rest. That is the wrong shape for the question it answers: someone
picking a transport wants a program they can paste and run, not a
snippet plus a diff to apply mentally.
Now every API level carries one complete, runnable program per
transport — 33 of them, each in its own collapsible tab (GitHub wiki
has no tab control, and the page says so once). Usings, class, Main,
connection setup, the task, the output: nothing elided.
Each sample's header comment states what the transport needs on the
router, what goes in, what comes out and what to watch out for there.
Those prerequisites were measured, not recalled — a user with only
read,write,test,local was given one policy at a time:
Api / ApiSsl api "not allowed (9)"
Rest / RestSsl rest-api HTTP 401
Telnet / MacTelnet telnet "incorrect username or password"
Ssh ssh "Permission denied (password)"
WinboxCli/CliMac/Native/NativeMac winbox "not allowed (9)"
MAC-Telnet authenticates against the telnet policy, not a MAC-specific
one, and three of the five refusals are indistinguishable from a typo
in the password — both now stated on the page, because both cost time
to find out the other way.
The tabs are not copies with one line swapped. The low-level sample
inspects a trap SENTENCE on Api/ApiSsl and catches an exception on the
other nine; the CLI tabs add 'detail', without which print as-value
returns 8 of /interface's 28 fields; the MAC tabs carry RouterMac and
their own mac-server prerequisites; Ssh is the only one with a
Register() call.
All 33 compile against tik4net + tik4net.objects + tik4net.ssh, clean.
Six were run against the lab CHR (7.24) across both API levels and
both carriers, and the printed output matches what the OUTPUT comment
promises — which is how the low-level block was caught claiming a line
it does not print.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The same task, at every API level and over every transport
New page: One task on every transport and API level. It holds one task
fixed — find an interface by its comment, keep its .id, write a new
comment back by that .id — and varies the two axes around it.
The existing pages cover one axis each: CRUD examples for all APIs is
three API levels on one transport, and each transport page is one
transport. Neither answers what a reader actually asks, which is what
changes when they switch.
The answer is "one line", and the page is laid out to say so: the three
samples name no transport, and the transport section is one collapsible
block per transport carrying only the line that differs plus that
transport's own note. Eleven tabs each repeating the same body would
have implied differences that do not exist.
Every behavioural claim was measured on the lab CHR (7.24), not
reasoned: 33 of 33 combinations found the row and wrote the comment
through. What does differ is what comes back, and that is the table:
- the trap sentence exists on Api/ApiSsl only; everywhere else a
refusal throws, so sentence-inspecting low-level code stops checking
anything when it is moved
- a bare print on a CLI transport returns the summary columns, 8 fields
against the API's 28 — but the O/R mapper adds the entity's detail
markers, so a typed entity is complete on all eleven
Also: Home.md said the library is tested against 7.23.2, where the
router is 7.24 and the repo README already said so. The dated "measured
on 7.23.2" lines elsewhere are provenance and stay as they are.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>