Repository navigation
Match PennMUSH on the behavioural parity steps (Q2) - #2561
Merged
Merged
Conversation
Fixes, each checked against the reference PennMUSH in tools/parity: - flags() and lflags() with no argument list what list_all_flags lists: sorted by name, never the internal GOING flags. - & refuses an object the executor does not control before reading or writing, with @set's refusal (match_controlled, src/cmds.c:1786). - @suggest/add and /delete answer with PennMUSH's lines. - An unknown function's DID YOU MEAN hint is suggest_name's spellfix1 match at scope 5, shared with suggest() through Common/Spellfix. - loc() and home() write the dbref, never the objid; loc() of a miss is #-1; name(), get() and xget() of a miss are #-1 NO SUCH OBJECT VISIBLE. - inventory shows an item's dbref only when unparse_object would. Harness: - The ulocal() case uses an attribute: PennMUSH takes #lambda only in ulambda(). The median()/mean() case sets null_eq_zero off around itself, as PennMUSH's mush.cnf has it. - The duplicate KD-0011 is KD-0005, and the allowlist refuses an id used twice. Six steps whose only difference is a documented choice are allowlisted with both sides pinned. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rqqt7UANHQ73A3Wsib6mkh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rqqt7UANHQ73A3Wsib6mkh
Contributor
|
Warning Review limit reached
This review includes 41 billable files and costs up to $10.25.
Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing. Or wait 25 minutes for your next included review. View limit details
|
loc() now answers #N as PennMUSH does, so assertions that matched an objid read objid(loc(...)), and the guide's smile() example expects the CNAME suggestion PennMUSH gives. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rqqt7UANHQ73A3Wsib6mkh
loc() answers with the bare dbref, so the scene package's co-location tests compare objid(loc(%#)) against scene(<id>,room). Without it a web-composed pose never reached the room and +scene/ooc skipped the room's Speech lock. Scene package 1.19.1. spellfix's phonetic hash applies its KN/GN, WR, DJ/DG and TCH rules to lower-case letters only, and an unknown function's name is upper-cased before the DID YOU MEAN lookup, as PennMUSH does: soundex(KNIGHT,phone) is CMACD. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rqqt7UANHQ73A3Wsib6mkh
The handler already reads every location through num(). room-contents 1.3.1; the index carries it and scene 1.19.1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rqqt7UANHQ73A3Wsib6mkh
HarryCordewener
marked this pull request as ready for review
November 6, 2026 20:11
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
HarryCordewener
pushed a commit
that referenced
this pull request
Nov 6, 2026
The parity baseline keeps main's three remaining steps after #2561. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rqqt7Uw1NrPpHW2neUJepv
HarryCordewener
pushed a commit
that referenced
this pull request
Nov 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Grave · project thread
1.0 readiness workstream Q2 (audit-refinement.md §3): the behavioural steps in
tools/parity/baseline.jsonand the KD id hygiene inknown-differences.json. Every change was checked against a reference PennMUSH built from upstream withtools/parity/patchesapplied.Engine fixes
flags()/lflags()with no argument now followlist_all_flags: sorted by name, with internal GOING flags left out. They shareFlagListHelperswith@list flags.&on an object the executor does not control is refused before anything is read or written, with@set's refusal (match_controlled, src/cmds.c:1786). Before, it fell through to the attribute writer's#-1 NO PERMISSION TO SET ATTRIBUTE.@suggest/addand/deleteprint PennMUSH'sSuggestion vocabulary word added./deleted.DID YOU MEANhint is now PennMUSH'ssuggest_name: one spellfix1 match at scope 5. The spellfix1 code moved fromStringDistanceFunctionstoCommon/Spellfix.cs, sosuggest()and the hint share it.nosuchfunctionnow suggestsMESSAGEandupcstrsuggests nothing, as in PennMUSH.phoneticHash, src/spellfix.c:204). An unknown function's name is upper-cased before the hint looks it up (src/parse.c:2782).soundex(KNIGHT,phone)isCMACD, as in PennMUSH.loc()andhome()return the dbref, not the objid (safe_dbref).loc()of a miss returns#-1.name(),get()andxget()of a miss return#-1 NO SUCH OBJECT VISIBLE.inventoryshows an item's dbref only whenunparse_objectwould: examine, link-to, JUMP_OK, CHOWN_OK or DESTROY_OK.Softcode that compared
loc()with an objidobjid(loc(%#))withscene(<id>,room), which is still an objid. Without this, a pose composed on the web never reached the room, and+scene/oocskipped the room's Speech lock.WebComposeOoc_InTheScenesRoom_HonoursItsSpeechLockfails without the fix.WebCompose_EmitsToTheRoom_WhenThePoserIsStandingInItalso fails without it.num().loc()both before and after this PR.Harness
sc.control: theulocal()case now uses an attribute. PennMUSH accepts#lambdaonly inulambda()(src/funufun.c:219), so the old step tested that rule and not register scoping.ff.numeric:median()/mean()now run withnull_eq_zerooff, then restore it. PennMUSH's mush.cnf ships it off; SharpMUSH's documented default is on.sc.errors: a new step covers the case-sensitive hash.The second
KD-0011is nowKD-0005.load_allowlistrefuses an id used twice, with a unit test.New pinned entries KD-0043 to KD-0048, each under an existing A choice. profile heading:
&refusal reason (two entries);look Gadgetafter the restricted@destroy(follows KD-0005);Sof SCENE_ROOM inflags();@purge/confirmand deposit lines indbref.holes.The economy and SharpMUSH-only-flags profile entries now mention these.
Baseline: 74 → 60 entries. 8 steps now match outright, and 6 are allowlisted with both sides pinned.
Left in the baseline
admin.wizard#3(examine *Alice) has several unrelated differences:Last modified/Quotalines vsRQUOTA;LASTPAGER;127.0.0.1:<port>vslocalhost. This is the connection host, which belongs to Q1.admin.search#2(@stats): SharpMUSH's world has its own system and package objects (8 things, 1 player). It needs a decision: add a profile entry, or change the case.dc.colours#2(decompose(ansi(+red,x))): MarkupString'sAnsiColorhas no named-colour case, so the name is lost before decompose sees it. It needs a MarkupString change.Also noticed, not changed:
u()andulocal()accept#lambda, which PennMUSH accepts only inulambda(). No package relies on it.Testing
python3 -m unittest discover -s tools/parity/tests: 51 pass.tools/parity/run.sh --baseline, run after the last engine change: 871 match, 48 known differences, 60 open gaps, 0 new differences. The one ERROR is75-http. The reference PennMUSH in this container answers@httpwith "Command disabled.", so it is an environment issue.Generated by Claude Code