diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md index 8d6df28..62f6864 100644 --- a/AGRARIAN_DEVELOPMENT_ROADMAP.md +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -890,7 +890,7 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe - [x] Define when deeper questions should matter: quality improvements, safer work, complex crafting, teaching others, and advanced branches. Added deeper-question timing rules to `Docs/KnowledgeAndSkillFoundation.md`, keeping advanced checks out of the first survival loop while tying them to quality improvements, safer work, complex crafting, teaching others, and advanced branches. - [x] Add design notes for avoiding exploit farming and rote memorization. Added exploit and rote-memorization guardrails to `Docs/KnowledgeAndSkillFoundation.md`, covering diminishing returns, meaningful action context, repeated prompt suppression, recovery-only credit, learned-concept separation, and varied wording to reward decisions and practice instead of low-cost repetition. - [x] Add persistence requirements for knowledge, skill experience, learned concepts, failed attempts, and tutorial state. Added knowledge persistence requirements to `Docs/KnowledgeAndSkillFoundation.md`, defining saved profile IDs, learned concepts, practical skill experience, mastery tiers, failed-attempt feedback history, tutorial/prompt state, question cooldowns, teaching/observation events, schema versioning, server authority, and reset-farming prevention. -- [ ] Add multiplayer rules for teaching, observation, shared work, and group skill benefits. +- [x] Add multiplayer rules for teaching, observation, shared work, and group skill benefits. Added multiplayer learning rules to `Docs/KnowledgeAndSkillFoundation.md`, covering server-validated teaching, bounded learner credit, observation limits, role-specific shared-work experience, capped group benefits, no global skill aura, and network authority checks for distance, visibility, participation, cooldowns, tools, context, and outcome. --- diff --git a/Docs/KnowledgeAndSkillFoundation.md b/Docs/KnowledgeAndSkillFoundation.md index 9c437a2..98ae4be 100644 --- a/Docs/KnowledgeAndSkillFoundation.md +++ b/Docs/KnowledgeAndSkillFoundation.md @@ -573,3 +573,58 @@ Save/load rules: Persistence rule: learning state should make a returning character feel continuous while giving designers enough history to tune teaching, feedback, and anti-exploit behavior. + +## Multiplayer Learning Rules + +Learning in multiplayer should make cooperation valuable without turning nearby +players into passive experience sources. + +Teaching: + +- The server validates teaching credit. +- The teacher must know the concept, have enough practical experience, or + demonstrate the action in the current context. +- The learner must be nearby, attentive, and eligible for the concept. +- Teaching grants bounded awareness or practice credit, not instant mastery. +- Dangerous concepts require supervised practice before full confidence is + awarded. + +Observation: + +- Nearby observation can unlock awareness of a concept when the action is + visible and relevant. +- Passive observation grants less credit than direct practice. +- Repeated passive observation has diminishing returns. +- Observation does not grant credit while idle, disconnected, hidden from the + action, or outside the relevant range. + +Shared work: + +- Group tasks can grant role-specific experience to active contributors. +- Roles should be explicit enough to audit later: gatherer, builder, fire + watcher, first aid helper, scout, teacher, cook, hauler, or defender. +- Failed group work can teach useful feedback when a player helps diagnose or + correct the problem. +- Idle proximity, item handoff spam, and repeated low-risk loops should not + grant shared-work credit. + +Group skill benefits: + +- Skilled contributors can reduce risk, improve quality, increase speed, or + make warnings more visible for the group task. +- Benefits should be capped so one expert does not remove all challenge. +- Benefits apply only while the contributor is present, equipped, and actively + helping. +- No global aura: skill benefits do not apply across the map or while logged + off unless a future offline-simulation rule explicitly grants protection. + +Network rules: + +- Client learning requests are hints only. +- Server authority validates distance, visibility, participation, role, + cooldown, tools, environmental context, and outcome before granting credit. +- Teaching, observation, and shared-work events must be persisted for tuning and + anti-exploit review. + +Multiplayer rule: cooperation should transfer awareness, improve group outcomes, +and reward active contribution without bypassing practice, risk, or context. diff --git a/Scripts/verify_multiplayer_learning_rules.py b/Scripts/verify_multiplayer_learning_rules.py new file mode 100644 index 0000000..1d606b9 --- /dev/null +++ b/Scripts/verify_multiplayer_learning_rules.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +"""Verify multiplayer learning rules are documented.""" + +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +DOC = ROOT / "Docs" / "KnowledgeAndSkillFoundation.md" +ROADMAP = ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md" + +REQUIRED = { + DOC: [ + "## Multiplayer Learning Rules", + "Teaching:", + "The server validates teaching credit.", + "Observation:", + "Passive observation grants less credit than direct practice.", + "Shared work:", + "Group tasks can grant role-specific experience to active contributors.", + "Group skill benefits:", + "Benefits should be capped", + "No global aura:", + "Network rules:", + "Server authority validates distance, visibility, participation, role,", + "Multiplayer rule:", + ], + ROADMAP: [ + "[x] Add multiplayer rules for teaching, observation, shared work, and group skill benefits.", + ], +} + + +def main() -> None: + missing: list[str] = [] + for path, snippets in REQUIRED.items(): + text = path.read_text(encoding="utf-8") + for snippet in snippets: + if snippet not in text: + missing.append(f"{path.relative_to(ROOT)} missing {snippet!r}") + if missing: + raise SystemExit("FAILED: " + "; ".join(missing)) + print("OK: multiplayer learning rules are documented.") + + +if __name__ == "__main__": + main()