Mediabot v3 · 3.6dev development diary · MB822–MB829 · 17 October 2026
The last entry left Mediabot’s AI council with clearer replies, a command grimoire and a stronger obligation to show its sources. Since then, the Hogwarts library has become considerably more useful: the council can research everyday questions, Gemini has returned to the table, and the Astronomy Tower now watches the IRC networks themselves. 🦉
There has also been some necessary work beneath the moving staircases: more dependable evidence handling, reproducible HTTPS tests, fresher dashboard permissions and a maintenance round that caught several small but consequential defects.
Here is what changed, what was tested, and where the rollout stands.
The most important change is straightforward: you can ask Mediabot an ordinary informational question without knowing which topic keywords trigger a search.
Research first expanded to vulnerability details, software choices and technical documentation. It then grew into a general route for addressed informational requests, including informal wording and sentence fragments.
The familiar entrance remains:
mediabot: Why does the sky turn red at sunset?
mediabot: My pancake batter is lumpy. How can I rescue it?
mediabot: What is Home Assistant for? Is it free, and can it work without Internet?
mediabot: What are the Musée d’Orsay’s opening hours this Sunday? Check its official website.
mediabot: And how much does admission cost?
These are English renderings of questions exercised on the French-speaking pilot. The live tests covered science, cooking, home automation, software and a museum question followed by a short contextual follow-up.
The goal is a useful answer: address the requested points, respect the constraints, and use the available IRC space for a practical detail or relevant qualification. Shared editorial guidance now applies to both researched synthesis and the native web fallback.
Tavily supplies the shared web search and page extraction. Official sites receive preference where appropriate, while searches can broaden when the first results are weak. Publication dates are handled according to the question: an older official reference page can still establish current opening hours, whereas a request for recent incidents needs appropriately dated material.
Personal recall, acknowledgements, creative writing and simple calculations keep their conversational route unless verification is needed. Short follow-ups can recover their subject through an intervening acknowledgement; a new independent question gets its own subject.
The compact IRC presentation introduced in the previous chapters remains: up to two answer lines, a compact sources line, teuk.org short links in light blue and underline, and measured delivery. 🔗
The live rehearsals exposed a frustrating distinction: all contributors could answer successfully, yet the final researched reply could still fail its evidence check.
The earlier contract asked the synthesis model to reproduce a supporting passage from the retrieved text. A plausible answer accompanied by an altered quotation was rejected. MB823 added one bounded regeneration attempt and clearer diagnostics, while retaining the evidence validator.
MB824 changed the interaction more fundamentally. Mediabot now builds a catalogue of passages from the material actually retrieved for that question. The model selects passage identifiers; local code resolves them to the exact source text and validates the binding.
Think of it as handing the council numbered bookmarks from the books already on the desk. The program knows which book each bookmark belongs to.
The checks reject invented identifiers, passages assigned to another source, and selections whose source content has changed. Missing or malformed selection fields can receive one correction using the same catalogue. A valid selection needs no additional repair request, and the contributors and searches are not repeated for that correction.
This removes a fragile quotation-copying step while keeping the underlying checks. A retrieved passage establishes that the text exists in the selected source; judging whether it fully supports the answer still requires sound interpretation. Partial and insufficient evidence retain their explicit limited-answer behavior.
The result was visible in the next production rehearsal: the researched reply was delivered with accepted passage identifiers and two shortened references. ✨
Gemini’s initial generic 599 failure deserved investigation. More detailed probes exposed real 503 / UNAVAILABLE responses during service overload, alongside occasional successful calls.
MB822 added bounded recovery and useful distinctions between service, transport, TLS, access, quota and model failures. Operators can probe one provider or model independently and list the models advertised to their account. An advertised model still needs a successful live probe.
MB825 then added an explicitly configured fallback model. In the pilot, gemini-3.8-flash remained the primary model and gemini-3.5-flash-lite served as the spare. A live general-software question demonstrated a usable Gemini contribution through that fallback, alongside OpenAI and Claude.
Recovery stays within the existing two-call limit and deadline. The fallback uses the available second attempt; it does not start another chain of retries.
The pilot now configures OpenAI, Anthropic and Gemini as parallel contributors. MIN_PROVIDERS=2 means that two usable contributions are required; it does not limit the council to two requests. All three configured contributors are asked, and the logs distinguish a full council from a degraded response.
Per-provider diagnostics report outcomes, HTTP status, retry count, actual model and fallback use. Questions, answer text, source extracts and credentials stay out of these diagnostic records.
The Astronomy Tower has a new instrument: persistent network statistics based on the counts announced by /LUSERS.
Two dashboards serve the current installation:
| Observatory | Network feed | Public dashboard |
|---|---|---|
| Development | The dev bot on teuk.org, connected to Radiocapsule | teuk.org/mbdev |
| Production | The EpikNet bot on nbot, publishing to teuk.org | teuk.org/epiknet |
The counters cover:
“IRC operators” means network operators, rather than channel operators. Unsupported counters remain unknown; an explicitly reported zero remains zero. Consecutive reply bursts are kept separate so an older counter cannot silently fill a gap in a new observation.
The dashboards use dark panels, clear numeric cards and interactive curves, with periods from one hour to 90 days, series toggles and tooltips. They include an accessible observation table and period minimum, maximum and mean values.
The browser refreshes every minute; the default IRC collection interval is five minutes. Long-range charts retain actual observations, missing collection periods remain gaps, and old data is marked stale. History begins when collection is activated.
This is a standalone observatory inspired by monitoring dashboards, with no Grafana service, external JavaScript CDN or tracking dependency.
The remote EpikNet instance sends aggregate snapshots to the hub over verified HTTPS. A persistent outbox retains observations for retry when delivery fails, and SQLite keeps up to 90 days of history outside the bot repository.
Each stream has its own publishing credential. The hub stores its token digest. Public telemetry contains no nicknames, channel names, hostmasks or conversation text. Publishing runs outside the IRC event loop, and nbot needs no additional incoming telemetry port.
For a single instance, the bot-side configuration remains small:
[network_stats]
ENABLED=1
OUTPUT_FILE=var/network-stats.json
The separate setup helper handles the hub and publisher services, including a generic one-stream installation. Collection, web deployment and private credentials remain explicit setup steps.
The network-statistics HTTPS test hit a certificate-generation failure in GitHub CI. Its fixture now supplies an explicit local OpenSSL configuration, with bounded execution and useful failure diagnostics, instead of depending on ambient defaults.
The tests still use real HTTPS. They exercise certificate rejection, a retained queued observation, and successful delivery once the correct trust material is supplied. Normal, missing and malformed ambient OpenSSL configurations are covered.
A separate Perl warning from an intentional YouTube test stub was scoped to that stub’s existing block.
The development-host full suite passed after these changes. A fresh GitHub CI result remains part of the publication workflow.
The maintenance round followed configuration persistence, authentication, event dispatch, worker lifecycles, AI memory, RSS pacing, mbweb and statistics installation. Five reproducible defects received targeted fixes:
| Area | What needed repair | Result |
|---|---|---|
| Conversation memory | A case-only or RFC1459-equivalent nick change could delete the retained speaker mapping. | Equivalent identities retain their speaker and display name, including across restart and a reply already in flight. Distinct participants and personal erasure retain their boundaries. |
| One-shot events | A callback could trigger a nested dispatch before its one-shot listener had been removed. | The listener is claimed before its callback runs, so nested dispatch cannot consume it twice. Ordinary listeners and isolated error reporting retain their behavior. |
| Dashboard membership | A 30-second cache could keep a removed channel in a user’s dashboard list or mask a failed fresh read. | Membership is read for every dashboard response. Revocation appears on the next request, and a failed read cannot reuse previous rows. Existing quote-content authorization remains separately enforced. |
| Privacy tests | A whole-JSON check for digits such as 123 or 456 could accidentally match a legitimate timestamp. |
The tests check the sensitive fields directly and exercise those timestamp values deterministically. |
| Statistics installation | A private umask 077 could leave application directories inaccessible to the service account. |
Managed directory modes and owners are set explicitly; credentials and outboxes stay private. Symbolic paths are refused, and failed commands report their name and exit status without exposing arguments. |
The review also recorded follow-up work: stronger atomic configuration-save guarantees and gradual extraction of responsibilities from the largest modules. Those are documented work items, separate from the completed fixes in this round.
The final mbweb deployment uncovered another issue: the npm audit gate rejected the locked proxy-addr 2.0.7 dependency because of a critical IP-spoofing advisory involving IPv4-mapped IPv6 trust subnets.
The gate stopped deployment before replacing the installed web application. The reviewed lock was then updated to proxy-addr 2.0.8, the upstream corrective release, without changing the direct dependency declarations or the other locked package entries.
Qualification included the actual dependency’s proxy-trust behavior, retention of the application’s loopback policy, all 70 mbweb tests and an npm audit reporting zero vulnerabilities. The full project suite passed again, and the canonical dev console was successfully redeployed.
That audit finding established a vulnerable dependency in the lock; it was not evidence of an observed attack against the console.
Every chapter passed its required full suite on the development host:
| Chapter | Main change | Full-suite assertions passed |
|---|---|---|
| MB822 | General technical research and Gemini recovery | 22,895 / 22,895 |
| MB823 | Evidence recovery and contributor diagnostics | 23,002 / 23,002 |
| MB824 | Retrieved passage catalogue | 23,168 / 23,168 |
| MB825 | General questions and Gemini model fallback | 23,276 / 23,276 |
| MB826 | Open-domain requests and useful-answer guidance | 23,524 / 23,524 |
| MB827 | Network statistics and dashboards | 23,561 / 23,561 |
| MB828 | Reproducible TLS fixtures | 23,561 / 23,561 |
| MB829, including the dependency correction | Maintenance and mbweb lock update | 23,609 / 23,609 |
MB829 also passed 505 focused Perl assertions, 8,275 fast-lane assertions, 70 mbweb tests, and all 37 security-audit invariants. The corrected lock passed a production-dependency install and npm audit before deployment.
At the time of writing, the AI changes through MB826 and the MB827 statistics setup have reached the production pilot. The latest maintenance has passed validation on teuk.org, the development bot has been restarted, and the dev web console has been redeployed successfully. Repository publication, the GitHub CI rerun and the subsequent production bot update are the next rollout steps for the latest fixes.
The library doors are wider, the observatory is open, and a few troublesome staircases now lead where they should. Bring a question; the owls have work to do. 🦉✨
This entry covers work since the MB819–MB821 article of 13 October. It describes the current 3.6dev development line; it does not announce a new stable release.
You must be logged in to reply.