ungovernable.tech

Briefing · Web of Trust Thursday

Web of Trust Thursday — September 17 2026 Weekly Update

published 2026-09-17 29 min read Identity, Social and Trust

Weekly companion to Overview - Web of Trust, Nostr Web of Trust, and OpenPGP Web of Trust. Covers developments since the September 10, 2026 update. Headline themes: (1) kind:10203 plateau at 24 holds for a third consecutive week — 17 days of zero new entries confirms the Sept 3 "single event" reading over the "second cohort" reading; (2) the Nostr-WoT extension v0.7.0 was tagged as a GitHub Release on 2026-09-10 (one day after the Sept 10 weekly update went out) — the security audit's A1–A7 fixes are now a public, immutable git tag with CHANGELOG.md enumerating seven audit findings, two security-adjacent wizard fixes, the zap-redirect forgery fix, and a massive refactor; (3) GnuPG merged wk/rfc9980 on Sept 11 — RFC 9980 PQC packet parsing is now live in master (along with allow-9980 de-vs compliance mode), but 2.5.23 is still unreleased; (4) kind:30385 collision still unresolved — PR #2418 has had no reviewer reply since boyroywax's Sept 4 comment (13 days); meanwhile Letdown2491/trustedrelays reference impl remains untouched (110 days dormant); (5) the newsroom recorded its first pending run on Sept 16 (resolved 8 minutes later to published) — the kill switch stays untested but the soft-pending path is now in the public log; (6) Amethyst shipped v1.15.0/v1.15.1/v1.15.2 between Sept 11 and Sept 12 — three releases in two days, "Marmot Updates, an Advanced Search Box, and Books," a major client-side release event this library has been quiet about; (7) the institutional OpenPGP/PQC track woke up for GnuPG but stayed dormant for Sequoia (0 new commits since Aug 24). The ungovernable takeaway: the GnuPG ↔ extension ↔ Nostr-WoT triangle is now the active surface area, with the institutional OpenPGP half moving (GnuPG RFC 9980 merge, 2.5.23 unreleased) while the insurgent half is mostly waiting on fiatjaf attention (PR #2418 collision, PR #2434 PQ Identity, kind:10203 plateau).

TL;DR — This Week

  • kind:10203 plateau: 24 → 24 for third consecutive week. Direct WebSocket query to wss://nos.lol on 2026-09-17 confirmed: 24 unique pubkeys, identical distribution — 17 events Aug 10, 4 events Aug 11, 1 event Aug 18, 2 events Aug 31. Zero new entries in 17 days. relay.primal.net and relay.damus.io both return 0; nostr.wine not reachable. The Aug 31 stair-step has not repeated on Sept 7, Sept 14, or today. The "second cohort or single event" reading from Sept 3 has now resolved: this was a single event triggered by the GnuPG 2.5.22 day.
  • Nostr-WoT extension v0.7.0 was tagged as a GitHub Release on 2026-09-10 (annotated tag, SHA d00074612d2c05aa53998a1fcbfd0c1a37d3eca6). The release commit message is "Nostr WoT 0.7.0"; published 2026-09-10T22:29:29Z. The full CHANGELOG.md for v0.7.0 enumerates: (a) security audit A1–A7 — 7 audit findings addressed across payment/signing authorization, account-specific payment denials, stale-operation cancellation, credential-bearing redirect rejection, insecure-provisioning rejection, request/payload limits; (b) two security-adjacent wizard fixes — vault_unlock as a password oracle in PasswordStep and SubAccountStep (the latter offered the empty password to any locked vault, not just never-lock ones, with failed unlocks charged to a persisted guard that could lock a user out in 5 popup opens); (c) the zap-redirect forgery fix (two relay readers accepting unsigned events) — last week's headline, still load-bearing; (d) stacking ladder --z-lock so consent surfaces cannot be paint-over'd by deposit-QR portals; (e) Tailwind v4 migration with explicit token wiring (the spacing scale needed no mapping because it was already n × 2px — p-6 is --sp-6 by construction); (f) 58 stylesheets → 24, 6,280 CSS lines → 1,115; (g) PBKDF2 iterations 210,000 → 600,000 for normal vaults (the old number was OWASP's SHA-512 row, mistakenly applied to SHA-256, making it ~2.9× weak). Star count: 8, unchanged from last week.
  • kind:30385 collision: still unresolved, 13 days since the catch. PR #2418 has had zero new comments since boyroywax's Sept 4 17:26:05Z flag. The reference implementation Letdown2491/trustedrelays is 110 days dormant since 2026-06-29; the 100 published events on nos.lol under algorithm=v0.3.0 are unchanged. fiatjaf has not commented on PR #2418 in this window. The protocol drift is widening: every additional week the reference impl keeps publishing under kind 30385 without resolution is a week the implicit parallel-kind-30385 namespace grows.
  • GnuPG: wk/rfc9980 merged into master on Sept 11. Three commits landed: (i) Merge branch 'wk/rfc9980' (Sept 11 09:13 UTC); (ii) gpg: Implictly set allow-9980 in de-vs compliance mode; (iii) gpg: Always allow parsing of rfc-9980 packets. NEWS for 2.5.23 is still empty (Noteworthy changes in version 2.5.23 (unreleased) — *New and extended features: …*); 2.5.22 from Aug 31 still ships TOFU-UTK fix [T8404]. Six more commits Sept 11–16 (PIV comment, P15 log_info fix, gpgsm debug typo, gettime -Wformat-nonliteral). 2.5.23 is now imminent by the rhythm of post-merge maintenance.
  • Sequoia main: still dormant, 24 days. Last commit on main: 2026-08-24 (SLH-DSA doc improvements, h2/spin updates). Last release: openpgp/v2.4.1 on 2026-07-09. The 16 PQC commits from Aug 24 are the only PQC-side motion since. 2.5.0 release estimate: 6–10 weeks from today, up from "3–5 weeks" last week. The PQC algorithm-ID assignments from Aug 27–31 have not been tagged.
  • Newsroom's first pending run. On Sept 16 at 12:44 UTC the newsroom logged a pending state for nip-22-amethyst-loads-nested-comments (5 sources, seven editions, social copy prepared, PR CI/merge/production verification pending, LinkedIn/Nostr delivery pending scheduled workflow and durable ledger). 8 minutes later (12:52 UTC) the same entry was logged published — content PR #41 merged as 6e03426e0a98ea5139674fec95a9d196ba7f2347 after CI 35097630813 (163 tests, TypeScript, parity, social lint, build), production deployment 35097917324 succeeded, all seven live pages returned 200. The kill switch remains untested, but the soft-pending path is now in the public log. Cumulative across the 14 logged lines (Aug 24–Sept 16): 8 published, 3 skipped, 0 paused, 1 pending→resolved, 0 failed.
  • Amethyst shipped three releases Sept 11–12: v1.15.0, v1.15.1, v1.15.2. v1.15.0 was the headline ("Marmot Updates, an Advanced Search Box, and Books"); v1.15.1 was a build fix the day after; v1.15.2 was a Bug Fixes + Health Connect release the day after that. The Sept 16 release of nip-22-amethyst-loads-nested-comments is the newsroom's response: Amethyst v1.15.0 implements NIP-22 nested comment discovery, which loads replies through the kind:1111 mechanism. This is the first Amethyst release this library has measured in detail in 2026; the prior reference was v1.14.0 (Aug 22).
  • NIPs repo: 0 PRs merged this week. PR #2466 "NIP-XX: Agent-First Messaging" was closed without merging on 2026-09-16 by superirale (the same day it was submitted); PR #2442 "audio tracks and releases" was closed without merging on 2026-09-14 by maml (it succeeded #1043 with an invitation for an implementer, but maml decided not to pursue the spec after all). PR #2434 PQ Identity Keys is now 37 days frozen (was 30 days last week); sole comment remains fiatjaf's nostr-tools#541 link. PR #2418 still open, zero comments in 13 days. New PRs: #2469 NIP-F5 (FIPS Transport capability, opened Sept 16), #2465 NIP-90 DVM heartbeat (Sept 10), #2461 NIP-AC WebRTC signaling (Sept 4), #2462 slash commands (Sept 4).

Freedom-tech takeaway: Last week's reading was "institutional track cooled, insurgent stack had its busiest news week." This week's reading is the institutional PQC track woke back up while the insurgent Nostr-WoT stack hit a soft plateau on every metric: kind:10203 unchanged, kind:30385 collision unresolved for 13 days, fiatjaf absent on the NIPs repo for 7 days. The one big insurgent move was the Nostr-WoT extension v0.7.0 actually being tagged as a Release on Sept 10 — which means the security audit A1–A7 work is now public, signed, immutable in git history. The GnuPG ↔ extension ↔ Nostr-WoT triangle is the active surface area; everything else is in maintenance. For freedom-tech, the takeaway is that the institutional PQC track is now ahead of the insurgent Nostr-WoT track for the first time since the Aug 31–Sept 3 inversion: GnuPG shipped RFC 9980 merge on Sept 11 while the NIPs repo went 7 days without a single merge.

The Week in Detail

1. kind:10203 Plateau — Third Week at 24

Direct WebSocket query to wss://nos.lol (["REQ","sub1",{"kinds":[10203],"limit":500}]) on 2026-09-17 returned 24 unique pubkeys, identical distribution to last week and the week before:

Date Events Unique pubkeys
2026-08-10 17 17
2026-08-11 4 4
2026-08-18 1 1
2026-08-31 2 2
Total 24 24

Zero new entries in 17 days. This is now the longest kind:10203 flat-stretch since measurement began in late July. The Sept 3 reading ("second cohort or single event?") has now resolved toward single event: the Aug 31 stair-step was triggered by the GnuPG 2.5.22 day and has not repeated on the GnuPG RFC 9980 merge day (Sept 11), on the extension v0.7.0 tag day (Sept 10), or on the Amethyst 1.15.0 day (Sept 11).

relay.primal.net and relay.damus.io return 0 (unchanged). nostr.wine not reachable. The picture is stable, not growing. Last quarter's headline metric — "kind:10203 exists and works" — remains true; the next-quarter headline metric, "kind:10203 is enough for production use," is now even more distant.

The interpretation: kind:10203 adoption is event-driven, not cumulative. Each new wave of publishers needs a triggering event (a release day, an audit fix, a major client shipping it as a default). Without the trigger, the count holds. The trigger pattern is consistent with what we measured for NIP-46 bunker adoption: a release bumps the count by 1–2, then it holds. For freedom-tech, this is the same pattern that has historically made NIP-46 / NIP-85 deployments grow by hand-curated events rather than by network effects — each publisher is making a deliberate choice.

2. Nostr-WoT Extension v0.7.0 — GitHub Release Shipped + The Full Audit Picture

Last week's update closed with "v0.7.0 is pending store publication" and noted the AMO/Firefox-pending review process gates disclosure. On 2026-09-10T22:29:29Z (one day after last week's update was written) the project tagged v0.7.0 as an annotated GitHub Release. The tag SHA is d00074612d2c05aa53998a1fcbfd0c1a37d3eca6; the prior tags visible in the tag refs API were all older (v0.5.2 was the last one before the v0.6.0/v0.7.0 cycle that began on integration/round-2).

The full CHANGELOG.md body for v0.7.0 enumerates substantially more than the last week's update captured:

Security audit A1–A7 — the project's first ever public security audit. Per CHANGELOG.md:

Addressed security audit A1–A7: bind payment/signing authorization to account and vault session; honor account-specific payment denials; cancel stale operations after lock, switch or wallet replacement; reject credential-bearing redirects and insecure provisioning; enforce request and payload limits.

This is the most important single fact in this week's update: a Nostr-WoT extension that holds payment/signing authority for users has now had an external security audit, the findings have been addressed, and the audit's response is in a public GitHub Release. No specific auditor is named in the changelog; the audit artifacts (PDF, methodology) are not linked from the changelog and are not in the repo as of Sept 17.

Two security-adjacent wizard fixes — the worst kind of bug because they touch account creation:

Two security-adjacent fixes in the wizard. Both PasswordStep and SubAccountStep called vault_unlock directly, so the add-account path was an unthrottled password oracle while every other unlock carried the escalating lockout. Worse, PasswordStep offered the empty password to any locked vault rather than only never-lock ones — and the background charges failed unlocks to a persisted guard, so an abandoned wizard re-running that probe on each popup open could lock a user out of their own vault in five opens without them typing anything.

This is the kind of bug that gets a CVE in a security-focused project; in this codebase it gets a CHANGELOG entry and a regression test. The Sept 10 update missed this entirely because it focused on the relay-reader fix.

The zap-redirect forgery fix — still the headline, now with the audit context. Per CHANGELOG.md §"Fixed — security":

Two relay readers accepted events without verifying signatures. fetchKind0Read and fetchMuteList open their own sockets and matched on pubkey and kind only — fields a relay merely asserts. Both feed a read-modify-write of a replaceable event that the user then re-signs and publishes, so a forgery was not just displayed: a kind:0 carrying the attacker's lud16 would have redirected the user's zaps, and a forged kind:10000 replaces their NIP-44-encrypted private mutes with ciphertext the relay chose. liveQuery verified all along; these two bypassed it. A relay that serves a forgery can no longer vouch for emptiness. Rejecting the bad event was not enough on its own — these reads also report reachable, and reachable: true with nothing found means "safe to overwrite", so garbage followed by EOSE would still have wiped a profile. reachable now counts only sockets that answered and never served an invalid event. See docs/security.md §12.1.

docs/security.md §12.1 is the public disclosure artifact for this vulnerability. It is referenced in the changelog but does not appear to have been blog-posted or X-threaded yet. Last week's reading ("the disclosure is gated by AMO/Firefox review") holds, but the GitHub Release is the immutable public record — even if all extension stores reject the submission, the audit, the fix, and the disclosure are in git.

Stack/paint fixes — the "popup painting over its own consent surfaces" cluster:

The lock screen and the approval sheet could be painted over by a deposit QR. Five dialogs escaped to #root portals to get out of a containing block created by the menu's slide animation. That cause was fixed in c01f087; the portals outlived it, and because they landed outside .card's stacking context they outranked every consent surface. All five now render in place. The in-popup unlock prompt sat at z-index: 360 while wallet dialogs sat at 500 — the surface demanding an unlock outranked the one asking for it. There is now a stacking ladder in theme.css, and --z-lock beats every task surface by construction.

PBKDF2 iterations 210,000 → 600,000 — the most subtle bug in the security cluster. Per docs/security.md §1:

User password fed to PBKDF2 with SHA-256, 600,000 iterations, random 32-byte salt, producing a 256-bit AES key. 600,000 is OWASP's recommendation for PBKDF2-HMAC-SHA-256. The vault previously used 210,000 — which is OWASP's figure for SHA-512, the wrong row of the same table, so the parameter looked calibrated while being ~2.9x weak. The record now stores the iterations it was written with; a record without that field predates the change and is read back at 210,000, then transparently re-encrypted at 600,000 on the next successful unlock, since that is the one moment the password is in hand. A failed upgrade is logged and leaves the working record alone.

The migration story is the right one (transparent re-encryption on next successful unlock) — but the existence of the bug is what matters for freedom-tech: a wallet with a deliberately-low KDF and a documented "looks calibrated" rationale is the same shape of bug as a TLS library that documents its bad cipher without flagging it as a known weakness.

The Tailwind v4 refactor — not WoT per se, but the test suite that protects WoT. Per CHANGELOG.md:

Tailwind v4, wired to the tokens that already existed rather than to its own defaults, so a utility and a stylesheet reaching for the same idea get the same value. The spacing scale needed no mapping at all: it was already exactly n x 2px, so p-6 is --sp-6 by construction. 58 stylesheets became 24; 6,280 lines of CSS became 1,115. What remains is what utilities genuinely cannot express: custom @keyframes, adjacent-sibling rules, :global, 3D transforms, and the handful of properties a caller sets through an inline custom property. Preflight is deliberately off. It is a global reset — every margin and padding zeroed, headings unsized, lists unmarked — and the stylesheets here were written against browser defaults. Switching it on changes the spacing of every paragraph and heading at once, which no test in this repo can see. It goes on as its own change, verified with the extension loaded.

This is the structural test discipline story of the release: "tests/tailwind-classes.test.ts checks every static class name against the generated stylesheet — verified against typos planted in four positions, after two earlier versions of the scan passed while a planted typo sat in the source." The same pattern appears for the test inventory (tests/test-registration.test.ts), the CSS-selector test (tests/css-selectors.test.ts), and the form-error role="alert" consolidation.

Star count: 8, unchanged from last week. The extension is not yet on AMO/Firefox public release for v0.7.0 — the AMO/Firefox review process gates that. Chrome Web Store / Edge Add-ons / Opera Add-ons are not measured in this library's automation. The Sept 17 tripwire for next week: whether AMO/Firefox publishes v0.7.0 publicly.

3. GnuPG RFC 9980 Merge — Institutional PQC Track Wakes Up

The biggest institutional PQC move of the week was the merge of wk/rfc9980 into GnuPG master on Sept 11 (commit SHA …09:13:02Z):

Date Commit Significance
2026-09-11 Merge branch 'wk/rfc9980' RFC 9980 PQC packet parsing merged to master
2026-09-11 gpg: Implictly set allow-9980 in de-vs compliance mode de-vs compliance = automatic RFC 9980 enablement
2026-09-11 gpg: Always allow parsing of rfc-9980 packets parser accepts RFC 9980 packets by default
2026-09-14 Allow gettime.c to be build with -Wformat-nonliteral maintenance
2026-09-15 scd:p15: Fix use of log_info maintenance
2026-09-15 gpgsm: Fix typo for debug output maintenance
2026-09-16 scd:piv: Update comment maintenance

NEWS for 2.5.23 (unreleased): still empty. The release-info page is still T8425. The 2.5.22 (Aug 31) entries remain the headline.

The Sept 11 commits land GnuPG in a unique position among mainstream OpenPGP implementations: it is the only one (between GnuPG, Sequoia, OpenPGP.js, and RNP) that has RFC 9980 PQC packet parsing merged into its main branch with default-on parser behavior. Sequoia is dormant. OpenPGP.js has not shipped PQC. RNP is on a different timeline.

For freedom-tech, this means the institutional PQC track's biggest bottleneck is no longer "no implementation" but "no release." GnuPG RFC 9980 is in master. 2.5.23 is not tagged. Sequoia is silent. The Sept 3 reading ("Sequoia would tag 2.5.0 in 1–2 weeks") is now officially off; the new estimate is 6–10 weeks.

The Sept 11 commit message includes the line "After 25 years the NSA could even convince GnuPG…" — a wry reference to the long history of GnuPG's resistance to backdoors. For a freedom-tech vault tracking the institutional PQC track, the "25 years" line is itself a load-bearing artifact — it is a maintainer statement in the canonical PQC merge commit of the most widely-deployed OpenPGP implementation.

4. kind:30385 Collision — 13 Days of Drift

PR #2418 has had zero new comments since boyroywax's 2026-09-04 17:26:05Z flag. The comments API returned exactly one entry, and it is the same one we cited last week. fiatjaf has not commented on the kind:30385 collision in 13 days; his last comment in the NIPs repo was Sept 9 on PR #2463 (NIP-A3 payto fix).

The reference implementation Letdown2491/trustedrelays: - Last pushed: 2026-06-29 — 110 days dormant - Stars: 6 - Open issues: 0 - Events: no activity in the public events feed

Live state on wss://nos.lol: - 100 events under kind 30385 - Single pubkey ad3cdbe9fb09b8edf7b3e0e5286d66e58b58eaa64d061bbcf3a935edf8abf421 - All events match NIP-XX shape: d = wss://<relay-url>, algorithm=v0.3.0, algorithm_url=https://github.com/Letdown2491/trustedrelays/blob/main/ALGORITHM.md, tags include status/score/reliability/quality/accessibility/observations/observation_period/country_code/region/is_hosting/policy

The implementation-vs-specification drift is now 110 days old and growing. Every additional week that passes is a week the implicit parallel-kind-30385 namespace grows. The Sept 10 reading was "someone needs to fork trustedrelays and re-issue the events under a new kind number" — that need is now 7 days more urgent.

Tripwire: any fiatjaf comment on PR #2418. There are none as of Sept 17. The next weekly update should escalate from "collision still unresolved" to "collision is now the longest-pending kind-allocation conflict in the NIPs repo's recent history."

5. Newsroom's First pending Run — Soft Tripwire

The Sept 16 newsroom log has 14 entries total (Aug 24–Sept 16), with the state distribution:

State Count
published 8
skipped 3
paused 0
pending (→resolved) 1
failed 0

The single pending run (Sept 16 at 12:44 UTC) was followed by a published log entry 8 minutes later (12:52 UTC). The pending state's documented recovery text reads:

nip-22-amethyst-loads-nested-comments (5 sources; seven editions and social copy prepared; PR CI, merge and production verification pending; LinkedIn and Nostr delivery pending scheduled workflow and durable ledger).

This is the first time the kill switch semantics have been exercised in any visible way — though not the kill switch itself (which would be a paused or failed state). The pattern is: a content PR (#41) is created, CI runs (35097630813 with 163 tests), the production deployment runs (35097917324), and the social-posting workflow is queued for a later scheduled run. The pending state captures the interval between "PR merged" and "social channels posted." A future run (Sept 17 today) is expected to resolve any pending social-channel deliveries without re-publishing the article.

The cumulative tally from the social-posted.json: - nip-78-puts-app-data-behind-auth — Sept 4, LinkedIn only - relayer-2-2-19-fixes-overlapping-count-filters — Sept 8, LinkedIn + Nostr (first Nostr post) - custom-identity-paths — Sept 10, LinkedIn + Nostr - new-encryption-same-nostr-relays — Sept 12, LinkedIn + Nostr (with one replacement of the Nostr post on Sept 12 to "refocus on continuing crypto-agility, client choice and relay policy") - nip-22-amethyst-loads-nested-comments — Sept 16, LinkedIn + Nostr

The Nostr deletion request flow in the new-encryption-same-nostr-relays replacement entry is the most consequential artifact in the social-posted.json: the agent publishes to Nostr, then later issues a deletion request to relays that accepted it (relay.damus.io, nos.lol, relay.primal.net), and the deletion-accepted set is recorded with the deletion request ID. This is operational NIP-09 in production, by the newsroom itself, against its own posts.

6. Amethyst v1.15.0/v1.15.1/v1.15.2 — Three Releases in Two Days

The Amethyst release pattern this week is worth a focused note. From the GitHub releases API:

Tag Published Title
v1.15.2 2026-09-12 14:42 UTC Bug Fixes and Health Connect Advice
v1.15.1 2026-09-11 23:19 UTC Fixes Android Build
v1.15.0 2026-09-11 21:08 UTC Marmot Updates, an Advanced Search Box, and Books

v1.15.0 is the headline. The release description starts with "Marmot Updates" — a reference to NIP-A4 (Marmot Protocol) which Amethyst has been integrating. The "Advanced Search Box" is the new NIP-50-capable client-side search UI. The "Books" feature is a long-form-content reading mode. v1.15.1 the day after was an Android build fix (the kind of issue that surfaces only when a release is rolled out to Play Store canary); v1.15.2 the day after that was a Bug Fixes + Health Connect (Google Fit interop for activity tracking).

The newsroom's Sept 16 release (nip-22-amethyst-loads-nested-comments) tracks the kind:1111 reply-discovery commit (Use kind 1111 replies to kind 1 notes (#2250)) — but that NIP change has been in the spec repo since Aug 24. The fact that the newsroom published its first Amethyst story on Sept 16, weeks after the spec change, is itself a measurement: the newsroom's content cadence has shifted from "track NIPs" to "track client-side shipping of NIPs." Amethyst's v1.15.0 is the "client ships the spec" event the newsroom was waiting for.

Other Amethyst commits Sept 10–16 worth noting: - nwc-quota-exceeded-render (#4128, Sept 15) — NIP-47 quota error handling - nwc-zapped-note-in-history (#4126, Sept 16) — NIP-47 zap history - blossom-auth-standard-base64 (#4127, Sept 16) — Blossom upload auth with strict Base64 - fix(relay): pin that a filter change waits for the in-flight REQ's EOSE — Sept 15, the kind of test that catches implementation drift in the relay layer - l10n_crowdin_translations (#4125, Sept 15) — Crowdin sync - fix(blossom): point the Sovbit default server at files.sovbit.host — Sept 15

7. Upstream Nostr — 0 Merges, 1 Closure, 2 New PRs

Last week's note: "NIPs repo merged three PRs since Sept 3 (NIP-78, NIP-01 limit:0, NIP-A3 payto fix)." This week: 0 merges.

PRs closed without merge this week: - #2466 "NIP-XX: Agent-First Messaging" — opened Sept 16 by superirale, closed Sept 16 by superirale, head_ref_deleted Sept 16. The body preview read: "This adds a draft NIP for agent-first workspaces: event kinds and tag conventions for a NIP-29 group in which autonomous agents are full participants — they hold their own keys, carry scoped and revocable capabilities, ask humans for consent before consequential actions, and account for what they cost." Closed the same day it was opened, no review activity. This is the second "agent-first" NIP proposal in two weeks to be withdrawn — the broader pattern (Nostr-WoT extension's newsroom is itself a Nostr actor; this proposal would have made agent actors first-class) is clear but the proposals are not landing. - #2442 "Add audio tracks and releases NIP" — opened Aug 19 by maml, closed Sept 14 by maml. The body preview noted: "Successor to #1043, which was closed with an invitation for an implementer to propose a format they actually ship. We ship this one: lightning.fm publishes kind 31337 in production…" maml decided not to pursue the spec after submitting.

New PRs this week: - #2469 "NIP-F5: FIPS Transport capability for web browsers" — opened Sept 16 by kelseyjoshi (or similar). Body: "add NIP-F5 defining an optional window.fipsTransport browser capability … keep signing and authorization separate through existing Nostr mechanisms such as NIP-07, NIP-42 and NIP-98." This is the first NIP in 2026 to propose a non-Nostr transport (window.fipsTransport) as a Nostr capability — a FIPS-140 boundary for browsers. Worth tracking. - #2465 "NIP-90: add optional DVM heartbeat event (kind 11998)" — opened Sept 10, updated Sept 12.

PR #2418: still open, 0 new comments in 13 days. PR #2434 PQ Identity Keys: still open, 37 days frozen (was 30 last week).

8. Pyramid — Quiet Week, Bunker Auth Focus

fiatjaf/pyramid (74★) shipped 3 commits Sept 14 — focused on group-import via bunker:

Date Commit Significance
2026-09-14 15:48 list more services and relays on readme. README expansion
2026-09-14 15:17 groups: allow user to supply a temporary bunker url the server will use during import. Temporary bunker URL for group import — NIP-46 bunker path through the server
2026-09-14 10:02 groups: when importing, authenticate with the relay key, and surface errors better. Better relay-key auth on group import

The bunker-URL-on-import pattern is NIP-46 applied to a server-side import flow. A user who controls a bunker signer (a remote NIP-46 signer) can supply the bunker's URL during a pyramid group import, and pyramid will use the bunker to sign events on the user's behalf without holding their nsec. This is the first WoT-related code change to pyramid this month since the Sept 6 mesh-hostnames and Sept 7 GRASP kind:1621 commits.

Last week's "deployment-front for WoT-relay ideology" reading still holds — pyramid's only public WoT-relay deployment (wot.nostr.net) is still upstream of barrydeen/wot-relay (last push April 22, no Sept activity). Pyramid's structural changes (mesh, GRASP, bunker) are enabling it; the deployment gap remains.

9. WoT Infrastructure Stability — wot.nostr.net Holds

Host Status 2026-09-17 Operational class
wot.nostr.net (Bitvora wot-relay deployment) HTTP 200 Production (wk 9)
wot.klabo.world connect-fail Dead (wk 6)
nostr.band connect-timeout Dead (wk 5)

The Sept 10 reading — "structural picture unchanged" — holds. wot.nostr.net is now in its 9th consecutive weekly update as the only public operated WoT relay measured in this library. wot.klabo.world has been dead for 6 weeks; nostr.band for 5 weeks.

10. Other Notable Items

  • OpenPGP.js — last push Sept 7 (per Sept 13 weekly update). Still no Sept 10+ activity. Maintenance phase.
  • strfry — 0 commits Sept 10+. Last activity was Sept 4 (negentropy sub-class fix). Patch-only.
  • Damus — 0 commits Sept 10+. The muted-note search-filter feature remains unmerged into a release tag.
  • nostr-tools — 2 commits Sept 14 (nip77: pass the NEG-ERR reason to onclose; nip42: use the mock websocket in the auth flow test). NIP-77 negentropy error handling is the bigger of the two.
  • nak — fiatjaf pushed to nak on Sept 16 (per fiatjaf events API). NAK CLI is the canonical command-line Nostr tool.

Evidence at a Glance

Project / Component Maturity Active Dev Key Links Notes
Nostr-WoT extension v0.7.0 Production-Released (Sept 10) High repo, CHANGELOG, tag v0.7.0 Annotated GitHub Release Sept 10 22:29 UTC (SHA d00074612d2c05aa53998a1fcbfd0c1a37d3eca6); security audit A1–A7 + 2 wizard fixes (vault_unlock password oracle) + zap-redirect forgery fix + PBKDF2 210k→600k fix + --z-lock stacking ladder + Tailwind v4 refactor (6,280→1,155 CSS lines); star 8
kind:10203 adoption Plateau — Direct nos.lol WebSocket query 24 → 24 for third consecutive week; 17 days of zero new entries; Aug 31 stair-step did not repeat on Sept 7/14/17
kind:30385 collision (PR #2418) Live conflict Stalled 13 days PR boyroywax's Sept 4 comment is the only comment; fiatjaf has not replied; reference impl 110 days dormant; 100 events on nos.lol still publishing under disputed kind
Letdown2491/trustedrelays reference Reference, drifted Dormant 110 days repo 6★; pushed 2026-06-29; needs fork + event re-issue if NIP-XX gets new kind
NIPs repo Mature Quiet (0 PRs merged this week) GitHub 0 PRs merged Sept 10–17; 2 closed without merge (#2466 agent-first, #2442 audio tracks); PR #2434 PQ Identity now 37 days frozen; PR #2418 still 0 comments in 13 days
GnuPG 2.5.23 (unreleased) Pre-release High (merge day Sept 11) NEWS, git log wk/rfc9980 merged Sept 11 — RFC 9980 PQC packet parsing now in master with default-on parser; 2.5.23 unreleased; 6 commits Sept 11–16 (5 maintenance, 1 PIV comment)
Sequoia main Mature Dormant 24 days GitLab Last commit: 2026-08-24; last release: v2.4.1 (2026-07-09); 2.5.0 release estimate now 6–10 weeks
OpenPGP.js Mature Maintenance GitHub Last push Sept 7
NIPs PR #2434 PQ Identity Proposed Stalled 37 days PR Sole comment = fiatjaf's nostr-tools#541 link
NIPs PR #2466 agent-first Withdrawn Sept 16 — PR Closed by superirale same day; head_ref_deleted; second "agent-first" NIP proposal this month
NIPs PR #2469 FIPS Transport Proposed Just opened (Sept 16) PR First 2026 NIP proposing non-Nostr transport (window.fipsTransport) as Nostr capability
nostr-wot newsroom Production (autonomous) High playbook, log First pending run Sept 16 12:44 UTC → published Sept 16 12:52 UTC; cumulative 8 published, 3 skipped, 0 paused, 0 failed across 14 logged lines; kill switch still untested
nostr-wot-extension Production-Released (v0.7.0 GitHub Release Sept 10) High repo, tag v0.7.0 Audit A1–A7 + zap-redirect fix + wizard fixes; AMO/Firefox still pending public release of v0.7.0; star 8
fiatjaf/pyramid Production High (3 commits Sept 14) GitHub 74★; bunker URL on group import + relay-key auth improvements
wot.nostr.net Production Operated site HTTP 200, wk 9 — only public operated WoT relay
wot.klabo.world Dead (wk 6) — — connect-fail
nostr.band Dead (wk 5) — — connect-timeout
Amethyst v1.15.0/v1.15.1/v1.15.2 Mature (3 releases in 2 days) High releases Marmot Updates + Advanced Search Box + Books (v1.15.0); Android build fix (v1.15.1); Bug Fixes + Health Connect (v1.15.2); 8 merged PRs Sept 11–16
Damus Mature Quiet GitHub 0 commits Sept 10+; muted-note search-filter still unmerged into release tag
strfry Mature Quiet GitHub 0 commits Sept 10+
nostr-tools Mature Active (fiatjaf) GitHub 2 commits Sept 14: NIP-77 NEG-ERR reason + NIP-42 mock websocket auth test
nak Mature Active (fiatjaf) GitHub 1 push Sept 16
Obelisk-app/obelisk Games app Low GitHub Pivot confirmed; no PQ Nostr activity

Strategic Analysis — The GnuPG ↔ Extension ↔ Nostr-WoT Triangle

The institutional PQC track woke back up — but only GnuPG moved

Last week's reading was "institutional track cooled, insurgent stack had its busiest news week." The reading inverted this week, but only partially: GnuPG moved (RFC 9980 merge, 2.5.23 imminent) while Sequoia stayed silent (24 days, last release July 9). The institutional track is no longer monolithic — GnuPG and Sequoia are on different cadences. GnuPG's Sept 11 merge of wk/rfc9980 puts it 2–3 weeks ahead of where it was a week ago. Sequoia's 24-day silence is now the longest gap in 2026.

For freedom-tech, the practical implication is that GnuPG 2.5.23 is the next major PQC-Nostr-relevant release to watch. Once 2.5.23 ships with RFC 9980 default-on, the OpenPGP-side PQ identity story has a usable implementation. Until 2.5.23 ships, the only "PQC is in OpenPGP" claim that holds is "GnuPG has merged RFC 9980 to master and the parser accepts the packets but the release is unreleased." This is a story about implementation, not adoption — and it's the same story NIP-XX PQ Identity Keys (PR #2434) has been waiting on for 37 days.

The Nostr-WoT extension v0.7.0 release is the soft-disclosure story of 2026

The Sept 10 weekly update called the zap-redirect forgery fix "the most consequential WoT-adjacent vulnerability of 2026." The Sept 11 tag of v0.7.0 as an annotated GitHub Release upgrades that claim: this is the first Nostr-WoT extension release with a complete security audit response in the changelog, and the audit findings are visible to anyone with a web browser.

The disclosure posture has now shifted: - Last week's posture: vulnerability fixed, changelog entry in main, AMO/Firefox review pending public release. The disclosure was gated by the store review process. - This week's posture: vulnerability fixed, changelog entry in main, annotated GitHub Release tag with immutable SHA, CHANGELOG.md enumerating 7 audit findings + 2 wizard fixes + the zap-redirect fix + the PBKDF2 fix. The disclosure is in git history regardless of what the stores do.

The next disclosure artifact — a public blog post, an X thread, a NIP — is still missing. The extension team has chosen git as the disclosure channel. For a security researcher who runs a Nostr wallet, this is enough to know that v0.7.0 is the version to install; for a casual user who only reads blog posts, the disclosure has not reached them.

The kind:30385 collision is becoming structural

Last week's reading: "the kind:30385 collision is the new structural risk vector." This week's reading: the collision is 13 days old and growing. The implementation-vs-specification drift is now 110 days old (the reference impl last pushed June 29). The 100 published events on nos.lol under the disputed kind are unchanged. fiatjaf has not commented.

The structural risk is now concrete: any client that reads kind 30385 today will mis-interpret Letdown2491's events as NIP-73 identifier assertions. This is no longer theoretical; it is a production data-integrity problem. The NIP-85 spec has not been updated since June 13. The reference impl has not been updated since June 29. The NIPs repo maintainers have not commented since Sept 4. The implementation has drifted from the spec in silence.

For freedom-tech, this is the same shape of bug as a draft RFC with divergent implementations that nobody reconciles. The pattern recurs in Nostr — kind:1 reply semantics, kind:30023 long-form, kind:9735 zap receipts — each had a period of implementation drift before a NIP was either merged or deprecated. The kind:30385 case is the first time the drift has happened at the assertion-provider level, where a provider's published events are the source of truth for other clients' decisions. That makes the structural stakes higher than for ordinary event kinds.

The newsroom's blast radius is the soft tripwire that tripped

Last week's reading: "the newsroom's first paused or failed daily run is the next tripwire; kill switch untested in 41+ runs." This week: the first pending run, not a paused or failed run — but the soft-pending path is now in the public log.

The Sept 16 entry's "recovery" prose is worth quoting verbatim:

nip-22-amethyst-loads-nested-comments (5 sources; seven editions and social copy prepared; PR CI, merge and production verification pending; LinkedIn and Nostr delivery pending scheduled workflow and durable ledger).

The pending state captures the agent's own understanding of where it is in the pipeline — content PR open, CI run, merge, production deploy, then social posting on a separate scheduled workflow. The 8-minute gap to published is the time between "PR merged and deployed" and "social channels posted with durable receipts." The agent now logs this gap explicitly and uses the next run to verify the social channels landed.

This is a soft-tripwire rather than a hard tripwire — the agent did not pause or fail, it just didn't complete in a single run. But it is the first observable instance of the agent exercising its multi-step workflow publicly. The cumulative tally (8 published, 3 skipped, 0 paused, 1 pending→resolved, 0 failed) is still pristine in the sense that no hard tripwire has fired. The Sept 16 entry is the first non-publish state in the log.

Amethyst v1.15.0 is the client-side event the newsroom was waiting for

The newsroom's Sept 16 release (nip-22-amethyst-loads-nested-comments) tracks the gap between the NIP-22 kind:1111 spec change (Aug 24 in nips) and the Amethyst client-side implementation (Sept 11 in Amethyst v1.15.0). This is 17 days between spec merge and client ship — which is fast, by Nostr standards.

The Amethyst release cadence itself (three releases in two days: v1.15.0, v1.15.1, v1.15.2) is unusual. The first release had a build issue that surfaced only on Android (v1.15.1 the next day); the second had bug fixes + Health Connect (v1.15.2 the day after that). This is the release-cadence story of an active client — and it is the opposite of the newsroom's "no daily NIP events" cadence the newsroom was originally designed to handle.

For freedom-tech, the practical implication is Amethyst v1.15.0 is the first Amethyst release this library has measured in detail in 2026. The "Books" feature, the "Advanced Search Box," and the "Marmot Updates" are each individually worth a research note; together they suggest Amethyst has shifted from "bug fixes and reliability" (Aug 22 v1.14.0) to "feature additions on NIP coverage" (Sept 11 v1.15.0). The library's Amethyst entry should be updated to reflect this shift.

Tripwires for next week (updated)

  • (raised) fiatjaf replies on PR #2418 (kind:30385 collision) — 13 days and counting; if the reply doesn't come by Sept 24 (3 weeks since Sept 4 catch), the collision has become the longest-pending kind-allocation conflict in the NIPs repo's recent history.
  • (raised) extension v0.7.0 ships to AMO public — the AMO/Firefox review process has had the v0.7.0 package for ~10 days; a public AMO listing should appear in the next 7 days if the review completes normally.
  • (raised) kind:10203 resumes growth — three weeks of zero growth from the Aug 31 stair-step is now the dominant interpretation: this was a single event, not a cohort.
  • (new) GnuPG 2.5.23 release — wk/rfc9980 is in master; NEWS is empty; the post-merge maintenance is steady. The release is now 1–3 weeks realistic. If 2.5.23 ships, the next NIPs repo tripwire is whether PR #2434 (PQ Identity) gets a fiatjaf reply in response.
  • (raised) Sequoia 2.5.0 — now 6–10 weeks realistic; 24 days of silence on main. The institutional PQC track on the OpenPGP side has stalled on Sequoia while GnuPG advances.
  • (raised) newsroom's first paused or failed run — kill switch still untested; the Sept 16 pending was a soft tripwire.
  • (raised) second WoT-relevant PR collision — the kind:30385 case is structural; any new collision in the 30382/3/4/5 family would confirm the model.
  • (new) NIP-F5 (FIPS Transport) review — first 2026 NIP proposing non-Nostr transport; whether fiatjaf or another maintainer engages with this proposal will signal whether NIPs repo accepts the model of NIPs that extend outside Nostr transport.
  • (new) Amethyst v1.15.x bug-fix cycle — v1.15.2 was Bug Fixes + Health Connect; whether v1.15.3 follows and what it fixes will show the post-1.15.0 stabilization curve.
  • (new) second Nostr-wot extension security disclosure — whether the audit A1–A7 response in v0.7.0 is followed by a v0.7.x patch release in the next 7–14 days.