Batch 5: retest #1's fixed bugs headless on libtacky develop #28

Merged
asxpi merged 188 commits from vm/batch-5 into main 2026-11-10 18:57:36 +00:00
Member

Batch 5: the headless retest of #1's fixed bugs (#24), #1's method (libtacky's tackyd-json against slixmpp), on libtacky develop 65a31465 (v1.2.7 + 5), on Prosody, ejabberd and anotherim-server.

Runs: 199 recorded (187 pass, 9 fail, 3 na): ejabberd 72, prosody 55, anotherim-server 72. Each names its original #1 run; interop check OK on all.

Verdicts (of the 67 "Retest: yes" rows of #24):

  • Fixed: all but the four below, on every server they were seen on (C8 both parts, C3.1, C34 included).
  • Partly: S3 (default legacy_file_metadata still sends SIMS name/size/type in the clear; 0 leaks nothing), M18 (a replayed older sealed draft still dropped with no debug line, chatsync.tcl ~1137), M25 (our other device's correction of a peer's live location stored as our outgoing live row; the rest fixed), C21 (see below).
  • Not reachable: S12 on ejabberd (it strips the forged stanza-id itself); the Prosody run shows the libtacky part fixed.
  • Left as upstream decided: XEP-0492 notify get on a bare room (C8 b), XEP-0482 invite id (C7), answers to clear invites in the clear (ad62fa11).

New:

  • C21 residual (anotherim-server 174303): the replay loop is gone, but when the server ends the stream ~1 s late libtacky drops the last stanza it sent instead of the refused one; the forged one is replayed once more, and three iqs (a MAM query among them) are never answered nor resent.
  • Minor, C19 neighbour (173815): IsDuplicate's content fallback groups by calendar second, so two identical id-less copies 15 ms apart across a second boundary become two rows (the rerun 173923 merged them).

Regressions: one per fix, inside the retest runs or as separate runs (regress-C19.py new); all pass apart from the C19 second-boundary case above.

Harness: regress-C19.py, repro-M23.py, fixes/run-ejabberd-slot2.sh, fixes/omemo-on.py, MUCSUB_WHOIS, scenario race fixes. Reports regenerated with main's new FEATURES/matrix code (#27).

🤖 Generated with Claude Code

Batch 5: the headless retest of #1's fixed bugs (#24), #1's method (libtacky's tackyd-json against slixmpp), on libtacky **develop `65a31465`** (v1.2.7 + 5), on Prosody, ejabberd and anotherim-server. **Runs:** 199 recorded (187 pass, 9 fail, 3 na): ejabberd 72, prosody 55, anotherim-server 72. Each names its original #1 run; `interop check` OK on all. **Verdicts** (of the 67 "Retest: yes" rows of #24): - **Fixed:** all but the four below, on every server they were seen on (C8 both parts, C3.1, C34 included). - **Partly:** S3 (default `legacy_file_metadata` still sends SIMS name/size/type in the clear; `0` leaks nothing), M18 (a replayed older sealed draft still dropped with no debug line, `chatsync.tcl` ~1137), M25 (our other device's correction of a peer's live location stored as our outgoing live row; the rest fixed), C21 (see below). - **Not reachable:** S12 on ejabberd (it strips the forged stanza-id itself); the Prosody run shows the libtacky part fixed. - **Left as upstream decided:** XEP-0492 `notify get` on a bare room (C8 b), XEP-0482 invite id (C7), answers to clear invites in the clear (ad62fa11). **New:** - **C21 residual** (anotherim-server 174303): the replay loop is gone, but when the server ends the stream ~1 s late libtacky drops the last stanza it sent instead of the refused one; the forged one is replayed once more, and three iqs (a MAM query among them) are never answered nor resent. - **Minor, C19 neighbour** (173815): `IsDuplicate`'s content fallback groups by calendar second, so two identical id-less copies 15 ms apart across a second boundary become two rows (the rerun 173923 merged them). **Regressions:** one per fix, inside the retest runs or as separate runs (`regress-C19.py` new); all pass apart from the C19 second-boundary case above. **Harness:** `regress-C19.py`, `repro-M23.py`, `fixes/run-ejabberd-slot2.sh`, `fixes/omemo-on.py`, `MUCSUB_WHOIS`, scenario race fixes. Reports regenerated with main's new FEATURES/matrix code (#27). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
asxpi added 187 commits 2026-11-10 18:41:20 +00:00
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retests #1's fixed bugs on ejabberd from a worktree; the slot 1
and slot 3 runners cd into the main checkout, so this one runs in its
own checkout and passes extra arguments on to the scenario.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 S1 with repro-S1.py on libtacky
develop-65a31465: meeting messages are refused in the OMEMO chat and the
group call invite goes sealed. The decline's clear <reject/> answers a
clear invite, the rule since libtacky 1.2.6 (ad62fa11), not S1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): on libtacky develop-65a31465 message send refuses every
JID RFC 7622 forbids before anything is sent, and upper-case, fullwidth
and final-dot spellings are prepared to ai2b's chat. The rc2 run
20261107-192724 sent them as written.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): forged moderation notices from an occupant, a 1:1
contact or a direct groupchat message store nothing on
develop-65a31465, including the legacy :0 form 1:1 that v1.2.0 still
kept.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 S2: no chat state, receipt request or
markable is left beside the OMEMO 2 ciphertext any more, and the same
run shows them still sent inside the envelope (the regression check).

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
libtacky 1.2.1 answered S3 with an installation setting rather than a
new default, so a retest has to send once with the setting at 0 to see
the opt-out work. A second argument sets it for the send and puts the
old value back; without it the script runs as before.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 S3, partly fixed upstream: with the default
setting a file sent under OMEMO 0.3 still has its SIMS (name, size, type)
beside the ciphertext, now documented; with legacy_file_metadata=0
nothing of the file is outside. The default is what is left.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the stanza that drew invalid-from is not replayed; one
stream error in 45 s and libtacky reconnects once and stays connected,
which also covers the regression check that a real stream error still
reconnects.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): on Bind 2 libtacky reads the post-auth features and each
roster get carries the last push's ver; rc2 sent none.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): with the post-auth features read on Bind 2, subscription
pre-approval works on ejabberd; rc2 refused it as unsupported.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 S4 with the original fake-room scenario: the
1:1 chat keeps its explicit OMEMO choice after a fake join at the
contact's bare JID, and a real room's features are still kept.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the forwarded inner message is qualified by
jabber:client in both directions on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): XEP-0440 rules 4 and 5 are enforced on SASL2 on
develop-65a31465; rc2 authenticated anyway.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 S5 with both original scenarios: inline BoB
data whose bytes do not match the cid is no longer handed to the host,
and matching inline images still are.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): an IQ result over the XEP-0478 limit is answered
policy-violation on develop-65a31465 instead of being dropped.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the happy_eyeballs installation setting reaches the
connection on develop-65a31465; every zone races as configured and the
setting is restored.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the original XEP-0080 scenario still passes everything
geoloc sharing does, with both stop races now won by stop. Its two R16
fails are the scenario's: send_location now goes sealed in slot 3's
OMEMO chat, and slixmpp's message reuses the original run's id.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the Jingle sender accepts the receiver's
session-terminate on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): @id retractions apply and refused ones are not stored as
messages on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 S10: parse_uri now refuses ports and a '?' in
the domain, and keeps an encoded '?' in the localpart, while every valid
link still parses. R11's fails are slot 3's OMEMO, which the original
run switched off by hand.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
XEP-0425, XEP-0166 and XEP-0424 need a person (ai_ok = false), so an
agent's run of them must say confidence = "low"; interop check refused
them without it.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 S11: the export keeps each PEP node's access
model and writes the own vCard as vcard-temp, not as a PEP node; export
and import of everything else pass as before.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): a refused reaction change is reverted on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the slot APIs refuse empty files before asking the
service on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C1: a jinglepub whose from is no JID no
longer loses its message, and the full original scenario shows valid
announcements still landing on their session's row.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): a fake room join at a contact's bare JID no longer
overrides the 1:1 chat's OMEMO choice nor leaves a muc_features row on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C2: on an IBB data error libtacky now closes
the bytestream and ends the session at once, as sender and as
recipient, and plain transfers both ways still complete.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the 1:1 OMEMO choice survives the fake room join and a
restart on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C3: a mention's offsets are now shifted when
XML-forbidden characters are stripped from the body, and the scenario's
other offset rules pass as before.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C4: a reply fallback naming only the subject
no longer swallows the body, and whole-body fallbacks still cover it.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): a user's JID posing as a gateway no longer gets into the
roster, and a forged roster push is answered service-unavailable
instead of left unanswered, on develop-65a31465. Both server rosters
were unchanged by the run.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C5: service notices no longer raise a
notification, while an ordinary message in the same chat still does.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): OTR SMP questions and the ssid are no longer passed
through expr, and the stored body drops the OTR whitespace tag, on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C6: in a room only the room's stanza-id
attaches a caption now, while captions by stanza-id in rooms and by
origin-id in 1:1 chats still fold.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the export writes the own vcard-temp as the user's vCard
child, not an open PEP node, on develop-65a31465. The vCard4 access
half needs an account with a vCard4 item, which ai2a lacks.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): ejabberd removes a forged stanza-id naming our account
before libtacky sees it, so S12's fix can only be shown on Prosody;
this run records that libtacky keeps the server's id.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): parse_uri refuses ports and a decoded '?' in the domain
on develop-65a31465, and valid links, an IPv6 literal included, still
parse.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C7: rejects to invites without an invite id
now name the origin-id, the message id or, in a room, the room's
stanza-id. The full scenario's two fails are by design: the own invite
goes sealed in slot 3's OMEMO chat (S1) and a Dino-shaped invite is
still answered by its invite id, as upstream chose.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): CAPTCHA inline BoB data is checked against its cid and
type on develop-65a31465; a valid image still reaches the host.

