Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
3084497
Start the branch changelog: homebrew guarded by default
codeGlaze Oct 20, 2026
05b9539
Measure what malformed homebrew crashes, and the design to stop it
codeGlaze Oct 20, 2026
27c7af8
The junk audit reaches pages, share links and imports, and counts sil…
codeGlaze Oct 20, 2026
c9ef984
The junk audit's baseline on integration: 498 failures over 46 fields
codeGlaze Oct 21, 2026
907b8e2
The guard design read against our own documents
codeGlaze Oct 21, 2026
cd1e943
The homebrew shape table, a junk audit in 8 minutes, and a faster dee…
codeGlaze Oct 21, 2026
7557ebf
The guard design as agreed: checks where homebrew comes in and where …
codeGlaze Oct 21, 2026
caf5df4
Guard design: the check runs in a global interceptor on every library…
codeGlaze Oct 21, 2026
ca8b7d6
The junk audit's checks each catch a planted failure, and count what …
codeGlaze Oct 21, 2026
538fae1
Check every homebrew library change against the shape table
codeGlaze Oct 22, 2026
2ce7925
Check homebrew where the app reads it, not only where it is written
codeGlaze Oct 25, 2026
d63d8ff
Offer homebrew boons and invocations under their stored key
codeGlaze Oct 25, 2026
a17f2f7
Harden the helpers every option passes through, ranked by the unguard…
codeGlaze Oct 25, 2026
0775732
A homebrew addition that breaks a class or race costs only itself
codeGlaze Oct 26, 2026
625f92d
An event that throws says so and changes nothing
codeGlaze Oct 26, 2026
724d305
A homebrew entry that cannot be drawn costs its own part of the page
codeGlaze Oct 26, 2026
3ee4ad5
The share banner names the shared homebrew it cannot use
codeGlaze Oct 26, 2026
0303dc4
Plain words in what people read about set-aside homebrew
codeGlaze Oct 26, 2026
16ade19
Move the view guards out of views.cljs into views/guards.cljs
codeGlaze Oct 26, 2026
a2d63b6
Move the set-aside and write-check logic out of events.cljs into home…
codeGlaze Oct 26, 2026
8a50173
One repair path: fold e5/mend-* into homebrew-shapes
codeGlaze Oct 26, 2026
59f255e
Put the view guards back in views.cljs
codeGlaze Oct 26, 2026
06c054f
Merge integration into feature/guarded-homebrew
codeGlaze Oct 27, 2026
c878e98
Merge integration into feature/guarded-homebrew
codeGlaze Oct 29, 2026
c804ea5
Docstrings for the guard's helper functions and tests
codeGlaze Oct 29, 2026
097f983
Merge integration into feature/guarded-homebrew
codeGlaze Oct 29, 2026
091cee5
Offer a homebrew subclass under its stored key, so one named "x" or w…
codeGlaze Oct 29, 2026
84e381c
Test that a homebrew subclass is offered under its stored key
codeGlaze Oct 29, 2026
603853b
Branch changelog: homebrew subclasses are offered under their stored key
codeGlaze Oct 29, 2026
04e153b
Point guard comments at the KB page; the design doc moves to agents/d…
codeGlaze Oct 29, 2026
14b0603
Guarded homebrew: fix the review's findings (leading-zero numbers, mo…
codeGlaze Oct 29, 2026
71d9301
Test the review's fixes: leading-zero numbers, monster scores, lone a…
codeGlaze Oct 29, 2026
c1b4d2b
Add the agent-trailers PR check; rename a shadowing test local
codeGlaze Oct 29, 2026
90838e7
Fold the branch changelog into the Summer Patch
codeGlaze Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/workflows/agent-trailers.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Guard: no commit in a pull request carries an agent attribution trailer or a session link.
# The commit-msg hook strips them where it is armed; a cloud session's first commits can precede
# that setup, and the PR is the last place a reword is still possible.

name: Agent trailers

