Build Report · Week 40 · the week a community got a constitution

No one person holds every key

302 changes this week, down from Week 39's 430 and level with Week 38. Two stories carry it. First, a community is now run by roles, approvals and waiting periods, not by whoever holds the admin login. Risky changes wait in a queue until enough people approve them, and anything that takes power away is announced and held for a cooling-off period first. Second, last week's off-the-books experiment landed on the main line: a community can now admit someone on the word of three vetters without anyone learning which three. Around those two: the community service retired its last unsigned entrances, credentials moved to a new standard version, and messages now find their way between two message hubs and survive a laptop going to sleep.

📅 September 28 → October 4, 2026 · 10 projects scanned, 8 shipped
302
changes shipped across eight of the ten projects in scope
20
trust-backbone changes tagged to role-based administration and approvals
+950
new automated checks (16,029 → 16,979), like-for-like across the same eight projects
77
changes on the busiest day, Monday September 28
The Big Picture

Six things changed this week

Last week every project got one signed front door. This week was about who may walk through it, and what happens when they do: who gets to decide, how many must agree, and how long before it takes effect.

🗳️

Roles, approvals and cooling-off

Administration in a community is now role-based: built-in and custom roles, each a set of named permissions. An operation that needs consent waits in an action list and runs on the N-th approval. Removing an administrator or lowering the approval threshold needs a second person. A change that takes rights away is announced, then cools off before it bites, and the work survives a crash in between.

🕶️

Hidden vetters, now on the main line

Last week's zero-knowledge work, which let an applicant prove that three eligible vetters vouched without revealing which, was on local branches only. This week it landed on main in both the trust backbone and the community app, each as a single change, and now uses the published release of the proof library.

🚪

The last unsigned entrances retired

Every call the community's client makes is now a signed request. Members' everyday actions, the policy and identity logs, website content and the console's signing keys all moved over, and the matching old web routes were removed. The identity-log host deleted its old management interface on both the control plane and the edge, and its witness now accepts signed requests only.

📜

Credentials, version 1

A new standard shape for what a community issues: role credentials, a “vetted” statement and a “witnessed” statement. A community can now record its own identity check as a “vetted” statement and deliver it to the person. The community app keeps it and offers it as proof of personhood elsewhere.

📡

Messages that find their way

A secure-protocol conversation can now start with someone on a different message hub. The toolkit's live connection recovers after a laptop sleeps or the network drops, a message is no longer lost to a waiter that gave up, and the hub reconnects to its store after a restart. One fix stopped incoming messages being silently dropped.

🚢

Ready to install

The community app can now be published to crates.io and cut releases 0.3.1 and 0.4.0. The git-signing bridge is published too, with ready-built binaries and a setup command that writes a runnable folder. Six projects moved to the same new dependency set together. A key test set went from 16.3s to 3.6s on a laptop.

Why It Matters

What this means, in plain terms

⏳

A takeover can't happen overnight

Last week the most powerful role started needing a second admin's consent. This week extends that idea to the whole community. Removing an admin, lowering how many approvals are needed, or changing who has authority now takes a second party. A cut to someone's rights is announced and waits before it applies, so a stolen login can't quietly lock everyone else out before anyone notices.

🤫

Vouching without exposure

A community where vetters could be pressured or targeted can now admit people without keeping a list of who vouched for whom. Moving this from a local branch to the main line is the step that makes it something a real community could switch on, though the proof library still needs an independent review first.

🧑‍🤝‍🧑

Small communities aren't left out

Checks and balances assume more than one administrator. Rather than make small groups fake a second person, a community can declare single-administrator mode at install time. It is recorded as one person under several identifiers, and the two-person rules are knowingly relaxed instead of quietly broken.

302
changes across 8 of 10 projects. Busiest day: 77 on Monday September 28
+950
new automated checks (16,029 → 16,979), a twelfth consecutive rise
−93.8k
lines removed (+220.7k added) across 1,498 files, much of it retired web routes
18
git-signing version tags in seven days, 0.5.2 → 0.16.0
★ Big outcome #1 · The week's headline

A community is now run by roles and consent, not by a single login

Think of a club's bank account. A small club might let the treasurer sign alone. A bigger one wants two signatures on large cheques, a notice period before a committee member is removed, and a record of who agreed. Until now our communities had the first model, with a few emergency extras. This week they got the second, and a small club can still choose the first, openly.

What changed. Administration is now built from permissions grouped into roles, built-in or custom, each with an explicit scope. A permission can have its own set of approvers. An operation that needs consent goes into an action list and completes on the N-th approval. Emergency (“break-glass”) ratification, join review and vetting review all live in the same list. Operator changes must be acknowledged. Removing rights is announced, cools off, and survives a crash part-way through. An administrator's phone approver can serve as the extra confirmation step, and the browser wallet can now answer that request too. The admin console updates live, and only ever receives a hint to re-read, never the data itself.

It reaches the code, too. A community's rights over its git repositories are now the same kind of permission as everything else, so there is one model of authority rather than two. A suspended member's git rights are withdrawn from the registry and the forge until the cooling-off ends. A new gate closes pull requests from people the policy doesn't allow, enforced by the git-signing bridge.