Assisted-by: Claude:opus-5-5
The scenario read `roster subscription` right after sign-in. On a
profile with no cached roster (roster get ver='') the server's result
can land after that call, so ai1b (subscription both) was taken for a
stranger and R13 failed with a contact's challenge told as <Challenge>,
which is the right behaviour for a contact (batch 5 on prosody, run
parked). Poll for up to 5 s before deciding the peer is no contact.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): a spans-0 fallback marker can no longer hide arbitrary
text on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C8 and M16: <advanced/> survives every
rewrite, a scoped set now adds the attribute-free fallback, and a
republished bookmark gains no <nick/>. The notify get fails are the
ones upstream ruled not a bug.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): with the stricter fallback strip, the rest of spans-0
still works on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): secrets stay out of sm acks and the XML console on
develop-65a31465, while the console still shows each stanza with the
secret replaced.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C11: numeric-looking node and item ids now
come back from create and publish as given, and the full pubsub
scenario still passes.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): geoloc stop has the last word over a stale republish
after set_allowed on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C13: SIMS <file/> now carries <hash/> and
<desc/>, and the full SIMS scenario still passes.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): an invalid jinglepub from no longer throws away the
message on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C14: album source messages now mark their
url body as the sfs fallback, and the full XEP-0447 scenario passes.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): kept as evidence of a harness flake: slixmpp logged a
message as sent that ejabberd never received, right after its sign-in.
The rerun passed.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C15: an oversized thumbnail is no longer
inlined, a small one still is, and the full thumbnail scenario passes.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): mention offsets follow the characters message send
strips on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): an IBB data error now closes the bytestream at once
instead of a 60 s stall on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C16: disco#info now lists the vCard4
namespace, and the full vCard4 scenario passes.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): a subject-only reply fallback no longer swallows the
body on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): service notices raise no notification on
develop-65a31465, while an ordinary message still does.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C17: disco#info now lists urn:xmpp:eme:0 and
hints for listed protocols go without name=; the full EME scenario
passes.