on:
pull_request:
branches: [integration, develop, main]
types: [opened, synchronize, reopened]

permissions:
contents: read

jobs:
no-agent-trailers:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Scan the pull request's own commits
env:
BASE: ${{ github.event.pull_request.base.sha }}
HEAD: ${{ github.event.pull_request.head.sha }}
run: |
bad="$(git log --format='%h %s%n%b' "$BASE..$HEAD" |
grep -iE '^(Co-Authored-By:[[:space:]]*Claude|Claude-Session:|Generated with \[?Claude Code)|claude\.ai/code/session' | head -10 || true)"
if [ -n "$bad" ]; then
echo "::error::Commits in this pull request carry agent attribution trailers or session links:"
echo "$bad"
echo "Reword them (git rebase; git commit --amend for the tip) and force-push the branch."
exit 1
fi
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,16 @@ Homebrew can be moved, switched off and repaired instead of lost, and a characte
- **Server:** the first start after upgrading builds new database indexes and gives older accounts an email lookup key, both in the background; until that finishes, an older account with a mixed-case address signs in by username rather than email. (#721)
- **Site:** tick boxes are rounded and fill with the theme's accent when ticked (amber in the dark
theme, blue in the light), and the sign-up page's updates box matches the rest.
- **Homebrew:** a value in the wrong form whose meaning is plain (`"25"` for a speed, one trait
where a list belongs) is corrected once, on load, import, save or from a share link, and the
correction is what is stored and exported. A library saved before is backed up first.
- **Homebrew:** an entry with a field that cannot be read (a number where a list of traits
belongs) is set aside in My Content for repair, as it was written, instead of breaking pages.
From a share link it is left out.
- **Homebrew:** the import report lists each field it fixed, and each entry it will set aside
for repair.
- **Homebrew:** checking homebrew after an import or a Restore takes a fraction of the time for
classes: each shared part of a class is checked once, not once per level.

### Fixed

Expand Down Expand Up @@ -210,6 +220,31 @@ Homebrew can be moved, switched off and repaired instead of lost, and a characte
- **Characters:** a monk with a low Strength no longer attacks at +0 with a weapon Martial Arts does not cover; the attack uses the real modifier (#713).
- **Site:** all seven header tabs and their menus fit on a 320px phone.
- **Spells:** a spell can no longer be prepared once every preparation is used.
- **Site:** an action that fails now says so and changes nothing. Before, nothing visible
happened, and the actions queued after it were dropped.
- **Sharing:** the banner for a shared character names the homebrew it carried that cannot be
used: entries that could not be read, and subraces or subclasses whose race or class was not
shared.
- **Homebrew:** a homebrew entry that cannot be drawn costs its own part of the page: one section
of its builder (the rest still edits and saves), one list or source in My Content, one row of
the monster list. Before, the whole page fell over.
- **Homebrew:** a library with a content section stored as `true` no longer stops the app from
starting.
- **Homebrew:** a monster from a share link with a broken name, size or type no longer breaks the
monster list.
- **Homebrew:** a subrace, subclass, boon or invocation whose name could not be read no longer
disappears without a word; it is set aside for repair.
- **Homebrew:** a feat whose ability score increases were stored as a list no longer breaks its
builder.
- **Homebrew:** a homebrew subrace, subclass, pact boon or eldritch invocation that was renamed, or
given a new key on import to settle a conflict, stays picked on the characters that chose it.
- **Homebrew:** a homebrew subclass with a very short name, or none, is offered in the character
builder. Before, its class was there and the subclass was missing.
- **Homebrew:** a background, feat or class granting a skill that does not exist no longer breaks
the character builder.
- **Homebrew:** a homebrew subclass, invocation or boon that breaks a built-in class costs only
itself: it is set aside, named, and the class is still in the builder. Before, every built-in class
disappeared from the builder. A subrace that breaks is set aside on its own, not with its race.

### Security

Expand Down
Loading
Loading