Public: anyone can read this; the crew can change it.

Sworn and said: an acceptance costs a true aim, and a claim is a claim #9

cancelled cancelled by trevato opened this
opened this

Intent. The heart of the game — accepting an accord forces you to expose one real aim it satisfies, while anything else you assert about your charge is recorded as said and audited in public at the end.

Done looks like

  • [ ] Migration for claim (id, game_id, seat_id, act_id, register sworn|said, clause, setting, worth, verdict INTEGER NULL).
  • [ ] acceptOffer takes { gameId, cite: { clause, setting } } and enforces the rule from RULES.md: the cited aim must be a positive aim of the caller's own charge, the accord must set that clause to that setting, and if the caller has any satisfied positive aim not yet sworn, the citation must be one of those. Each refusal is a named failure with a sentence a player can act on.
  • [ ] An accord that satisfies none of the caller's positive aims cannot be accepted — a test asserts the refusal, and the page never offers the button.
  • [ ] A sworn claim is public the instant it is made: clause, setting, weight and the seat, in tableState for guests too.
  • [ ] Any act may carry say: [{ clause, setting, worth }] with worth in none|small|large|dread, at most 3 per act, each validated against this table's charter and stored as register = 'said' with no verdict yet.
  • [ ] The engine never rejects a said claim for being false, and a test proves a false one is accepted and stored.
  • [ ] Tests: a sworn citation that does not match the charge is refused; citing an already-sworn aim while a secret satisfied aim exists is refused; the same citation made twice is refused.

Files src/db.ts, src/actions.ts, src/actions.test.ts, src/routes.ts, src/server.test.ts, RULES.md.

Risks The citation check reads secret state — one leak in a failure message tells the table what you hold; assert the wording in a test. Cap the claims per act or an agent will flood the log.

Brief that fits @vesper — the rules engine of a game, written as small typed modules with tests. (A person assigns.)

commented

Amended by the planner, now that RULES.md is merged (#17). The sworn rule this issue describes in three tests is written out in §6, and the reading it settles is the sharp one: a positive aim can be sworn once in a game, ever. A citation already sworn is refused whatever the accord, so a signature always costs a fresh truth, a seat has at most three acceptances in a whole game, and an accord that satisfies only aims you have already sworn cannot be accepted by you at all. Implement §6 verbatim, including its last paragraph: a refusal never leaks — no failure message may name an aim, a seat or an accord detail the caller does not already hold, and there is a test that asserts the wording.

The said register is §7, including the none|small|large|dread worth values and the cap of 3 said claims per act. Everything else in the body stands.

commented

Amended by the planner, now that #26 and #36 are merged. Both halves of the rule exist in pure form: citable(charge, accord, sworn) in src/board.ts says what a seat may swear and why not, and sworn, trueWorth and the §7 Said shape are in src/round.ts.

  • acceptOffer calls citable and answers with the refusal it returns; the sentences are already one constant in board.ts, so no door invents wording. The only sentence this issue writes is the one about the caller's own input — a citation that is not one of their aims at all.
  • The claim table stores what round.ts reads: register, clause, setting, worth, the act it rode on, and a verdict left null until settlement.
  • What is genuinely missing and is this run's work: the boundary for a said claim. Nothing validates its shape yet — clause and setting of this charter, worth one of none | small | large | dread, at most 3 per act — and it belongs beside validAccord, in src/board.ts, so every door gets it.
  • Keep the leak test: #26's tests already assert no refusal names a clause, setting, weight or seat, and the same must hold for anything this issue adds.

The checklist otherwise stands.

commented

Narrowed by what #8 merged. The sworn half of this issue is in: acceptOffer in src/actions.ts already costs a truth — it takes cite, matches it against §6's own list for the caller's charge, swears the first the charter offers when none is named, refuses with "This accord satisfies none of your aims" when the accord pays the caller nothing, and writes the citation onto the accept act where it is public forever. I played it over HTTP on 948abc0 to be sure.

What is left of this issue is the said register of §7: a claim about your own charge that costs nothing, is recorded unverified, may be made in the same act, and is marked true or false in front of everyone at the reveal. That is the half that still has no column, no action and no door — and it is the one that makes lying a move. Please rewrite the checklist to it when you pick this up; the sworn criteria are satisfied.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs