๐Ÿ“ chatlog_2026-10-17_redbox-consolidation.mdv4.6.0 · 2026-10-19

Chat log โ€” Recent Posts autodisplay errors, RedBox into Collaborative

Saturday 17 October 2026, Sydney (09:28 โ€“ 10:35).

Operator: Andrew. Replies are from Claude.

Tool calls, file builds and internal steps are left out. Every reply, and every status line Claude sent between steps, is kept in order. The files delivered are listed at the end.


Operator (09:28):

what's going on here ?

(two screenshots attached: a topic view with a PDF attachment, and the Recent Posts page)

Claude:

Claude: [October 17, 2026, 09:28:55 AM]

The topic view (first screenshot) is fine: the PDF renders in the viewer. The Recent Posts list (second screenshot) is where it breaks. The same post shows three red errors, [lmv=autodisplay-scroll], [ltv=autodisplay] and [pdf=autodisplay], each saying no message ID is available because CollabCore's MsgTracker isn't wired up.

That fits how SMF builds each page. Autodisplay needs to know which post it's rendering, and MsgTracker presumably only gets that ID from the topic-view post loop. Recent Posts parses bodies through a different path, so MsgTracker never learns the ID and every autodisplay tag errors out. The Tokeniser post fails the same way, so I'd expect the same in Unread, Unread Replies, search results and the profile "show posts" view.

A second problem is that the [ltv] error is plain red text, while the other two get the โš  box. So LTV's error markup doesn't match LMV's and PDF's.

There are two possible fixes, which can be combined:

Either fix goes through the Package Manager install, and I can build it as a CollabCore update plus the matching LMV, LTV and PDF changes.


Operator (09:32):

ok:

  1. bring LTV in line with the others, 2. confirm that the error handling code + ur fix, is in "common code"

Claude:

Claude: [October 17, 2026, 09:32:24 AM]

I can't do either item yet, because none of the code is in this session. The only files here are the two screenshots, and a search for "autodisplay" found nothing. For both items I'd rather read the real code than guess at it.

Please upload these as a zip:

Once I have them, I'll check these two things before changing anything:

  1. LTV's error markup. I'll find where it builds the error line, so I can see whether it bypasses the shared error renderer (the one giving LMV and PDF the โš  box) or has its own copy. If it has its own copy, I'll move it onto the shared one rather than patching its styling.
  2. Whether the error handling lives in common code. Right now I can't confirm it does. The identical wording in all three errors suggests a shared source, and the LTV mismatch suggests at least one module formats its own. The fix itself (MsgTracker wiring for the list contexts, plus the quiet fallback) will go in CollabCore, so all three modules inherit it. When I deliver, I'll list any per-module code left over.

Operator (09:44):

(attached: pdf_bbcode_v4.4.zip, ltv_bbcode_v1.6.zip, lmv_bbcode_v4_5_1-1.zip)

Claude:

Claude: [October 17, 2026, 09:44:23 AM]

I've extracted the three packages. LTV's redbox() helper differs from the LMV and PDF copies, so I'm reading LTV's header and package files before changing it.

Claude:

The zip builds and the PHP lints clean. xmllint fails on package-info.xml, so I'm checking whether that error was already in your v1.6 file or came from my edit.

Claude:

Claude: [October 17, 2026, 09:45:41 AM]

1. LTV is fixed. It's delivered as ltv_bbcode_v1.6.1.zip. The bug was that LTV's redbox() looked for a class called RedBoxBBC, and even tested class_exists('RedBoxBBC.php'), which is a filename. The real class is RedBoxBBCode, which LMV and PDF use. So LTV never found RedBox and always fell back to plain bold red text. LTV's redbox() is now byte-identical to the LMV and PDF copies, which I checked by diff. That's the only code change.

2. The error handling is not in common code, so I can't confirm that. Each module carries its own private copy of redbox() and of the "no message ID available" string. LTV was a drifted copy of the other two. The comments say this is deliberate, so each mod installs independently, but CollabCore is already a hard dependency of all three through the *_check_collabcore.php install checks, so the independence argument no longer holds.

The common-code fix has two parts, and neither exists yet:

I need CollabCore (the "Collaborative" package, v5.0 per your notes) uploaded to read it, since I won't write that change blind. I'd then make one CollabCore change plus matching LMV, LTV and PDF releases that delete their copies.

Release card (LTV v1.6.1)