🎭
Roles grant permissions
Built-in or custom roles, each a named set of permissions with an explicit scope.
📋
Risky actions wait
A consent-gated operation sits in the action list until enough approvers say yes.
⏳
Removals cool off
Cutting someone's rights is announced first and takes effect only after a waiting period.
🌳
The forge follows
Git rights are permissions too: suspended means withdrawn on the forge, and disallowed pull requests are closed.
★ Big outcome #2 · What a community vouches for, and how

Hidden vetters reach the main line, and credentials get a version 1

Last week this page described working zero-knowledge vetting on local branches that were not pushed, not merged and behind main. This week those branches came up to date and landed. Alongside, the credentials a community issues moved to a new standard version, and a community can now vouch in its own name.

🕶️ Hidden vetters, merged

The community side (enrolling vetters, rate-limited vouching tokens, one-time challenges, proof checking, issuing admission) landed in the trust backbone. The applicant and vetter side landed in the community app, with its end-to-end test and a fixture each side checks against the other. Both now use the published proof library. It is still opt-in per community.

📜 Credentials v1

Role credentials, “vetted” and “witnessed” statements, identity credentials and an explicit issuer scope landed together in the trust backbone and the community app. A note went out to operators who wrote their own policy rules, since those rules see the new shape.

🏛️ A community vouches for itself

A community's own identity check is now recorded as a “vetted” statement, bound server-side to a pseudonym that is unique per person, and delivered to its subject. The community app keeps it and offers it as personhood evidence.

🛟 A lost credential can be rescued

An approved applicant whose credential never arrived used to be stuck. They can now ask the community to send it again, from the app with one key. The join flow speaks the newer join-request version and falls back to the older one.

Still to come. A pushed branch in the community app (one change, dated just after this window and not counted) adds badges that show a credential's post-quantum signing and whether a community uses hidden vetting. The proof library remains a research artefact that has not been audited.

The Quality Delta · last report → now

How much healthier is it than a week ago?

Counted the same way as the previous eleven reports, across the same eight Rust projects. Every starting figure below matches the ending figure Week 39 published. The browser wallet and the phone approver are written in TypeScript and Swift, so they add nothing to these counts. Their changes are included in the headline totals above.

Automated checks (run on every change; same eight projects)
16,029→16,979
▲ +950 checks (+5.9%), a twelfth consecutive rise. The trust backbone added 646, the community app 139 and git signing 102
Test stand-ins (fakes that let a component be tested without the rest of the system)
1,103→1,164
▲ +61 (+5.5%). Trust backbone +40, git signing +16
Future-proofed interfaces (surfaces that can gain a field without breaking everyone downstream)
555→578
▲ +23. Trust backbone +18, git signing +4, community app +1
Unused-code markers (lower is better, and this one moved the wrong way again)
154→159
▲ +5, worse, for a fourth week running. Much smaller than last week's +22, but still not falling. Trust backbone +4, identity-log host +1

In one line: a smaller but denser week. Fewer changes than last week, a large rise in checks, and the unused-code measure rising more slowly but still rising. Three honest notes. First, 302 against 430 is a real fall, with the same ten projects and the same method. Last week's total was swelled by git signing's forge work. Second, the removed lines are mostly deliberate. The trust backbone removed 59.5k lines and the identity-log host 28.8k, largely retired web routes and their tests, not lost features. Third, git signing's 18 version tags reflect a release after almost every dependency bump, not 18 sets of new features. And one about the reading itself: two of the ten local copies were behind the published main line when this ran (git signing by 15 changes, the browser wallet by 3), and the trust backbone's copy was on a docs branch. Every figure on this page comes from origin/main, not from those copies.

The Detail · 10 Projects in Scope

What changed, project by project

The published report tracks around eleven projects. This page covers the ten held locally, so the totals here are a minimum rather than the whole picture. Eight of the ten shipped something this week.

The trust backbone ★

ENGINE
The engine room: identities, communities, credentials, and the agent a person runs. (verifiable-trust-infrastructure)
  • Role-based administration: permissions and roles, custom roles, approver sets per permission, an action list completed on the N-th approval, second-party sign-off for removing admins or lowering thresholds, cooling-off with suspension, single-administrator mode, admin-key rollover, an approver device as a confirmation step, and a live console.
  • Git rights joined the same model: git-namespace rights are now permissions on the access entry, suspension withdraws them from the forge, and a new gate closes pull requests the policy does not allow.
  • The last unsigned routes retired: every call from the community's client, member actions, the policy and identity logs, website content and console signing keys are signed requests. The agent's superseded web routes went too.
  • Credentials v1 and hidden vetting: the new credential shapes, a community's own “vetted” statement delivered to its subject, re-sending a lost credential, and the hidden-vetter admission service, landed from last week's branch.
  • Fixes and speed: a round of fixes from the Keyring findings list (proof sets, verifying as received, delivery). A step-up passkey, once enrolled, is the only confirmation that counts. A key test set dropped from 16.3s to 3.6s, and the main service's suite from 1,098s to 893s.
Roles & approvalsCooling-offHidden vettingCredentials v1 146 changes · +144.3k