Assisted-by: Claude:opus-5-5
libtacky 2d82b42d (the M6 fix) asks a post's comments node for
pubsub#itemreply publisher and, when the service refuses the create,
asks again without it (MakeNode drops optional options one by one).
On prosody.asxp.io the pubsub service forbids the create, so the third
attempt carries no itemreply and R3 failed although the behaviour is
the intended one. R3 now wants itemreply on the first create and
allows it missing only on a retry that follows an error answer.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): room captions are folded by the room's stanza-id only on
develop-65a31465, and a correct caption is still applied.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): XEP-0482 rejects carry the ids the XEP asks for on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C18: a fresh microblog node now gets
notify_retract on, and the full microblog scenario passes. Also
corrects an overclaim in the XEP-0380 regression run's notes.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): rewriting the attribute-free notify setting keeps its
<advanced/> on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the full XEP-0492 scenario shows the v1.2.4
attribute-free fallback and M16's kept-absent nick on develop-65a31465.
It still fails R8/R9, notify get ignoring the bookmark setting, which
upstream answered as not a bug in #1 C8 (b).

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
The C19 fix narrowed messagestore's content fallback, so a retest needs
the other side too: a stanza repeated with its @id, an id-less pair (as
direct invitations, which a server does not stamp), and an origin-id
copy must stay one row, while two different @ids are two.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C19: two direct invitations with different
@ids are two rows, while real duplicates are still merged. One run of
the regression check shows id-less copies 15 ms apart split across a
second boundary: IsDuplicate buckets by calendar second, a new minor
finding.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): pubsub create/publish return numeric-looking ids
unaltered on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): SIMS file metadata now carries <hash/> and <desc/> on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): album source messages mark their url body as the sfs
fallback on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C20: forged moderation notices from an
occupant are no longer stored as messages, and the room's genuine
moderation still retracts.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): outgoing inline thumbnails are capped on
develop-65a31465 and small ones are still inlined.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): disco#info advertises vcard-4.0 on develop-65a31465.

