Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
193 commits
Select commit Hold shift + click to select a range
ac4406b
docs: design Connect Share Fabric mod
robinbraemer Jul 30, 2026
69e66b6
docs: persist Connect Share endpoint identity
robinbraemer Jul 30, 2026
a2c2038
docs: support imported and offline Share identities
robinbraemer Jul 30, 2026
c7d14cb
docs: plan Connect Share singleplayer ingress
robinbraemer Jul 30, 2026
6a60411
build: add multi-version Fabric Share modules
robinbraemer Jul 30, 2026
f7b68cf
refactor: share endpoint token persistence
robinbraemer Jul 30, 2026
8bebb2b
feat: persist and import Share endpoint identities
robinbraemer Jul 30, 2026
4662111
feat: add Share host admission policy
robinbraemer Jul 30, 2026
fba5629
feat: gate Connect sessions before tunneling
robinbraemer Jul 30, 2026
a3d5f5d
feat: add Connect Share lifecycle
robinbraemer Jul 30, 2026
96a725e
feat: add embedded Fabric Connect ingress
robinbraemer Jul 30, 2026
1650a2d
feat: bridge Connect into 1.21.11 singleplayer
robinbraemer Jul 30, 2026
c6adf4f
feat: bridge Connect into 26.2 singleplayer
robinbraemer Jul 30, 2026
475a800
feat: add Connect Share host UI
robinbraemer Jul 30, 2026
1f76ea6
build: isolate Connect Share networking runtime
robinbraemer Jul 30, 2026
fba5afd
ci: verify Connect Share Fabric artifacts
robinbraemer Jul 30, 2026
b00b02d
docs: plan Connect Share direct P2P
robinbraemer Jul 30, 2026
bab67d3
feat: add isolated Connect Share direct transport
robinbraemer Jul 30, 2026
3507448
feat: complete Connect Share direct joining
robinbraemer Jul 30, 2026
a5fe9e6
feat: show Connect Share admission routes
robinbraemer Jul 30, 2026
028bf24
docs: document direct share acceptance
robinbraemer Jul 30, 2026
23d4ad4
fix: package direct runtime in isolated payload
robinbraemer Jul 30, 2026
9f7c5dd
chore: ignore Fabric run state
robinbraemer Jul 30, 2026
865a3f0
fix(share): isolate fastutil from Minecraft
robinbraemer Jul 30, 2026
d9b60e8
fix(share): preserve Mojang Guava ABI
robinbraemer Jul 30, 2026
f3a98ce
docs(share): design pasted LAN invitation matching
robinbraemer Jul 30, 2026
2d70ceb
Merge remote-tracking branch 'origin/main' into codex/connect-share-mod
robinbraemer Jul 30, 2026
339afae
docs(share): plan pasted LAN invitation fix
robinbraemer Jul 30, 2026
bf12213
fix(share): prefer discovered LAN route for pasted invites
robinbraemer Jul 30, 2026
f54e3b3
Merge remote-tracking branch 'origin/main' into codex/connect-share-mod
robinbraemer Jul 30, 2026
4f9c55e
Merge remote-tracking branch 'origin/main' into codex/connect-share-mod
robinbraemer Jul 30, 2026
0e560ef
feat(share): persist direct peer identity across worlds
robinbraemer Jul 30, 2026
669e996
feat(share): persist friend access across worlds
robinbraemer Jul 30, 2026
a0a635e
feat(share): add persistent friend sharing
robinbraemer Jul 30, 2026
5d8ae0f
fix(share): repair friend removal and link access
robinbraemer Jul 31, 2026
f57b1fd
feat(share): add mutual friend requests
robinbraemer Jul 31, 2026
a0fe263
fix(share): send friend requests remotely
robinbraemer Jul 31, 2026
f51c919
fix(share): deliver friend requests without joining
robinbraemer Jul 31, 2026
ddb43e0
fix(share): keep friend transports reachable from title
robinbraemer Jul 31, 2026
9ed2b51
fix(share): pair friends over libp2p only
robinbraemer Jul 31, 2026
3621a06
fix(share): make libp2p friend discovery reliable
robinbraemer Jul 31, 2026
6082723
feat(share): sync friend activity and removals
robinbraemer Jul 31, 2026
323c1e7
feat(share): request joins to friends worlds
robinbraemer Jul 31, 2026
fc751a6
docs(share): design Prism E2E skill
robinbraemer Jul 31, 2026
8e1c3b3
docs(share): add Prism E2E agent skill
robinbraemer Jul 31, 2026
51af5b7
no-mistakes(review): Fix Connect Share review findings
Jul 31, 2026
07616b1
no-mistakes(test): Fixed ShareViewModel scheduler setup; focused reru…
Jul 31, 2026
5512664
no-mistakes(test): Fix Fabric 26.2 LAN redirect overload; focused tes…
Jul 31, 2026
767ee82
no-mistakes(document): Refreshed Connect Share docs and cleared white…
Jul 31, 2026
501f436
no-mistakes: apply CI fixes
Jul 31, 2026
001efe7
feat(share): complete universal party experience
robinbraemer Aug 1, 2026
c0328b6
no-mistakes(review): Hardened admission, cleanup, renewal, and loader…
Aug 1, 2026
2db157c
no-mistakes(document): Corrected Share matrix and Java toolchain docs
Aug 1, 2026
47228e4
no-mistakes: apply CI fixes
Aug 1, 2026
eefdf0e
fix(share): close social authorization gaps
robinbraemer Aug 1, 2026
efc1ad1
no-mistakes(review): Closed direct-route, privacy, convergence, and p…
Aug 1, 2026
69dee82
no-mistakes(document): Updated Share docs and cleared lint
Aug 1, 2026
42d4498
no-mistakes(review): Fix Share consent, convergence, and wire compati…
Aug 1, 2026
425bf4b
no-mistakes(document): Updated Share docs and normalized imports
Aug 2, 2026
8d200e2
no-mistakes(review): Persisted internet consent across all Fabric fri…
Aug 2, 2026
59c33e4
no-mistakes(document): Corrected Connect Share docs and acceptance paths
Aug 2, 2026
f8caee7
feat(share): deliver polished social UX
robinbraemer Aug 2, 2026
ca865d1
no-mistakes(review): Preserve Share privacy, recovery, localization, …
Aug 2, 2026
e0d786f
no-mistakes(document): Consolidate Share docs and correct E2E guidance
Aug 2, 2026
3b213aa
no-mistakes(document): Correct Share docs and E2E guidance
Aug 2, 2026
4131159
fix(share): enforce private presence boundaries
robinbraemer Aug 2, 2026
f763787
fix(share): keep visible status routes usable
robinbraemer Aug 2, 2026
3e8d686
no-mistakes(review): Hardened release, invitation, and identity lifec…
Aug 2, 2026
1bb3cb5
no-mistakes(test): Conditioned status probing on visible world privacy
Aug 2, 2026
ac826aa
no-mistakes(document): Aligned E2E status guidance with privacy
Aug 2, 2026
d60acaf
fix(share): preserve friend routes across world discovery
robinbraemer Aug 2, 2026
9f87507
no-mistakes(review): Hardened concurrent discovery, mDNS refresh, and…
Aug 2, 2026
8444030
no-mistakes(document): Consolidated Share docs; no lint issues remain
Aug 2, 2026
9b043d3
test(share): preserve rotated join evidence
robinbraemer Aug 2, 2026
6073f2f
no-mistakes(document): Aligned Prism two-client evidence guidance
Aug 2, 2026
2186642
docs(share): map universal party acceptance evidence
robinbraemer Aug 2, 2026
9397658
fix(share): make joins and follow cancellation actionable
robinbraemer Aug 2, 2026
1aa421a
docs(share): record foundation gap fixes
robinbraemer Aug 2, 2026
73f306f
fix(share): preserve actionable no-mod admission errors
robinbraemer Aug 2, 2026
9805031
test(share): record exact-head Prism evidence
robinbraemer Aug 2, 2026
350980f
feat(share): add encrypted social recovery archive
robinbraemer Aug 2, 2026
1586cb6
feat(share): add safe friend backup UX
robinbraemer Aug 2, 2026
fc496fd
build(share): reduce packaged runtime size safely
robinbraemer Aug 2, 2026
81ac77b
docs(share): record distribution artifact evidence
robinbraemer Aug 2, 2026
4c9e3b6
test(share): record clean-head friend join proof
robinbraemer Aug 2, 2026
20e439b
docs(share): define rollout and operations gates
robinbraemer Aug 2, 2026
9a0c947
ci(share): attest release artifacts
robinbraemer Aug 2, 2026
11b02f5
docs(share): close repository operations checklist
robinbraemer Aug 2, 2026
41e5989
fix(share): surface safe admission denials
robinbraemer Aug 3, 2026
78745ce
fix(share): harden join authorization grants
robinbraemer Aug 3, 2026
d993635
test(share): drive a real Connect fallback join
robinbraemer Aug 3, 2026
bd72ea0
docs(share): record fallback and admission evidence
robinbraemer Aug 3, 2026
c7c7748
docs(share): record vanilla join proof
robinbraemer Aug 3, 2026
b4dfbb7
feat(bedrock): consume signed principal v2 (#129)
robinbraemer Aug 3, 2026
5e50604
chore(main): release 0.15.0
github-actions[bot] Aug 3, 2026
569796a
Merge pull request #130 from minekube/release-please--branches--main-…
github-actions[bot] Aug 3, 2026
32755bc
docs: design Connect Share Fabric mod
robinbraemer Jul 30, 2026
9248eed
docs: persist Connect Share endpoint identity
robinbraemer Jul 30, 2026
0e60133
docs: support imported and offline Share identities
robinbraemer Jul 30, 2026
734b0fd
docs: plan Connect Share singleplayer ingress
robinbraemer Jul 30, 2026
0358b00
build: add multi-version Fabric Share modules
robinbraemer Jul 30, 2026
8547fc5
refactor: share endpoint token persistence
robinbraemer Jul 30, 2026
cfcc5b1
feat: persist and import Share endpoint identities
robinbraemer Jul 30, 2026
020b019
feat: add Share host admission policy
robinbraemer Jul 30, 2026
6bdb13b
feat: gate Connect sessions before tunneling
robinbraemer Jul 30, 2026
874e0b8
feat: add Connect Share lifecycle
robinbraemer Jul 30, 2026
54ff956
feat: add embedded Fabric Connect ingress
robinbraemer Jul 30, 2026
45c6440
feat: bridge Connect into 1.21.11 singleplayer
robinbraemer Jul 30, 2026
533feec
feat: bridge Connect into 26.2 singleplayer
robinbraemer Jul 30, 2026
40921a7
feat: add Connect Share host UI
robinbraemer Jul 30, 2026
346a33f
build: isolate Connect Share networking runtime
robinbraemer Jul 30, 2026
3759769
ci: verify Connect Share Fabric artifacts
robinbraemer Jul 30, 2026
7c29af6
docs: plan Connect Share direct P2P
robinbraemer Jul 30, 2026
779ff9c
feat: add isolated Connect Share direct transport
robinbraemer Jul 30, 2026
ed69e71
feat: complete Connect Share direct joining
robinbraemer Jul 30, 2026
f79dcd2
feat: show Connect Share admission routes
robinbraemer Jul 30, 2026
978cc63
docs: document direct share acceptance
robinbraemer Jul 30, 2026
4253777
fix: package direct runtime in isolated payload
robinbraemer Jul 30, 2026
0248648
chore: ignore Fabric run state
robinbraemer Jul 30, 2026
4f4ab2d
fix(share): isolate fastutil from Minecraft
robinbraemer Jul 30, 2026
c268c01
fix(share): preserve Mojang Guava ABI
robinbraemer Jul 30, 2026
5343284
docs(share): design pasted LAN invitation matching
robinbraemer Jul 30, 2026
e80c854
docs(share): plan pasted LAN invitation fix
robinbraemer Jul 30, 2026
00207d5
fix(share): prefer discovered LAN route for pasted invites
robinbraemer Jul 30, 2026
9613c60
feat(share): persist direct peer identity across worlds
robinbraemer Jul 30, 2026
a0482e7
feat(share): persist friend access across worlds
robinbraemer Jul 30, 2026
5e5fe55
feat(share): add persistent friend sharing
robinbraemer Jul 30, 2026
23d6906
fix(share): repair friend removal and link access
robinbraemer Jul 31, 2026
3b7687e
feat(share): add mutual friend requests
robinbraemer Jul 31, 2026
90305a6
fix(share): send friend requests remotely
robinbraemer Jul 31, 2026
38a3eea
fix(share): deliver friend requests without joining
robinbraemer Jul 31, 2026
1c48de2
fix(share): keep friend transports reachable from title
robinbraemer Jul 31, 2026
df4f613
fix(share): pair friends over libp2p only
robinbraemer Jul 31, 2026
ca90ad8
fix(share): make libp2p friend discovery reliable
robinbraemer Jul 31, 2026
b5e9e86
feat(share): sync friend activity and removals
robinbraemer Jul 31, 2026
8e5ad6f
feat(share): request joins to friends worlds
robinbraemer Jul 31, 2026
e831b8a
docs(share): design Prism E2E skill
robinbraemer Jul 31, 2026
7d8cb3a
docs(share): add Prism E2E agent skill
robinbraemer Jul 31, 2026
4118768
no-mistakes(review): Fix Connect Share review findings
Jul 31, 2026
87e9cb3
no-mistakes(test): Fixed ShareViewModel scheduler setup; focused reru…
Jul 31, 2026
87ea27a
no-mistakes(test): Fix Fabric 26.2 LAN redirect overload; focused tes…
Jul 31, 2026
5190ac5
no-mistakes(document): Refreshed Connect Share docs and cleared white…
Jul 31, 2026
ef3a78a
no-mistakes: apply CI fixes
Jul 31, 2026
2339c8c
feat(share): complete universal party experience
robinbraemer Aug 1, 2026
cf195e8
no-mistakes(review): Hardened admission, cleanup, renewal, and loader…
Aug 1, 2026
9ebbcee
no-mistakes(document): Corrected Share matrix and Java toolchain docs
Aug 1, 2026
c5cf91e
no-mistakes: apply CI fixes
Aug 1, 2026
e340ae0
fix(share): close social authorization gaps
robinbraemer Aug 1, 2026
a20b6f0
no-mistakes(review): Closed direct-route, privacy, convergence, and p…
Aug 1, 2026
2e11798
no-mistakes(document): Updated Share docs and cleared lint
Aug 1, 2026
d26548c
no-mistakes(review): Fix Share consent, convergence, and wire compati…
Aug 1, 2026
8c92440
no-mistakes(document): Updated Share docs and normalized imports
Aug 2, 2026
6a2d5d8
no-mistakes(review): Persisted internet consent across all Fabric fri…
Aug 2, 2026
d98745e
no-mistakes(document): Corrected Connect Share docs and acceptance paths
Aug 2, 2026
781de21
feat(share): deliver polished social UX
robinbraemer Aug 2, 2026
9ff07d5
no-mistakes(review): Preserve Share privacy, recovery, localization, …
Aug 2, 2026
584324f
no-mistakes(document): Consolidate Share docs and correct E2E guidance
Aug 2, 2026
aa3e87a
no-mistakes(document): Correct Share docs and E2E guidance
Aug 2, 2026
5a523f8
fix(share): enforce private presence boundaries
robinbraemer Aug 2, 2026
2d8fe0c
fix(share): keep visible status routes usable
robinbraemer Aug 2, 2026
0207812
no-mistakes(review): Hardened release, invitation, and identity lifec…
Aug 2, 2026
39fe69e
no-mistakes(test): Conditioned status probing on visible world privacy
Aug 2, 2026
7465c69
no-mistakes(document): Aligned E2E status guidance with privacy
Aug 2, 2026
59098e5
fix(share): preserve friend routes across world discovery
robinbraemer Aug 2, 2026
d7f2fdb
no-mistakes(review): Hardened concurrent discovery, mDNS refresh, and…
Aug 2, 2026
3806ff9
no-mistakes(document): Consolidated Share docs; no lint issues remain
Aug 2, 2026
d844191
test(share): preserve rotated join evidence
robinbraemer Aug 2, 2026
ba4614f
no-mistakes(document): Aligned Prism two-client evidence guidance
Aug 2, 2026
dc14729
docs(share): map universal party acceptance evidence
robinbraemer Aug 2, 2026
bad737b
fix(share): make joins and follow cancellation actionable
robinbraemer Aug 2, 2026
8b72a5c
docs(share): record foundation gap fixes
robinbraemer Aug 2, 2026
32cc684
fix(share): preserve actionable no-mod admission errors
robinbraemer Aug 2, 2026
f35c55f
test(share): record exact-head Prism evidence
robinbraemer Aug 2, 2026
10baccb
feat(share): add encrypted social recovery archive
robinbraemer Aug 2, 2026
e63d919
feat(share): add safe friend backup UX
robinbraemer Aug 2, 2026
f1cc4b7
build(share): reduce packaged runtime size safely
robinbraemer Aug 2, 2026
d4cfeae
docs(share): record distribution artifact evidence
robinbraemer Aug 2, 2026
e9d13e0
test(share): record clean-head friend join proof
robinbraemer Aug 2, 2026
419c0d8
docs(share): define rollout and operations gates
robinbraemer Aug 2, 2026
9671e3d
ci(share): attest release artifacts
robinbraemer Aug 2, 2026
9f899b5
docs(share): close repository operations checklist
robinbraemer Aug 2, 2026
d1d6f5e
fix(share): surface safe admission denials
robinbraemer Aug 3, 2026
756b3ea
fix(share): harden join authorization grants
robinbraemer Aug 3, 2026
a4d607e
test(share): drive a real Connect fallback join
robinbraemer Aug 3, 2026
ee31203
docs(share): record fallback and admission evidence
robinbraemer Aug 3, 2026
78b9450
docs(share): record vanilla join proof
robinbraemer Aug 3, 2026
a553ec3
fix(share): isolate friend forms and safe menu focus
robinbraemer Aug 3, 2026
194b854
fix(share): stabilize Java 17 direct transfers
robinbraemer Aug 3, 2026
4663efe
fix(share): preserve loader networking contracts
robinbraemer Aug 3, 2026
3295dfa
docs(share): record final adapter product matrix
robinbraemer Aug 3, 2026
9bf95a2
chore: reconcile Connect Share PR history
robinbraemer Aug 3, 2026
da36bd2
no-mistakes(document): fix stale Share doc facts, UI labels, em dashes
Aug 3, 2026
d53c352
no-mistakes(document): consolidate Share E2E doc into invariants and …
Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
247 changes: 247 additions & 0 deletions .agents/skills/connect-share-prism-e2e/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,247 @@
---
name: connect-share-prism-e2e
description: Drive and diagnose Connect Share with two real Prism Launcher clients. Use for installing a local Connect Share Fabric build, launching distinct host and guest identities, verifying confirmed-friend presence and singleplayer join approval, testing libp2p-direct versus Connect fallback routes, debugging Minecraft status or login failures, or preserving new reusable Connect Share E2E knowledge.
---

# Connect Share Prism E2E

Use the repository's opt-in live harness to prove the complete friend-to-world
flow. Treat discovery, activity, privacy-permitted status, approval, and
Minecraft login as separate gates; success at an earlier gate never proves a
later one.

The commands below use Fabric 26.2 as the reference target. For another
supported loader/version artifact, preserve the same evidence gates and follow
`docs/connect-share-testing.md` for the complete matrix and loader-specific
packaging steps.

## Prepare safely

1. Read the root `AGENTS.md` and `share/AGENTS.md` completely.
2. Work in the active isolated Connect Share worktree. Never modify a separate
active/root worktree or discard user changes.
3. Inspect the current branch, diff, Prism instances, saved friend stores, and
running Minecraft processes before relying on earlier session notes.
4. Run only one Gradle invocation in a worktree at a time. Concurrent test tasks
corrupt their shared `build/test-results` state.
5. Keep profile paths, endpoint tokens, capabilities, account identifiers, and
friend cards out of committed files and tool summaries.

## Build and install

Build the current 26.2 artifact:

```sh
./gradlew :share:fabric-26-2:connectShareJar --no-parallel
```

Locate the final unclassified JAR under `share/fabric-26.2/build/libs/`. Install
that exact artifact into both instances' `minecraft/mods/` directories. Remove
or replace older Connect Share JARs so each instance loads exactly one. Compare
SHA-256 digests for the build output and both installed copies.

Match replacement JARs by basename at the immediate `mods/` level. Never run a
`connect-share-*.jar` regex against the full absolute path: these test instance
directory names also contain `connect-share`, so a greedy match can remove
Fabric API, Fabric Language Kotlin, or Kotlin for Forge along with the mod.

Confirm each fresh `latest.log` contains both Fabric Loader startup and a
`connect-share` mod entry. Fabric Language Kotlin is declared as a mod
dependency; do not infer a successful load merely from the file being present.

## Launch the two identities

Use Prism's command-line controls; do not automate Minecraft UI clicks:

```sh
prismlauncher --launch <host-instance> --profile <host-account> \
--world <world-name> --show-window

prismlauncher --launch <guest-instance> --offline <guest-name> \
--server 127.0.0.1:<e2e-port> --show-window
```

`--offline <name>` is authoritative for the guest. Do not edit
`InstanceAccountId` while Prism is running because Prism rewrites it.

Wait until the host log records its local player joining and `Connect Share
friend gateway is ready`. The integrated server object exists before the local
client connection is ready; the mod must publish only when both exist and must
advertise `HOSTING_WORLD` only from an actual `ShareState.Sharing`.

Do not treat a matching JVM PID as launch success. Snapshot `latest.log` before
launch and require both a newer mtime and the expected world/runtime markers.
Prism can otherwise leave an old JVM occupying the instance while its log no
longer advances. Resolve exactly one process by the instance's working
directory before stopping it; never terminate Java processes by name alone.

## Run the opt-in live harness

The executable harness is
`share/fabric-common/src/test/kotlin/com/minekube/connect/share/fabric/PrismFriendJoinE2ETest.kt`.
Start it after the host world is ready:

```sh
LIVE_DATA=<guest-config/minekube-connect-share> \
LIVE_TARGET_FILE=<fresh-temporary-target-file> \
LIVE_HOST_LOG=<host-minecraft/logs/latest.log> \
LIVE_GUEST_LOG=<guest-minecraft/logs/latest.log> \
LIVE_PLAYER_NAME=<guest-name> \
./gradlew :share:fabric-common:test \
--tests '*PrismFriendJoinE2ETest*' --rerun-tasks --no-parallel
```

The harness keeps its pre-launch log snapshot immutable across Prism's
`latest.log` rotation. Keep `LIVE_GUEST_LOG` pointed at that active path: a new
or replaced log containing an advancement line is post-launch evidence and
must not be absorbed into a later baseline before the poll observes it.

The test must remain running while the external guest uses the join target
written to `LIVE_TARGET_FILE` (`LIVE_PORT_FILE` remains a direct-only
compatibility alias). Set `LIVE_FORCE_CONNECT_FALLBACK=true` to close the
guest's direct node after authenticated approval while retaining the
discovered LAN route; the real direct attempt must then fail, the harness must
assert a Connect target, and the client must complete a real login rather than
merely emit a selector message. It proves, in order:

1. mDNS discovers the saved confirmed friend's peer identity.
2. Authenticated friend control reports `HOSTING_WORLD`.
3. When the host exposes its world name, a dedicated direct proxy answers a
real Minecraft status probe; otherwise privacy-filtered activity remains the
authority and raw status is intentionally skipped.
4. The libp2p friend join request reaches the host and is approved.
5. A fresh gameplay proxy is opened.
6. A real guest login causes a new `<guest> joined the game` host-log line and
a new `Loaded ... advancements` guest-log line before the gameplay proxy is
released.

The current `DirectP2pProxy` is one-shot. A status probe consumes its target;
always use a different proxy for gameplay and keep the gameplay target alive
until login completes.

## Verify the player-facing UX

Treat visual QA as a keyboard-only Prism test, not as a source review:

1. Open every Connect Share state with Tab, Shift-Tab, Enter, and Escape. Widget
insertion order is Minecraft's focus order, so verify both directions and
keep the primary action reachable before secondary or destructive actions.
2. Capture the Minecraft window at its normal size, then resize it to 640x400
points and capture the same dense states again. On macOS, read the Java
window's position and size through System Events, then pass those point
coordinates to `screencapture -R`; Retina output is expected to have twice
the pixel dimensions.
3. Inspect title, pause, Friends, add-link, manage, Privacy, setup (collapsed and
expanded), active status, compatibility, blocked-list, and endpoint states.
Require visible hierarchy, non-overlapping footers, readable translated
copy, consistent Back/Escape behavior, and exactly one obvious primary
action.
4. Give every `EditBox` a persistent nearby label. Minecraft hides an empty
field's hint while the field is focused, so a hint alone becomes a blank
white rectangle during the most important input moment.
5. Keep a split vanilla pause-menu row at 100 + 4 + 100 logical pixels and use
short labels that fit each half. Keep title-menu affordances compact and
live-update request/readiness counts without covering the panorama.
6. Exercise Manage → Back → Add from link. The new-request form must be empty
and use safe connection defaults; an existing friend's name or advanced
route choices must never leak into another relationship draft. The one
exception is Add → Connection options → Done, which preserves the active
draft. On the pause menu, tab order must reach Share and Friends before Save
and Quit even though the vanilla disconnect button was created first.

Screenshot appearance is evidence, not a golden test. Keep deterministic
layout and presentation decisions in pure Kotlin tests so visual fixes remain
portable across every loader and supported Minecraft API.

For no-click automation, temporarily enable automatic joining only for the
already confirmed test friend. Restore `canJoinAutomatically` to `false` and
restart the host after the run. A deterministic test must separately cover the
normal pending request, host approval, and one-shot admission path.

A vanilla no-mod Connect client does not carry the signed direct peer proof
used by the friend-control path. If its authenticated Connect UUID does not
match the stored offline friend UUID, auto-accept must fail closed and create a
normal pending admission. Do not relax that security boundary for automation.
For an unattended local proof, a temporary uncommitted attach driver may call
the installed `ShareViewModel` only after asserting exactly one pending request,
then invoke the existing `allow` action. Report only boolean/stage results;
never print the identity or request ID, never add a production test bypass, and
delete the driver after restoring the original policy.

## Diagnose by gate

- **Mod load:** inspect both fresh logs for the exact version and startup error.
- **Discovery:** use `dns-sd -B _minekube-connect-share._tcp local`; expect both
persistent peer IDs. mDNS presence does not prove friend authentication.
Apply the route-retention and mDNS-refresh invariant in `share/AGENTS.md`
before interpreting discovery order or address changes.
- **Runtime readiness:** use `jcmd <host-pid> GC.class_histogram` to look for
`ShareState$Sharing`, `ActiveTransport`, `PublishedVanillaTransport`, and
`ShareCoordinator$ActiveShare` when ordinary logs are insufficient.
- **Activity/privacy:** query through the saved friend relationship. Pending or
unknown peers must not receive presence or world details.
- **Status:** open its own target only when the host exposes online, playing,
and current-world details. The gateway intentionally closes status otherwise;
use authenticated activity plus a real approved login as the privacy-safe
proof. A Connect endpoint fallback status or public DNS response does not
prove the integrated world is reachable.
- **Login:** require both a guest `Loaded ... advancements` line and a host
`<guest> joined the game` line.

Recognize these established failure signatures:

- Publishing from only `hasSingleplayerServer()` can race a null Minecraft
client connection. Require the integrated server and client connection.
- Installing Minecraft's captured Netty initializer after socket activation
requires replaying `channelActive` to the late handlers before the first
Minecraft bytes. Keep the focused gateway lifecycle test.
- `Invalid session` for an explicitly offline libp2p guest means vanilla Mojang
authentication ran too early. Create Minecraft's standard offline profile in
`handleHello`; never downgrade an `ONLINE` direct session.
- A Java 17 guest that reaches server login, immediately disconnects, and makes
the host flood Yamux `IllegalReferenceCountException`/freed-buffer warnings
has crossed every control-plane gate but failed gameplay transport. Preserve
the multi-window `DirectP2pNodeTest` regression and use jvm-libp2p's tested
Mplex default; do not retry or hide the post-login disconnect.
- A Forge guest that reaches login and receives `Unexpected custom data from
client` or `Illegal packet received, terminating connection` without muxer
errors has failed loader negotiation or thread-side classification. The
always-on Share gateway must run Minecraft handlers on a Forge
logical-server thread group, and approved offline admission must enter
Forge's native `NEGOTIATING` state instead of calling accepted-login early.
A passing proof logs the guest's modded-server handshake, server join, and
guest advancements with none of those rejection lines.
- A host `lost connection: Disconnected` line alone is incomplete evidence.
Inspect the guest log or screen and whether the owner of the one-shot proxy
closed it.
- A vanilla Connect guest showing only `Timed out` after the host approval
window means the control-plane admission deadline collided with Minecraft's
own connection timeout. Keep the Connect session decision shorter than the
vanilla deadline, cancel its pending admission when that budget expires, and
require the guest log to contain the actionable denial rather than treating
generic timeout as acceptable evidence.

For recovery product proof, stop sharing and close the source profile before
export/import. Use disposable profile copies, compare only expected file hashes
or redacted relationship counts, and never print the backup path, password,
archive bytes, private identities, friend capabilities, or endpoint token.
Verify wrong-password and one-byte-damaged imports leave every live allowlisted
file hash unchanged. Never launch the source and restored copy simultaneously:
an offline backup transfers one stable identity and is not multi-device sync.

## Finish and retain knowledge

Run focused regression tests first, then:

```sh
./gradlew clean build --no-parallel
```

Before claiming completion, confirm the worktree is clean or intentionally
changed, installed JAR digests match, temporary auto-approval is restored, and
both intended Prism profiles are in a safe state.

When a live run reveals a stable, non-obvious rule, update this skill and the
appropriate concise invariant in `share/AGENTS.md`. Record commands, gates,
failure signatures, and authoritative files - not transient PIDs, ports, local
absolute paths, endpoint secrets, or raw debugging noise.
4 changes: 4 additions & 0 deletions .agents/skills/connect-share-prism-e2e/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Connect Share Prism E2E"
short_description: "Drive and diagnose two-client Prism join tests"
default_prompt: "Use $connect-share-prism-e2e to run and diagnose the Connect Share two-client Prism E2E."
Loading
Loading