Rule Status
@version / @date bumped Done: docblock, const VERSION (also drives the on-page banner) and package-info.xml. LTV's header uses Version:/Date: rather than @version/@date, so I kept its format.
Manual version history entry Done: docblock and package-info.xml. LTV has no manual file, only readme.txt.
Version shown on run Not needed: PHP mod, no executable.
Dotted, never-reused zip name Done: v1.6.1.
xmllint --noout Fails, and it was already failing in v1.6. A comment contains var(--xxx), and -- is illegal inside XML comments. I verified my edits are otherwise clean by checking a temp copy with that one string changed. I left it alone, since you didn't ask for it. The fix is var(- -xxx); say so and I'll roll it into the next LTV release.
Legacy zipper used Missing. Your zipper isn't in this session. I used Info-ZIP and verified none of the nine entries has a streaming data-descriptor, which is what trips PclZip, but you may want to re-zip with your own tool.
Unrequested changes None.

One more thing I noticed while checking: lmv_display_patch.xml also fails xmllint. I didn't look into it.


Operator (09:49):

ok, most of the error handling code is common, ....

(attached: Collaborative_v6.0.zip)

Claude:

Claude: [October 17, 2026, 09:49:55 AM]

You're right that most of it is common. I read Collaborative v6.0 and here is how it splits.

Common, in CollabCore

Not common

Cause of the Recent Posts errors On 2.0.x, $currentMsgId is only ever set by collabcore_parse_bbc(), and the only call site migrated to it is Display.php's. Recent Posts goes through Recent.php, which never calls the wrapper, so the ID is always 0 there. Your migration manual says the same, since there's no 2.0.x hook to fall back on.

Objection before building I recommend not wiring MsgTracker into Recent, Search, Unread, Profile and the other list views. Each would be another patch to a core file, with the same fragility your manual describes for Display.php (six states, one of which broke live). It would also gain nothing, because autodisplay is rendered by the Display.template.php patches, so list views never embed anything. The red boxes there are false alarms. Your second screenshot shows this too: the attachment box is collapsed and no PDF is embedded.

Proposed fix

What I need from you To detect "topic view" reliably I need your live patched Sources/Display.php and the 2.0.19 Sources/Recent.php. I don't have SMF core here and won't guess at $context keys.

The release would be a new Collaborative (MsgTracker 1.1) plus matching LMV, LTV and PDF packages. I'll build them once I've seen those two files.


Operator (09:51):

lets move redbox in

Claude:

Claude: [October 17, 2026, 09:51:24 AM]

I don't have RedBox's source. It isn't in Collaborative v6.0, and the only thing I know about it is how the three mods call it: they lazy-load $sourcedir/RedBoxBBC.php and call RedBoxBBCode::render($message). I won't rewrite it from that, because RedBox also has the BBC tag side and the API from forum topic 7681, and a reconstruction would silently drop whatever I couldn't see.

Please upload the RedBox package: RedBoxBBC.php, its package-info.xml and any other files it ships. Also upload its current install location if that differs from $sourcedir, such as a subfolder.

With that, I'd do the following.

  1. Move the files into Collaborative. RedBox would sit in CollabCore/ beside MsgTracker.php, keeping its class and method names unchanged.
  2. Add the shared helper to MsgTracker.php. It would call RedBox directly, so the lazy-load and file_exists dance disappears.
  3. Remove the separate mod's install. Collaborative's package-info.xml gets a clean hand-off step, so installing it doesn't leave two copies of RedBoxBBCode that fatal with "cannot redeclare class".
  4. Cut LMV, LTV and PDF over to the helper. Their redbox() copies are deleted.

Point 3 is the real risk. If the old RedBox mod is still installed when Collaborative loads its own copy, both define the same class. I'll build the hand-off to cope with either state, installed or not.


Operator (09:53):

(attached: redbox_bbcode_v1_2.zip)

Claude:

Claude: [October 17, 2026, 09:53:10 AM]

I've read RedBox v1.2 and I'm building Collaborative v6.1 now. A few points that shape the build, stated up front since you wanted changes listed before I make them:


Operator (09:55):

(attached: LVI_v2.1.zip)

see if this needs the same

Claude:

Claude: [October 17, 2026, 09:55:08 AM]

I've read LVI and the Collaborative v6.1 edits are almost done. Next I'm writing the manual, then validating and zipping.


Operator (09:56):

(attached: md_bbcode_v13.0.zip)

