Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
defcea1
Harden spatial observation XP contract
Aug 22, 2026
437bfd1
Optimize deterministic spatial minimap
Aug 22, 2026
1a0844e
Fail closed on unknown spatial prompt provenance
Aug 22, 2026
0774fa6
feat(coworld): add owner capability upgrade kit
Aug 22, 2026
47d5279
test(coworld): seal owner upgrade packet contract
Aug 22, 2026
a8ffed6
feat(coworld): enforce spatial XP evidence ceilings
Aug 22, 2026
5b42c45
docs(coworld): seal owner capability upgrade packet
Aug 22, 2026
9ce5d8e
test(coworld): cover capability-aware starter integration
Aug 22, 2026
e1d9edb
feat(agent): add bounded rich spatial map context
Aug 22, 2026
2241360
test(agent): align rich spatial benchmark fixture
Aug 22, 2026
0f58355
Harden rich spatial owner contract
Aug 22, 2026
8dd5934
Harden owner deal and evidence contracts
Aug 22, 2026
3556245
Make owner patch whitespace-clean
Aug 22, 2026
1096657
Scope generated owner patch whitespace
Aug 22, 2026
764813b
Bind owner capability evidence and deal state
Aug 22, 2026
c329cf3
Seal rich owner upgrade patch
Aug 22, 2026
c330c53
Harden active deal obligation normalization
Aug 22, 2026
dcde86d
Reject impossible active covenant status mixtures
Aug 22, 2026
e8944d3
Prove active covenant violation shape
Aug 22, 2026
b20a0b5
Seal terminal owner upgrade packet and evidence receipt
Aug 22, 2026
0be4b26
Align starter parity fixture with strict deal capability
Aug 22, 2026
f97e1a9
Align public planner with canonical unit counts
Aug 22, 2026
38bc71a
Reseal canonical unit-count owner packet
Aug 22, 2026
92bd604
Freeze complete 25-seat spatial evidence receipt
Aug 22, 2026
d6abb95
feat(spatial): add rich L4 L5 perception
Aug 24, 2026
7f69c41
docs(spatial): seal rich owner upgrade packet
Aug 24, 2026
d4d834e
fix: enforce free-text agent message boundary
Aug 24, 2026
2a20469
fix: suppress impossible crossed deal acceptance
Aug 24, 2026
a4df511
fix(spatial): fail closed on malformed rich wire state
Aug 24, 2026
b3c255e
fix(spatial): align percentage admission across consumers
Aug 24, 2026
e390184
fix: close social and commander evidence gaps
Aug 24, 2026
ae80254
fix(spatial): align rich wire and evidence gates
Aug 24, 2026
1adb6c1
Harden rich spatial parity and three-arm XP
Aug 24, 2026
63422f4
Align spatial examples and evidence arms
Aug 24, 2026
ce94266
Bind complete spatial structure evidence
Aug 24, 2026
90783a6
Correct three-arm spatial runbook wording
Aug 24, 2026
0b5e658
feat(agent): integrate spatial observation evaluation
Aug 24, 2026
b8d8054
docs(agent): reseal spatial owner upgrade packet
Aug 24, 2026
ae6fb3c
docs(agent): correct message evidence join
Aug 24, 2026
07075e1
fix(coworld): seal spatial xp upload authority
Aug 24, 2026
de9c096
fix(coworld): pin spatial certification cwd
Aug 24, 2026
6b75fd7
Accept Coworld commissioner storage defaults
Aug 24, 2026
023818c
Version spatial XP packages by source
Aug 24, 2026
b8c5c70
Accept exact Coworld image publication
Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
coworld-adapter/testing/owner-upgrade/proxywar-owner-upgrade.patch -whitespace
709 changes: 709 additions & 0 deletions OWNER-UPGRADE.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions coworld-adapter/coworld/coworld_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@
"protocols": {
"player": {
"type": "text",
"value": "Proxy War Coworld player protocol: connect to COWORLD_PLAYER_WS_URL. The game sends {type:'decision_request', requestID, protocol:{maxActionsPerDecision,maxSpawnPreferences:16}, request:{protocolVersion:'proxywar-agent-v1', observation, legalActions, responseContract}}. protocol.maxSpawnPreferences is independent of protocol.maxActionsPerDecision. The player replies {type:'decision_response', requestID, selectedLegalActionId, selectedLegalActionIds?, spawnPreferenceLegalActionIds?, selectedDealActionId?, reason, confidence?}. selectedLegalActionId must be one offered LegalAction.id from legalActions[].id. On a spawn-only menu, spawnPreferenceLegalActionIds may rank up to protocol.maxSpawnPreferences exact offered spawn LegalAction.id values with selectedLegalActionId first. This spawn ballot is independent of selectedLegalActionIds action batching and must not be used to batch gameplay actions. selectedLegalActionIds may batch up to maxActionsPerDecision offered ids (deduplicated; element 0 is the scalar primary); send it ONLY when the request envelope advertised protocol.maxActionsPerDecision - older game images execute the scalar primary only. When the current menu offers deal_* actions, selectedDealActionId may independently select one exact offered deal_propose/deal_accept/deal_reject/deal_withdraw id alongside the game action; omitting it remains valid but ignores that diplomacy opportunity. Structured deals are breakable, referee-observed promises, not engine alliances or permission changes. The wire template joint_attack is an attack pledge by the proposer only. At episode end the game sends {type:'final', slot}; the player must finish any optional COWORLD_PLAYER_ARTIFACT_UPLOAD_URL upload before closing because websocket close acknowledges terminal work is complete. The game still validates decisions through Proxy War AgentDecisionValidator."
"value": "Proxy War Coworld player protocol: connect to COWORLD_PLAYER_WS_URL. The game sends {type:'decision_request', requestID, protocol:{maxActionsPerDecision,maxSpawnPreferences:16}, request:{protocolVersion:'proxywar-agent-v1', observation, legalActions, responseContract}}. protocol.maxSpawnPreferences is independent of protocol.maxActionsPerDecision. The player replies {type:'decision_response', requestID, selectedLegalActionId, selectedLegalActionIds?, spawnPreferenceLegalActionIds?, selectedDealActionId?, selectedMessageActionId?, messageText?, reason, confidence?}. selectedLegalActionId must be one offered LegalAction.id from legalActions[].id. On a spawn-only menu, spawnPreferenceLegalActionIds may rank up to protocol.maxSpawnPreferences exact offered spawn LegalAction.id values with selectedLegalActionId first. This spawn ballot is independent of selectedLegalActionIds action batching and must not be used to batch gameplay actions. selectedLegalActionIds may batch up to maxActionsPerDecision offered ids (deduplicated; element 0 is the scalar primary); send it ONLY when the request envelope advertised protocol.maxActionsPerDecision - older game images execute the scalar primary only. When the current menu offers deal_* actions, selectedDealActionId may independently select one exact offered deal_propose/deal_accept/deal_reject/deal_withdraw id alongside the game action; omitting it remains valid but ignores that diplomacy opportunity. Structured deals are breakable, referee-observed promises, not engine alliances or permission changes. The wire template joint_attack is an attack pledge by the proposer only. When the current menu offers message actions, selectedMessageActionId and messageText may be sent only as a pair; the id must exactly match one offered message action and the raw text must be 1-280 JavaScript string characters without control, bidi-override, or zero-width formatting characters. Policies never send messageEventID; recipients receive the server-owned messageEventID in observation.nonCombat.inboundMessages for stable deduplication and replay joins. At episode end the game sends {type:'final', slot}; the player must finish any optional COWORLD_PLAYER_ARTIFACT_UPLOAD_URL upload before closing because websocket close acknowledges terminal work is complete. The game still validates decisions through Proxy War AgentDecisionValidator."
},
"global": {
"type": "text",
Expand All @@ -294,7 +294,7 @@
"docs": {
"readme": {
"type": "text",
"value": "# Proxy War Coworld\n\nProxy War is a simultaneous-turn territorial strategy game. This Coworld package runs Proxy War through the existing game runner and preserves the LegalAction.id decision path.\n\n## Rules Summary\n\nEach Coworld player controls one Proxy War slot. During a decision step, the game advances through the existing Proxy War game server and asks each connected player to choose from the current legal actions. The default variant uses a compact two-player map, 50 decision cycles, 100 turns per cycle, and a short replay tail so hosted tournaments produce meaningful expansion, economy, and combat evidence without requiring a 170-minute full match. Certification keeps a separate short smoke fixture so upload checks stay fast.\n\nA player may only select an action id that the game offered in the current request. The game passes that selected id back through Proxy War's existing AgentDecisionValidator, AgentLeagueMatchRunner, AgentRunner, and GameServer path. Invalid, stale, or missing selections are treated as fallback decisions by the adapter and are visible in the result artifact.\n\n## Player Protocol\n\nPlayers connect to COWORLD_PLAYER_WS_URL. The game sends decision_request messages containing protocolVersion, observation, legalActions, and responseContract fields; its envelope independently advertises protocol.maxActionsPerDecision for optional gameplay-action batching and protocol.maxSpawnPreferences=16 for spawn ranking. The player replies with decision_response, the same requestID, and selectedLegalActionId. selectedLegalActionId must match one offered legalActions[].id exactly. On a spawn-only menu, the optional spawnPreferenceLegalActionIds field may rank up to 16 exact offered spawn LegalAction.id values with selectedLegalActionId first. spawnPreferenceLegalActionIds is a spawn ballot independent of selectedLegalActionIds gameplay-action batching; never put the spawn ranking in selectedLegalActionIds. When offered, selectedDealActionId may separately select one exact deal_* id alongside that game action. Omitting the optional slot stays valid but ignores the diplomacy opportunity. Structured deals are breakable, referee-observed promises rather than engine alliances or permission changes. Non-aggression and trade-security bind both parties; joint_attack is an attack pledge by the proposer only; accepting support_request obligates the recipient to send the stated support.\n\nThe bundled starter player is proxywar-starter-websocket. It is intentionally simple: it reads the offered LegalAction.id values and chooses one legal id. It is useful for certification and smoke tests, not for competitive play.\n\n## Scoring\n\nThe adapter writes one numeric score per policy slot in results.scores. If Proxy War reports a winner, that slot receives 1 and every other slot receives 0. If a bounded episode ends without a winner, each slot receives its normalized owned-territory share among policy slots. Scores sum to 1 in normal proofs.\n\nThis scoring rule is the shipped ranking scalar. Softmax can re-rank with a different scalar after upload by changing only the results.scores values, not the game/player contract or the LegalAction.id path.\n\n## Artifacts\n\nEach episode writes Coworld-compatible results, replay bytes, game/player logs, and Proxy War match artifacts. The reporter, grader, diagnoser, and optimizer-plan runnables consume the episode bundle shape used by Coworld tooling. Reporter and grader contracts are exercised; diagnoser and optimizer are contract-shaped because Coworld 0.1.15 still marks those roles reserved or runtime-pending.\n\n## Hosted Status\n\nThis manifest is the canonical hosted Proxy War Coworld. It runs with the tsx loader so read-only episode pods do not need writable /tmp, sanitizes Coworld policy labels into Proxy War usernames, and serves global, replay, and player Coworld client routes from the native Proxy War viewer."
"value": "# Proxy War Coworld\n\nProxy War is a simultaneous-turn territorial strategy game. This Coworld package runs Proxy War through the existing game runner and preserves the LegalAction.id decision path.\n\n## Rules Summary\n\nEach Coworld player controls one Proxy War slot. During a decision step, the game advances through the existing Proxy War game server and asks each connected player to choose from the current legal actions. The default variant uses a compact two-player map, 50 decision cycles, 100 turns per cycle, and a short replay tail so hosted tournaments produce meaningful expansion, economy, and combat evidence without requiring a 170-minute full match. Certification keeps a separate short smoke fixture so upload checks stay fast.\n\nA player may only select an action id that the game offered in the current request. The game passes that selected id back through Proxy War's existing AgentDecisionValidator, AgentLeagueMatchRunner, AgentRunner, and GameServer path. Invalid, stale, or missing selections are treated as fallback decisions by the adapter and are visible in the result artifact.\n\n## Player Protocol\n\nPlayers connect to COWORLD_PLAYER_WS_URL. The game sends decision_request messages containing protocolVersion, observation, legalActions, and responseContract fields; its envelope independently advertises protocol.maxActionsPerDecision for optional gameplay-action batching and protocol.maxSpawnPreferences=16 for spawn ranking. The player replies with decision_response, the same requestID, and selectedLegalActionId. selectedLegalActionId must match one offered legalActions[].id exactly. On a spawn-only menu, the optional spawnPreferenceLegalActionIds field may rank up to 16 exact offered spawn LegalAction.id values with selectedLegalActionId first. spawnPreferenceLegalActionIds is a spawn ballot independent of selectedLegalActionIds gameplay-action batching; never put the spawn ranking in selectedLegalActionIds. When offered, selectedDealActionId may separately select one exact deal_* id alongside that game action. Omitting the optional slot stays valid but ignores the diplomacy opportunity. Structured deals are breakable, referee-observed promises rather than engine alliances or permission changes. Non-aggression and trade-security bind both parties; joint_attack is an attack pledge by the proposer only; accepting support_request obligates the recipient to send the stated support.\n\nWhen offered, selectedMessageActionId and messageText may separately send one private free-text message alongside the game and deal actions. Send both fields or neither; the id must exactly match one offered message action. The server rejects, never rewrites, blank or over-280-character text and control, bidi-override, or zero-width formatting characters. Policies never author a messageEventID. Delivered inboundMessages include the server-owned messageEventID, senderID, senderName, text, and turnNumber so decisions.jsonl, replay intents, and recipient observations have one exact join.\n\nThe bundled starter player is proxywar-starter-websocket. It is intentionally simple: it reads the offered LegalAction.id values and chooses one legal id. It is useful for certification and smoke tests, not for competitive play.\n\n## Scoring\n\nThe adapter writes one numeric score per policy slot in results.scores. If Proxy War reports a winner, that slot receives 1 and every other slot receives 0. If a bounded episode ends without a winner, each slot receives its normalized owned-territory share among policy slots. Scores sum to 1 in normal proofs.\n\nThis scoring rule is the shipped ranking scalar. Softmax can re-rank with a different scalar after upload by changing only the results.scores values, not the game/player contract or the LegalAction.id path.\n\n## Artifacts\n\nEach episode writes Coworld-compatible results, replay bytes, game/player logs, and Proxy War match artifacts. The reporter, grader, diagnoser, and optimizer-plan runnables consume the episode bundle shape used by Coworld tooling. Reporter and grader contracts are exercised; diagnoser and optimizer are contract-shaped because Coworld 0.1.15 still marks those roles reserved or runtime-pending.\n\n## Hosted Status\n\nThis manifest is the canonical hosted Proxy War Coworld. It runs with the tsx loader so read-only episode pods do not need writable /tmp, sanitizes Coworld policy labels into Proxy War usernames, and serves global, replay, and player Coworld client routes from the native Proxy War viewer."
},
"pages": []
},
Expand Down
Loading
Loading