Assisted-by: Claude:opus-5-5
Since v1.2.0 libtacky's messages_from_strangers counts someone this
account has written to in a 1:1 chat as no stranger (HANDBOOK). R12
takes ai1b off the roster and expects its invitation dropped, but ai1a
has written to ai1b in every run, so on v1.2.0 and later the invitation
is rightly taken and R12 failed (batch 5 on prosody, run parked). With
own rows in the chat R12 now expects the invitation taken and no
<Blocked>; without them it checks the drop as before.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): disco#info advertises urn:xmpp:eme:0 on
develop-65a31465; the name-free hint needs an OMEMO chat.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C21, partly fixed: the replay loop is gone
and libtacky reconnects, but anotherim-server ends the stream about a
second late, and libtacky drops the last stanza sent instead of the one
the server refused: the forged message is replayed once and three
legitimate iqs are never sent again (iq 168-170 unanswered).

Assisted-by: Claude:opus-5-5
Batch 5 (#24): microblog publish configures notify_retract on a fresh
node on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): IsDuplicate no longer merges two different messages on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
M23 had no run that showed it: the night notes said libtacky's
republish of the own OMEMO 2 device list stripped the labels other
devices wrote, and d99bcf28 keeps a label without a labelsig. The
scenario has a second resource of the account add a device with an
unsigned label, makes libtacky republish (a new own label), checks the
label is kept, reads as none through device_label, and puts the list
and the own label back exactly.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
The run lacks peer-slixmpp.log (repro-M23 opened only an observer of
the under-test account), so interop check refuses it. The scenario is
fixed to open the peer too and the run is redone.

Assisted-by: Claude:opus-5-5
interop check wants peer-slixmpp.log in every slixmpp run; the
scenario only opened an observer of the under-test account, so its
first run was refused. Sign the peer in too (it does nothing).

Assisted-by: Claude:opus-5-5
Batch 5 (#24): adhoc list drops command nodes of a foreign jid on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): message send refuses a thread that is its own parent on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): foreign-namespace attachments are ignored on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): comments nodes ask itemreply publisher and non-xmpp
links stay out of MicroblogPost on develop-65a31465; ejabberd lets the
node be made, so the create is checked for real.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest on libtacky develop of #1 C22: on SASL2/Bind 2 the
post-auth features now count, so roster gets carry ver and pre-approval
works; and of C26: forwarded messages keep jabber:client. The XEP-0297
run turns slot 3's OMEMO for the peer off for its duration and back on,
since sealed forwards cannot be read by slixmpp.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C23: message send now refuses forbidden JID
characters and files case, width and final-dot variants under the
prepared chat.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): story entries carry atom:author on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): RSM count reaches the API for MAM and disco paging on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): a room avatar's vCard is fetched once on join on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C25 on the one server that showed it:
account unregister now answers on anotherim-server's result from the
own full JID, and the removed account does not redial.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): tackyd-json answers its real release and caps node on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): get_invoice checks disco#info for invoice-request before
asking on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the own call-invite row no longer claims joined on
develop-65a31465. The full scenario still fails R7 for the Dino-shaped
room invite, which C7 left as a maintainer decision.