Git signing ★

TOOL
Signs and verifies git commits by identity, and governs forges. (verifiable-git-infrastructure)
  • The pull-request gate: the bridge reports new pull requests to the community and closes them on its order.
  • Talking privately: the bridge reaches the community, the agent and the trust registry over the secure-messaging protocol.
  • Easier to set up: the signing tool can create an identity and connect through the agent's message hub during setup, supports named profiles for several signing identities, and no longer changes git settings unless asked. The bridge is published with ready-built binaries and a setup command.
  • Tighter checks: a deactivated signer no longer verifies, only signing keys meant for signing are used, and an empty repository or range is refused.
PR gateBridge publishedNamed profiles18 tags 40 changes · +11.1k

OpenVTC, the community app ★

APP
The app a person uses to hold identities and join communities. (openvtc)
  • Hidden vetting landed: the vetter and applicant side of zero-knowledge admission, merged from last week's branch.
  • Credentials v1: keeps a community's own “vetted” statement and offers it as personhood evidence. Held statements get their own tab.
  • Joining that recovers: rescue an approved join whose credential never came, renew a membership, and keep talking to a community over the secure protocol once joined that way.
  • Ready to ship: publishable to crates.io, releases 0.3.1 and 0.4.0, starts on Windows, and the Repos panel now manages checkouts and commit signing.
Hidden vettingCredential rescue0.4.0 34 changes · +24.2k

The identity-log host

SERVICE
Publishes and witnesses identity histories. (affinidi-webvh-service)
  • The old management interface is gone from both the control plane and the edge, and the witness now accepts signed requests only.
  • Passkeys rebuilt: enrolment by signed request with hashed invites, separate confirmation passkeys that can be listed and revoked, and bearer tokens no longer kept in browser storage.
  • Sturdier: rate limits on incoming requests, periodic re-sync between edge and control plane, witnessed identities can be registered, and a deleted identity stops resolving at once.
Old interface removedPasskeysRate limits 30 changes · +32.0k −28.8k

The browser wallet ★

APP
The wallet that lives in the browser. (pnm-browser-plugin)
  • A per-community approver: the wallet can answer a community's request for extra confirmation, and vouch for a task-consent decision.
  • Sign-in bound to the page: signs in with the newer sign-in request and binds a session key; page-signed sign-ins are refused and old sign-in code removed.
  • Access lists: edit an entry's label and expiry, group a context's list, and clear a context's identity.
ApproverBound sign-in 25 changes · +5.5k

The developer kit

SDK
The shared toolkit every project here builds on, and the message hub itself. (affinidi-tdk-rs)
  • Across hubs: a secure-protocol relationship can start with someone on another hub, and a reply finds its sender.
  • Survives bad networks: the live connection recovers from sleep and dead networks, a streamed message is no longer lost to a timed-out waiter, and the hub resubscribes after its store restarts.
  • Stricter lookups: a deactivated identity no longer resolves, and a looked-up document whose ID doesn't match is refused. A batch of dependency upgrades moved the stack forward together.
Cross-hubReconnectsDependency wave 23 changes · +3.5k

The trust registry and chat bridge

SERVICE
Answering “is this party trusted?”, and bridging chat. (affinidi-trust-registry-rs, vti-message-bridge)
  • The trust registry took the new dependency set twice, releasing 0.20.2, 0.21.0 and 0.22.0. 3 changes
  • The chat bridge took the lookup fix so a deactivated identity no longer resolves. 1 change
Kept current 4 changes · +0.2k

The quiet projects

2 SHIPPED NOTHING
Scanned and unchanged, recorded so “unchanged” can be told apart from “not looked at”. (vta-mobile-agent-ios, affinidi-keri-rs)
  • The phone approver shipped nothing for a third week running. The gap has widened: the community now treats an approver device as an admin's confirmation step, and the browser wallet already answers that request. The phone app hasn't taken last week's signing changes or this week's.
  • The KERI library: a sixth quiet week, as a stable dependency. Unchanged since 23 August.
ScannedApprover must followStable dependency 0 changes
★ What's next · Put the new rules in front of real people

The rules exist. Now they need people using them, on every device.

Bring the phone approver up to date. It is now three weeks quiet while the community made an approver device part of how admins confirm risky actions. It is the standing risk on this page. Run the approval rules with a real community. Roles, approvals and cooling-off landed in three days; the next evidence is a community living with them, including one in single-administrator mode. Get the proof library reviewed. Hidden vetting is now on main, which makes an independent review of the research library the gate before any community switches it on. The badge branch that shows it to members is pushed and waiting. Turn on the git gate for real. The bridge is now published with a setup command; one community governing real repositories is the next step. And stop the unused-code rise. +5 is much smaller than last week's +22, but it is the fourth rise in a row.

📱
The approver follows
Three quiet weeks while it became part of how admins confirm. The app has to catch up.
🗳️
Approvals in use
A real community running roles, approvals and cooling-off day to day.
🔬
Review the proofs
Hidden vetting is merged. An independent review of the proof library comes before anyone relies on it.
🧹
Give the slip an owner
Unused-code markers are up four weeks running, +5 this week.