and this too

Claude:

Claude: [October 17, 2026, 09:56:19 AM]

MD (v13.0): nothing to change. [md] has no per-message state at all. It never calls MsgTracker or RedBox, and it has no autodisplay toggle. A parse failure goes to log_error() only, so nothing ever shows in a post. Its only CollabCore dependency is MDParser 12.8, which Collaborative v6.1 doesn't touch.

LVI (v2.1): the LTV bug isn't there, but there are two other points.

LVI should join the shared helper in the later release, with its list-view behaviour decided at that point.

Collaborative v6.1 is built and checked but not sent. You declined the send, so I've held it. It's 18 โ†’ 22 entries: RedBox, its two register scripts and a RedBox manual added, and only CollabCore.php and package-info.xml edited. The other 14 files are byte-identical to v6.0. xmllint and php -l pass. A dry run of the register and unregister scripts against a fake settings array did the right thing: it dropped only the old RedBox path, kept the other entries, was idempotent on a second run, and left your other entries alone on unregister.

Tell me when to send it, or what to change first.


Operator (09:58):

but Collaborative holds the common code

Claude:

Claude: [October 17, 2026, 09:56:19 AM]

Agreed: the shared helper belongs in Collaborative, so I'm building it now and not leaving it for a later release. While checking where it can live, I found a trap: MsgTracker.php is only loaded by Display.php's patch, so in list views like Recent Posts CollabMsgTracker may not exist at all. A helper placed there would fatal in exactly the pages that show the errors today. RedBoxBBC.php is pre-loaded on every request, so the helper goes in there as RedBoxBBCode::noMessageId(), which also makes the later quiet-in-list-views change a one-place edit. I'll roll it into the still-unsent v6.1 and cut LMV, LTV, PDF and LVI over to it, with a release card for each.


Operator (10:00):

the code goes in CollabCode too

Claude:

It does: RedBoxBBC.php sits inside CollabCore, so the helper lands in Collaborative's CollabCore directory, not in any mod. I'm applying the edits now.

Claude:

Claude: [October 17, 2026, 10:01:41 AM]

All five packages are delivered. The error handling is now common code in Collaborative's CollabCore. Nothing in the mods keeps a private copy any more.

What changed

Install order

  1. Uninstall the old standalone RedBox mod in Package Manager.
  2. Install Collaborative v6.1.
  3. Install the four mods. LMV, LTV and PDF are the ones that need it.

If the order is reversed on 2.0.x, reinstalling Collaborative repairs the [redbox] tag. The manual covers this, and also covers 2.1.x, where there is no self-heal.

Still not done The box still appears in Recent Posts and the other list views. The quiet-outside-topic-view change is now a one-function edit in noMessageId(). It still needs your live patched Sources/Display.php and the 2.0.19 Sources/Recent.php, so I can detect topic view without guessing at $context keys.

Release card

Rule Status
@version / @date bumped Done in every changed module, including each module's const VERSION and build date, which also drive the on-page banners.
Manual version history Done: LVI manual, PDF changelog and manual, Collaborative manual, and each module's docblock and package-info.xml. LMV and LTV have no manual history, so they only have docblock and package-info.xml entries.
Version shown when run Not needed: PHP mods, no executables.
Dotted, never-reused zip names Done.
xmllint --noout Passes on four of five. LTV's package-info.xml still fails on the var(--xxx) comment that was already in v1.6. I left it, and a copy with only that string changed passes.
Legacy zipper used Missing. Your zipper isn't in this session. I used Info-ZIP and verified no zip has a streaming data-descriptor and each matches its original file layout.
Unrequested changes The register scripts were rewritten for the new path. The new CollabCore-RedBox-Manual.md is a new file. LVI's two "no message ID" errors changed from its own red text to the RedBox style.

Operator (10:12):

still showing up in Recent Posts (only)

(screenshot attached: the Recent Posts page, now with all three errors in the same boxed style)

Claude:

Claude: [October 17, 2026, 10:13:27 AM]

I expected that. v6.1 only consolidated the code, so Recent Posts still showed the errors. Your screenshot does confirm the LTV fix is live: all three lines now use the same boxed โš  style.

Collaborative v6.2 is delivered and fixes it in one function. RedBoxBBCode::noMessageId() now stays quiet when a toggle tag, which renders nothing itself, finds no message ID outside a plain topic view. In topic view it still shows the box, which is the case the box exists for, where Display.php's migration isn't in place. LMV, LTV, PDF and LVI need no change and no reinstall, because the same call now returns less.