Assisted-by: Claude:opus-5-5
The tag was the run name's last 24 characters, which leave out the
date and time, so every run on a server sent the same
'geo-msg-XEP-0080-slixmpp-prosody' message. ai1a's store kept the one
from 2026-11-07 (same sender, id and body), and since C19's fix
libtacky rightly takes the repeat as a duplicate: R16 then waited in
vain for message <New> (batch 5 on prosody, run parked). Use the whole
run name.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest on libtacky develop of #1 C27: SASL2 now enforces
XEP-0440 rules 4 and 5 against the local fakes while the real server
still binds to tls-exporter; and of C28: an IQ answer over the
XEP-0478 limit becomes a policy-violation error.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): a refused accept_invite takes its autojoin bookmark back
on develop-65a31465; the scenario's own INFO line raced the retract,
the wire shows it.

Assisted-by: Claude:opus-5-5
Batch 5 retest of interop#1 on libtacky develop-65a31465 (65a31465ce16),
headless with #1's method: tackyd-json against slixmpp on prosody, slot 1.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): on develop-65a31465 a replayed older sealed draft is
still dropped without a debug line; upstream's M18 change logs the list
and pte_seal drops but not the per-chat draft path.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 C29: the happy_eyeballs and iap installation
settings now reach the connection (raced targets, pipelined
authentication), and both settings off or unset behave as before.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): a storage import reloads the chat list's tags on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): pep-expiry refuses expiries past year 9999 on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest on libtacky develop of #1 C31 (the Jingle sender
acks the receiver's session-terminate), C32 (a retraction by @id is
applied, refused ones are not stored) and C33 (reactions revert on a
not-acceptable error); the full scenarios pass.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the poll fallback carries <body/> on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): XEP-0511 descriptions apply only to a whole link in the
body on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): bad moves are dropped and live_stopped is set on
develop-65a31465; our other device's correction of a peer's share is
still stored as an outgoing live row, the part of M25 upstream left.

Assisted-by: Claude:opus-5-5
#1 M25's MUC/Sub part is about subscriber rows that carry a nick and
no jid, which a semi-anonymous room gives a non-moderator. The scenario
always made its room non-anonymous, so the retest could not reach it.
MUCSUB_WHOIS=moderators now keeps the room semi-anonymous; the default
stays anyone.

Assisted-by: Claude:opus-5-5
In a semi-anonymous room the subscribers list and the subscribers node
name a subscriber by nick alone, and libtacky now reports such rows with
jid "" (#1 M25). R6 and R9 looked for the bare JID only, so they failed
on the very behaviour the fix brings; with MUCSUB_WHOIS other than
anyone they accept an empty jid with the expected nick.

Assisted-by: Claude:opus-5-5
libtacky 1.2.2 answers C34 by keeping a destroyed room's bookmark with
autojoin cleared, where the interop fix branch removed it. R1 now
accepts either, and the stale autojoin bookmark for R3 is put back
whenever the destroy left none with autojoin on, so the sign-in check
still runs against an autojoin bookmark of the gone room.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest on libtacky develop of #1 C3.1 (a draft with
characters XML cannot carry is cleaned and synced, no bgerror) and C34
(a destroyed room loses its autojoin and is not made again at the next
sign-in). Also corrects three earlier runs' notes: a helper's OMEMO
restore did not reach the synced node until this C34 run, so XEP-0166,
XEP-0424 and XEP-0444 ran with OMEMO off for the peer.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): kept for the record; the FAILs were the scenario
expecting JIDs a semi-anonymous room does not give. The events show
libtacky's M25 fix working.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): nick-only MUC/Sub subscribers of a semi-anonymous room
are kept and told on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): with nick-only rows now kept, the JID-carrying MUC/Sub
path still works on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): drafts with characters XML cannot carry are synced,
without a bgerror, on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): a destroyed room is not recreated by autojoin at the
next sign-in, from our bookmark or another device's, on
develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest on libtacky develop of #1 M1 (no upload slot for
an empty file), M2 (adhoc list drops nodes of a foreign JID) and M3
(thread_parent equal to thread refused); the full scenarios pass.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): OMEMO 2 messages keep their chat state, receipt request
and marker inside the envelope on develop-65a31465, and the EME hint
carries no name.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 M4: an <attachments> item in a foreign
namespace counts as no attachment. The full scenario's one fail is its
own race: the empty <Attachments> after the retract came before it
started waiting.

