Commit graph

285 commits

Author SHA1 Message Date
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
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
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
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
Heimdall
0f985c6003 Estate-rule sim: pin the stake arm to heimdall-stake's golden vectors
Copies CultLib PR #9 (head 84f932ec) tests/vectors/stake_golden.csv unmodified and
checks log_weight and split_weight against all 26 rows. 25 match within rounding;
the one sub-unit row differs by design: the arm's cliff at unit is Libby's
min_amount_per_identity = unit, which the vectors do not set.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 02:32:20 +00:00
10ffad3d21 Merge pull request 'Estate-rule sim: purchased-stake arm (log weight, splitting adversary, half-influence cap)' (#5) from heimdall/estate-sim-purchased-stake into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
2026-11-05 19:29:58 +00:00
Heimdall
081b0fc991 Estate-rule sim: review fixes for the purchased-stake arm
Docstrings state weight is per identity, not sybil-safe, hours unanalysed;
placeholder parameters marked in code; unit x roll sweep with interval;
identity-cost thresholds by bisection (about half the budget, not the
doubling-grid 51-82%); headline numbers pinned in a test; 'log bounds'
test renamed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 19:29:51 +00:00
Heimdall
6e4f94ae27 Estate-rule sim: purchased-stake arm (log weight, hours input, splitting adversary, half-influence cap, E6)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 13:13:43 +00:00
b95234bbef Merge pull request 'Estate-rule sim harness: populism, strategic agents, transitive delegation' (#4) from heimdall/estate-rule-sim into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
2026-11-05 10:59:23 +00:00
a338c594be Merge pull request 'Proposal: charter amendment provision (in-chat charter)' (#3) from heimdall/charter-amendment-proposal into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
2026-11-05 10:59:13 +00:00
5900284742 Merge pull request 'The mouth delivers media events as a typed line' (#2) from heimdall/mouth-media-line into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
2026-11-05 10:58:56 +00:00
Heimdall
5d352c6c20 estate-rule sim: copy-the-ballot strategy and E3f cap sweep
Spec 5b (source: Golz et al. 2018 intro citing Behrens et al. 2014), copier
agents in estatesim.py, E3f alpha x cap x copy sweep with a computed
paired-interval verdict, 10 tests. Result: with copying the cap does not
reduce effective concentration. Earlier results.md sections unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 07:05:15 +00:00
Heimdall
9d032c2dff estate-rule sim report: correct cell counts and cap/appeal claims against results.md
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 04:22:57 +00:00
Heimdall
70e9cef3d5 estate-rule sim: renewal and peer edges, full results, report
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 04:22:28 +00:00
Heimdall
dda8ee7c58 estate-rule sim harness: stdlib core, runner, tests
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 03:39:53 +00:00
Heimdall
0d52eeaeee estate-rule sim spec rev 2: transitive delegation chains, depth sweep, uncast rules
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 03:39:53 +00:00
Heimdall
a23b6d94f1 docs: estate-rule sim harness spec (populism measure, delegation, strategic agents)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 00:24:58 +00:00
Heimdall
a09746c8f7 Revise charter amendment proposal with settled estate rules
3-of-4 for ordinary rules, all four for a short named entrenched list,
reduction rule with floor/notice/delay, incentive-first framing, Minds
count once with dissent recorded, no notice no approval, freeze risk
stated beside the veto rules. Numbers remain placeholders.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 23:18:07 +00:00
Heimdall
2c37e8a0de docs: charter proposal, fix clause cross-references
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 21:47:52 +00:00
Heimdall
f7770df147 docs: charter amendment provision proposal (in-chat charter)
Draft only; not in force. Does not change the legal entity's statutes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 21:47:45 +00:00
Heimdall
6548ca8385 mouth: deliver media events as a typed line
m.image/m.file/m.audio/m.video reached Personas as a bare filename and
dropped content.url. The delivery text now leads with
[kind filename mime size url], then the caption. Applies to the delivery
and to context lines. Wire v1 is unchanged. Nothing is fetched: a Persona
turn is a tool-less text call.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-03 18:09:43 +00:00
e396305c19 Merge pull request 'The mouth refuses a Persona send when the room moved past what she held' (#1) from eureka-body/optimistic-send-mouth into main
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
2026-11-03 11:03:11 +00:00
7adc7315a3 send gate: re-check the brake after the gate wait, before the PUT
A send queued at the room gate passed the brake check at entry only, so a
brake placed while it waited still let the PUT through. The check now also
runs inside the gate, just before the PUT, and answers a typed Brake refusal.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-03 10:37:22 +00:00
Meta Vens
2387cbc7f6 send gate tests: pin the head read's shape
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 11:06:39 +01:00
Meta Vens
981164173f send gate tests: arrival order is the gate's, not the call site's
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 11:02:47 +01:00
Meta Vens
2dd4bd863e persona matrix mouth: send gate tests, the captured #swarm head, v2 golden fixtures
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 11:02:07 +01:00
Meta Vens
a76c70cc39 persona matrix mouth: a v2 send is refused if the room moved past her basis; check and PUT are one step per room across every Persona
Removes the bare PUT; the one PUT now lives inside the room gate. v1 stays served unchecked through the same gate.
Wire: chat_send_request.v2 (basis) and chat_send_receipt.v2 (newer); RoomMoved is v2 only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 11:01:44 +01:00
Meta Vens
c29c5d1a4e persona matrix mouth: a delivery's context is read from Matrix, not remembered
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
The per-room in-memory history map is gone: a restart emptied it and /sync resumed from the
cursor, so every room (a DM first) lost its past. When a delivery is built the mouth now reads
the room's timeline from the homeserver as that Persona (GET /messages dir=b, or the thread's
root plus /relations m.thread for a threaded message), keeps m.room.message from everyone
including her own, oldest first, ending before the delivered event. Newest lines are kept to a
16 KiB byte budget (each clipped to limits.contextBytes), at most the 20 lines the delivery
tuple carries. One fetch per room or thread per sync round. A failed fetch gives empty context
and a redacted log line; the delivery still goes out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 05:10:57 +01:00
Meta Vens
98689b787d persona matrix mouth: each Persona's rooms are the shared MATRIX_ROOMS plus her own MATRIX_ROOMS_<SLUG>
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
SLUG is the Persona slug upper-cased with "." and "-" turned into "_". Lists are
deduplicated; an absent variable gives shared rooms only; a malformed project alias,
or two Personas mapping to one variable, is refused at start. The send path's
UnknownRoom check already reads the mouth's own list, so another Persona's project
room is refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 04:12:31 +01:00
Meta Vens
3bff0d779c persona matrix mouth: log the many-peer server's errors and keep serving
Some checks failed
Publish Container / Build and publish Bifrost image (push) Has been cancelled
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 01:51:57 +01:00
Meta Vens
b892c64f00 persona matrix mouth: one session per client on the many-peer RUDP server; every request answered on the connection it arrived on
Two Persona turns running at once no longer take each other's session. Requests run in order per client, not across clients.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 01:51:57 +01:00
Meta Vens
a7621f9eed Research: Discord-like roles on Matrix and the chat client (matrix-roles-from-bifrost-estates)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 19:09:06 +01:00
Meta Vens
ccb0e6b08c Research: email mouth prior art (payment-mints-invite-bifrost-ledger-email-mouth)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 19:09:06 +01:00
Meta Vens
6cf24644bc Research: customer-member onboarding prior art and body facts (customers-get-voting-power-onboarding-owed)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 19:09:05 +01:00
Meta Vens
cc76f0f2d0 mouth-all-personas: one Matrix mouth serves every Persona; deliveries carry mentions and is_direct, refusals are typed; same-server DM invites accepted; the ring is deleted (Persona turns are the heartbeat's) (squash of eureka-body/mouth-all-personas 7b63031..5b628e2; Soul s1-s3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:49:59 +01:00