Commit graph

316 commits

Author SHA1 Message Date
Libby
c23c8d1a88 deploy plan: NetworkTagSecret step checks openssl and treats an empty value as not set
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
(cherry picked from commit 4273907324)
2026-11-10 14:04:59 +00:00
800486a9a0 Merge pull request 'Pin the vote page busy-refusal branches' (#14) from heimdall/pin-vote-refusal-branches into main 2026-11-10 14:02:29 +00:00
07554d7121 Merge pull request 'Standard close: loser of a simultaneous close adopts the winner's result (#30)' (#31) from heimdall/standard-close-concurrency into main 2026-11-10 14:02:02 +00:00
Heimdall
ee3a2f49f5 Standard close: the loser of a simultaneous close adopts the winner's result
Status is a concurrency token, so the second SaveChanges of two simultaneous
CloseMotionAsync calls throws DbUpdateConcurrencyException. Reload and return,
with no second motion.closed audit event; the same pattern as the sealed closer.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 22:13:59 +00:00
Heimdall
012d1cb926 Test: a second simultaneous close of a Standard motion must not throw
Fails at this commit with DbUpdateConcurrencyException from CloseMotionAsync:
Motion.Status became a concurrency token in BifrostDbContext.cs:288.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 22:13:59 +00:00
416f11ad4f Merge pull request 'Signed Mind intake for sealed motions (stacked on #21)' (#22) from heimdall/sealed-mind-intake into main 2026-11-09 20:58:25 +00:00
Heimdall
0d7c3ec078 Mind intake: nonce prune is best-effort and never fails a valid request; test the five-lost-races contended branch; doc the retried reveal's phase judgement
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 20:55:03 +00:00
Heimdall
1c9cb9937e Signed Mind intake: verify before revealing state, dummy verify, issuedAt window and nonce pruning, per-source rate limit and body cap, one account per persona, DbUpdateException is replay only for the nonce
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 20:54:06 +00:00
Heimdall
8e6afc43ed Signed Mind intake for sealed motions: Ed25519 envelopes, registered public keys, nonce replay refusal, persona bound into the commitment
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 20:54:06 +00:00
b42b86f816 Merge pull request 'Sealed-ballot motions: commit-reveal over gamecult.sealed_ballot.v0' (#21) from heimdall/sealed-ballot-motion into main 2026-11-09 20:54:05 +00:00
Heimdall
55b7f79c13 Sealed ballot: retry a reveal that loses a RevealSeq race while the window is open, \z in hex patterns, doc the contended 409
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 20:47:23 +00:00
Heimdall
8d6b45ae69 doc: ballots are JSON documents, not typed CultNet documents
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 20:41:06 +00:00
Heimdall
264233e08f Sealed ballot: freeze the reveal set at close (RevealSeq token), HTTP tests for replay/non-voter/late reveal/close, doc corrected on the ballot schema
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 20:40:54 +00:00
Heimdall
96da1b7a8c Sealed ballot: race-safe close, close sweep, endpoint tests, backup reader and auth findings in the doc
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 20:30:35 +00:00
Heimdall
d5a71eb639 Sealed-ballot motions: commit-reveal over typed gamecult.sealed_ballot.v0 documents
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 20:24:49 +00:00
eb4aa3c493 Merge pull request 'docs: plan for deploying main over the live release' (#15) from heimdall/deploy-main-plan into main 2026-11-09 15:51:43 +00:00
c049793eca Merge pull request 'deploy plan: generate ConceptVotes__NetworkTagSecret, defaults note, checkout page check' (#19) from libby/networktagsecret-env-step into heimdall/deploy-main-plan 2026-11-09 15:50:31 +00:00
Libby
7895d05a13 deploy plan: NetworkTagSecret step is re-run safe (never overwrites or duplicates)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 15:48:45 +00:00
Libby
0ac9c956e1 deploy plan: how to generate ConceptVotes__NetworkTagSecret, defaults satisfy Stripe/Heimdall checks, checkout page check
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 15:46:28 +00:00
0eb68e498e Merge pull request 'Revise the main-to-live deploy plan against 55b74275 (Libby's 11 points)' (#18) from eureka/deploy-plan-revise into heimdall/deploy-main-plan 2026-11-09 15:20:08 +00:00
2dccadc8b5 Deploy plan: list the remaining unstated-as-unverified host facts, fix line markers, Persona picture cite
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 15:17:46 +00:00
1864fef9ee Deploy plan: rehearsal env turns off the flags whose keys are stripped; mark unverified host facts
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 15:14:47 +00:00
9caca35e4e Deploy plan: the live key ring, a rehearsal env outside /root, readyz with the live Host, stripped secrets
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 12:12:40 +00:00
3e1bca76d5 docs: revise the main-to-live deploy plan against main 55b74275
Targets 55b74275 (#11 and #17 in main; #15 docs only). #11 signs everyone out
once. Lists the validator's required keys by name, NetworkTagSecret (32+
chars) as a hard startup failure, put into step 3. Rehearsal through
sudo -u postgres and one start on a separate env file, scratch connection
string, throwaway KeysPath and a port other than 5080; no dotnet ef. Backs up
the data-protection key ring. Uses the real log files with a baseline count.
Notes bifrost-watchdog-notice.timer.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 11:56:13 +00:00
55b74275b0 Merge pull request 'CI: delete the container publish workflow' (#17) from heimdall/delete-publish-workflow into main 2026-11-09 11:50:46 +00:00
Heimdall
e576ba1d74 Docs: the deployment model is a release directory; drop the ghcr.io tag
Eureka, #minds, 2026-11-09 ~11:31Z, reply to Heimdall on Bifrost #16/#17.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 11:48:45 +00:00
7c563130e8 Merge pull request 'Make every cookie host-only: __Host- names, Secure, Path=/' (#11) from heimdall/host-only-cookies into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Failing after 14s
2026-11-09 11:48:27 +00:00
Heimdall
8a95c99d15 CI: delete the container publish workflow
Bifrost ships as a release directory switched by Idunn; nothing here pulls an
image, and the job would fail on every push to main.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 11:31:39 +00:00
Heimdall
58fa80bc5b Make the attempt cookie's deletion Secure so a browser honours it
A __Host- cookie is only removed by a Set-Cookie that is itself Secure. The
hardening test now checks Secure on every header, deletion included, and the
completion tests pin that success and refusal both clear the attempt cookie
with Secure, Path=/ and no Domain.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 11:24:02 +00:00
Heimdall
2671b4bcb8 docs: drop an unsupported claim from the deploy plan
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 07:39:12 +00:00
Heimdall
c97644e3ed docs: plan for deploying main over the live release
Preconditions, ordered steps, live check and rollback for moving live
67072b2 to main (141 commits, two additive EF migrations, new
Heimdall:AppSecret). Plan only; nothing deployed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 07:39:03 +00:00
Heimdall
7cfce18fcf Pin the vote page's two unpinned busy-refusal branches
A signed-in retract on a full account table must say busy with no sign-in offer (the
retract door passes its voter to Throttled), and a spent cast budget must say only
"too fast", for anonymous and signed-in voters alike. Both mutants survived Soul s4.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 21:28:41 +00:00
244811cb49 Merge pull request 'Matrix mouth: read receipts on ack, presence from the brake' (#13) from heimdall/mouth-receipts-presence into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Failing after 12s
2026-11-08 16:26:10 +00:00
94606d04a6 Matrix mouth: re-read the brake before every join; pin the encoded presence path
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 16:24:17 +00:00
8938dbd739 Matrix mouth: review fixes (stale brake at the join, no receipt while braked, presence on the backlog path, guarded receipt log)
- answerInvites takes a fresh brake read after the long-poll
- readUpTo reads the brake when each receipt would post; held brake drops it, one log line
- the brake read and offline presence PUT precede the full-backlog early return
- a throwing logger cannot reject the unawaited receipt call
- tests: fake keeps the raw path and honours abort signals; the braked-round carve-out is offline presence PUTs only

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 16:18:44 +00:00
111f7e6f1a Mouth tests: the no-wait probe fails fast instead of hanging
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 16:09:25 +00:00
8b7783dfb0 bridge.md: ack posts her read receipt, presence follows her brake
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 16:04:50 +00:00
b1b145ee39 Matrix mouth: post each Persona's m.read receipt on her ack, set her presence from her brake
An ack posts her public m.read per room at the newest covered event, fire and
forget (never awaited, failure logged once, no retry). syncOnce reads the brake
once per round, passes it to answerInvites, sends set_presence on /sync and one
presence PUT on a released-to-braked transition (first braked round included).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 16:04:50 +00:00
5ad17d7c77 Merge pull request 'Matrix mouth: fetch and store chat images (cut A), ChatDelivery v3' (#12) from heimdall/chat-images-cut-a into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Failing after 22s
2026-11-08 09:30:04 +00:00
Heimdall
fd0a43e0e4 Image store: room directory must share the Persona directory's group; never create the Persona directory
The room directory's gid must equal the Persona directory's, else store-failed (a setgid
directory in the wrong group would still give files the wrong group). A missing Persona
directory is refused rather than created; only the room directory is made. The stat is
injectable so the group case is testable where the sandbox cannot chown.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 09:29:59 +00:00
Heimdall
129b517f46 Image store: never chmod a room directory; refuse when setgid is not inherited
A chmod by bifrost, which is not in the Persona's group, clears the setgid bit, so files
would take bifrost's group and the Persona's reader could not open them. Directories and
files are now created with exact modes (fixed umask around mkdir and open), the room
directory must have inherited setgid from the installer's Persona directory or the image
is refused (store-failed), and the Persona directory is never chmodded. Adds behavioural
redirect-refused and fetch-timeout tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 09:27:40 +00:00
Heimdall
a85942e858 Test: the streamed cap fails by assertion, not by timeout
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 09:21:46 +00:00
Heimdall
e23f7da2d5 Test: a failed image write leaves no temp file
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 09:19:32 +00:00
Heimdall
02275ee17b Matrix mouth: fetch and store chat images (cut A), ChatDelivery v3
m.image events in delivered messages are fetched as the receiving Persona,
classified by magic bytes, bounded by size and header pixel count, and stored
under IMAGE_STORE_ROOT/<persona>/<room hash>/<bytes hash>[.ext] (0640, dirs
2750). The delivery tuple gains index 11, nil or [path, mime, size, sha256];
the pending kind becomes gamecult.persona.chat_pending.v2 with Huginn's v3
golden bytes. Refusals keep the typed text line plus a fixed-word reason.
The mouth test homeserver is answered in-process so the suite runs under a
capped address space.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 09:18:55 +00:00
Heimdall
c757acf525 Make every cookie host-only: __Host- names, Secure, Path=/, no Domain
Session, OAuth correlation, antiforgery, voter and Heimdall attempt cookies all take the
__Host- prefix. The prefix forbids a narrower Path, so the voter (was /mill) and attempt
(was /auth/heimdall) cookies move to Path=/.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 18:42:43 +00:00
bf8ff62774 Merge pull request 'Estate-rule sim: regenerate stale results, fix weight-floor wording' (#7) from heimdall/stale-estate-numbers into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
2026-11-06 07:50:10 +00:00
Heimdall
b6c1e9af73 Estate-rule sim: regenerate results.md and fix stale half-cap numbers and the "0 below unit" wording
REPORT.md E6 and results.md still held pre-fix numbers (half-cap 0.044/0.222, s max 0.953).
Regenerated with the current sim: s max 0.777; half-cap binding all four 0.000,
Patrons+Minds 0.008, Patrons alone 0.165. Weight is 0 only at amount <= unit/b (run.py,
REPORT.md, SPEC.md); the splitting table no longer prints a cliff "0 (below unit)". Test count 54.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 07:50:04 +00:00
Heimdall
527f96986a Merge remote-tracking branch 'origin/main' into heimdall/stake-vectors
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
2026-11-06 04:34:57 +00:00
Heimdall
55253c48b4 Estate-rule sim: stake log_weight follows heimdall-stake's log form, no cliff at unit
w = max(0, 1 + log_b(x/unit)); all 14 single and 12 split golden rows now pass.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 04:34:57 +00:00
b3c4821a67 Merge pull request 'Estate-rule sim: pin the stake arm to heimdall-stake golden vectors' (#6) from heimdall/stake-vectors into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
2026-11-06 02:32:24 +00:00