Assisted-by: Claude:opus-5-5
repro-S1 and repro-S3 need libtacky's OMEMO for the peer on, which
slot 2 keeps off and explicit. The wrapper turns it on for the
scenario and puts the chat's state back after, so the security
retests can run on ejabberd without leaving the slot changed.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): meetings and call invites no longer leave an OMEMO chat
in the clear on develop-65a31465; with no peer devices the call invite
is withheld. The decline FAIL is the documented
answer-as-the-invite-came rule.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 M6: http: comment links are no longer
surfaced and comments nodes ask for itemreply publisher, while xmpp:
links still are; the full scenario passes.

Assisted-by: Claude:opus-5-5
S3 needs the peer to have an OMEMO 0.3 device, and ai2b on ejabberd has
none, so repro-S3 could only report that the file failed to encrypt.
The wrapper has slixmpp publish a scratch DualOmemo device for the run,
switches libtacky's OMEMO for the peer on, runs repro-S3 unchanged and
takes the device and the switch back afterwards.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): ai2b has no OMEMO devices on ejabberd, so the legacy
file send cannot be made; kept to show why repro-S3-scratch exists.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): by default a legacy OMEMO file share still carries its
SIMS metadata beside the ciphertext on develop-65a31465, which is
upstream's chosen default; the opt-out is tested separately.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest on libtacky develop of #1 M7 (story entries carry
atom:author) and M11 (RSM <count> reaches the host for MAM and disco).
The first XEP-0059 run's paging fails were slot 3's OMEMO sealing the
bodies; the rerun with the chat in the clear passes.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): with legacy_file_metadata 0 a legacy OMEMO file share
carries nothing of the file in the clear on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 M13: the tackyd-json build is stamped, with
libtacky's own caps node and its version (1.2.7) in XEP-0092 answers.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 M14: OTR's whitespace tag is taken out of
the stored body, and the real OTR session with slixmpp still passes.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): ejabberd names inviters by real JID so C30 cannot be
shown here, but the mediated decline it changed still reaches the
inviter through the room on develop-65a31465.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 M21: a custom tag restored by a PIE import
is listed at once, and the rest of the round trip passes.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): the iap installation setting reaches the connection on
develop-65a31465; with happy_eyeballs (run 20261110-165552) both C29
settings are now shown live.

Assisted-by: Claude:opus-5-5
Batch 5 (#24) retest of #1 M25's server-dependent part: in a
semi-anonymous room nick-only subscribers are now listed and their
changes told, and a non-anonymous room still gives JIDs.

Assisted-by: Claude:opus-5-5
Batch 5 (#24): with the chat in the clear, meeting messages still go
and are read, so the S1 refusal stays limited to OMEMO chats.

Assisted-by: Claude:opus-5-5
Merge remote-tracking branch 'origin/main' into b5-anotherim
Some checks failed
/ check (pull_request) Failing after 6m56s
920e65f623
# Conflicts:
#	FEATURES.md
ai: repro-M23 drops an unused peer name
All checks were successful
/ check (pull_request) Successful in 6m47s
41ab6df0a1
pyflakes failed the PR check on the unused `_p`: the peer only has to
be signed in for the scenario, nothing reads it.

Assisted-by: Claude:opus-5-5
asxpi merged commit ba63ec0eb0 into main 2026-11-10 18:57:36 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
another-im/interop!28
No description provided.