A plain topic view means no ?action= and a topic ID set. I checked this against seven simulated requests:

Request Result
Recent, Unread, search results, board index (toggle tags) quiet
Topic view (toggle tag) box
[lvi=0] / [lvi=attach-NN] in Recent Posts box
[lvi=0] / [lvi=attach-NN] in topic view box

LVI keeps its box in list views on purpose, because there the panel itself can't render, so a missing panel would otherwise be unexplained.

One caveat. I built this without your live Sources/Display.php or the 2.0.19 Sources/Recent.php, since I'd rather not guess at $context keys. It uses only SMF's own $_REQUEST['action'] and $topic, which are core. If your SEO rewrite leaves a real topic view with an action set, the box would stay quiet there. That is the safe direction, since it only loses the migration-broken warning in that odd case, but it's worth one quick check on a topic page.

Release card (Collaborative v6.2)

Rule Status
@version / @date bumped Done: RedBoxBBC.php 1.4, CollabCore.php 2.2, package-info.xml 6.2, and the RedBox manual.
Manual version history Done: docblocks, package-info.xml history and manual ยง8.
Version shown when run Not needed: library files, no executables.
Dotted, never-reused zip name Done: v6.2.
xmllint --noout Passes.
Legacy zipper used Missing. Your zipper isn't in this session. I used Info-ZIP, checked there are no streaming data-descriptors, and the layout matches v6.1.
Unrequested changes None.

Operator (10:15):

fabbo

Claude:

Claude: [October 17, 2026, 10:15:35 AM]

Good. If a topic view ever shows the box after the upgrade, Display.php's migration has dropped out, and that is the case the box is there to flag.


Operator (10:20):

so it's all in AttachMetq.php

Claude:

Claude: [October 17, 2026, 10:20:20 AM]

No, the error handling isn't in AttachMeta.php. I read it, and it has nothing to do with message IDs or error boxes. It resolves an attachment's real path on disk and reads audio and video metadata (sample rate, codec, duration and so on), and listatt is its only consumer.

The error handling lives in three places in Collaborative:

What File
Message-ID tracking (CollabMsgTracker::current()) CollabCore/MsgTracker.php
The failure box and the quiet-outside-topic-view rule (RedBoxBBCode::noMessageId()) CollabCore/RedBoxBBC.php
The install-time dependency checks (requireOrDie(), with RedBox now in the manifest) CollabCore/CollabCore.php

If you want it all in one file, MsgTracker.php is the natural home. Moving it there is a bad idea for the reason I gave earlier: MsgTracker.php only loads inside Display.php's patch, so the helper would fatal in Recent Posts. I'd keep it where it is.


Operator (10:20):

no, leave it

Claude:

Claude: [October 17, 2026, 10:20:56 AM]

Leaving it as is. Nothing is changing, and RedBoxBBC.php, MsgTracker.php and CollabCore.php stay where they are.


Operator (10:21):

but u changed AttachMeta ?

Claude:

Claude: [October 17, 2026, 10:21:53 AM]

No, I didn't change AttachMeta.php. It is byte-identical to the copy in your v6.0 upload in both Collaborative v6.1 and v6.2; the md5 is 70badfd02cadc5605e37bcbde3d7a25e in all three.

Across both releases, these are the only files that differ from v6.0:

The package reinstalls the whole CollabCore directory, so Package Manager will rewrite AttachMeta.php on install, but with the same content it already has.


Operator (10:22):

ok nw

Claude:

Claude: [October 17, 2026, 10:22:23 AM]

All good.


Operator (10:34):

copy this chatlog to markdown


Files delivered in this chat

File When Note
ltv_bbcode_v1.6.1.zip 09:45 redbox() fixed to match LMV and PDF
Collaborative_v6.1.zip 10:01 RedBox moved in, with noMessageId()
lmv_bbcode_v4.5.2.zip 10:01 private redbox() removed, calls the helper
ltv_bbcode_v1.6.2.zip 10:01 private redbox() removed, calls the helper
pdf_bbcode_v4.4.1.zip 10:01 private redbox() removed, calls the helper
LVI_v2.1.1.zip 10:01 two "no message ID" errors use the helper
Collaborative_v6.2.zip 10:13 toggle failures stay quiet outside topic view