Mediabot v3 can now open a real collaborative Spark Portal: a short-lived channel event that invites several people to contribute, gathers their ideas safely, and produces one shared closing payoff.
This is not a free-form AI loop and it is not an excuse to bypass Sparkβs existing safety model. Portal is deliberately bounded, ephemeral, generation-scoped and fully subject to the same late runtime authority checks as every other proactive Spark delivery.
Commit: 3b159ef
Version: 3.4dev-20260828_051210
Public commit message: MB708: add guarded three-voice Spark Portals β Mischief managed ποΈ
When Spark selects a Portal, Mediabot first generates and sends a compact opener. The runtime then creates an in-memory collector tied to the exact IRC channel and Spark generation.
The event follows a strict contract:
Each accepted contribution is limited to 120 characters. Collector state is kept only in memory, is capped across channels, and is discarded on completion, timeout, invalidation or runtime cleanup. No Portal transcript is written to the database.
The result feels collaborative on IRC, but the machinery underneath is closer to a carefully supervised Hogwarts classroom than an unattended Room of Requirement. π°
Portal needs the contribution text to create its shared closing line, but it does not send contributor nicknames to Anthropic, OpenAI or another configured AI provider.
The provider receives the minimum data required for the task:
Contributor identity, channel identity, credentials, internal runtime objects and unrelated conversation history remain outside that request. Logs are metadata-only: they record decisions such as generation, action, reason, count and continuation state without copying contribution or generated text.
Spark already enforces a fixed 120-second delivery interval. A Portal requires an opener and, if people participate, one closing payoff during the same event. MB708 therefore adds a narrowly scoped continuation capability rather than weakening the global limiter.
The closing delivery is accepted only when all of the following still hold:
portal;A rejected or failed continuation does not silently gain another attempt. The authority is explicit in sender metadata and cannot be borrowed by Reaction, Fork, Callback or VDM.
MB708 preserves the complete Spark safety chain before generation and again immediately before transport:
+Spark;SPARK_SEND_ARMED kill switch must still be enabled;The development deployment kept its normal pacing configuration unchanged:
SPARK_SEND_ARMED=1SPARK_MIN_SILENCE_SECONDS=1200SPARK_CANDIDATE_PROBE_SECONDS=300No database migration, schema modification, chanset addition or configuration-key change was required.
The same commit also improves the surrounding Spark event schedule.
Selection is now context-aware and weighted rather than a simple rotation:
+VDM.Prompt contracts were tightened at the same time. Callback must revive a concrete recent hook. Fork may no longer turn named participants into opponents or fall back to a lazy βwho is right?β framing. Portal has separate opener and closing contracts so invitation and synthesis cannot be confused.
The change introduces Mediabot::Spark::Portal as a pure collector and updates the existing Spark layers without adding another persistence system:
Portal.pm owns bounded collection, distinct-contributor tracking, deadline state, snapshots and cleanup.Generator.pm builds separate provider-neutral opener and closing requests.Sender.pm owns the single-use continuation authority and repeats every final delivery guard.Orchestrator.pm observes eligible public lines through the existing flood-suppressed runtime path.mediabot.pl wires opener delivery, contribution collection, immediate third-contribution closing, deadline fallback, technical-error handling and metadata-only diagnostics.The canonical lowercase channel-cache invariant is also enforced explicitly at every Portal.pm cache boundary. This keeps Portal aligned with IRCβs case-insensitive channel identity and the historical MB407 repository contract.
The validation sequence deliberately kept the full suite until the final pre-commit gate.
Initial MB708 validation:
#radiocapsule join evidence: passed;The first full-suite attempt passed 17,559 of 17,560 assertions and correctly stopped the commit on the historical MB407 canonical channel-key contract. The new Portal collector already normalized its keys semantically, but seven cache accesses did not express the required explicit lc(...) boundary.
After that focused repair:
Only then was the change committed and pushed. The resulting commit contains exactly 20 project files, the upstream master branch matches local HEAD, the worktree is clean, and the private local commit.sh remains outside Git.
Portal will now be observed under normal Spark eligibility and pacing instead of distorting production rules merely to force a demonstration. Its natural runtime markers provide enough operational visibility without logging participant text.
The doorway is open, the wards are still intact, and three channel voices can finally shape one shared Spark payoff.
Mischief managed. ποΈβ¨
You must be logged in to reply.