Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
373 commits
Select commit Hold shift + click to select a range
d6213b6
fix: keep grouped-focus sub-choice names faithful to the SRD class
codeGlaze Aug 30, 2026
23eb07c
Validate the sheet style id instead of interpolating it into a path
codeGlaze Aug 30, 2026
2950117
harden: never silently drop a non-pool starting-equipment sub-choice
codeGlaze Aug 31, 2026
6f49478
feat: starting-equipment override ledger — pure derive/resolve engine
codeGlaze Aug 31, 2026
e37d2d4
docs: record the PDF size measurements, including a wrong turn
codeGlaze Aug 31, 2026
60c6eb8
docs: how the orphaned widgets got there, and where to fix them
codeGlaze Aug 31, 2026
15c6e54
docs: measure colour per sheet style, correct the style 4 claim
codeGlaze Aug 31, 2026
045d2a4
docs: narrow the PDF orphan problem to style 1, the only public sheet
codeGlaze Aug 31, 2026
9850ba4
docs: styles 2-4 are lean because they drop fields, not because they …
codeGlaze Aug 31, 2026
8172e91
refactor: lean keyless starting-equipment delta (no minted keys)
codeGlaze Aug 31, 2026
be43690
feat: wire starting-equipment delta into export/import (delta lives o…
codeGlaze Aug 31, 2026
5e1ef68
docs: spike generating spell pages on demand instead of pre-baking seven
codeGlaze Aug 31, 2026
3a0fc04
dev: level 20 wizard fixture, and three bugs it immediately exposed
codeGlaze Aug 31, 2026
da1ef47
dev: add a four-class multiclass fixture, widening the clipping bug
codeGlaze Aug 31, 2026
83c1f20
dev: eight-class fixture, and fixtures now report silently dropped fi…
codeGlaze Aug 31, 2026
ce2b51a
dev: fill features-and-traits-2, and retract two bugs that were fixtu…
codeGlaze Aug 31, 2026
bcc05aa
feat: 'Based on <class>' indicator + Detach, and a browser regression…
codeGlaze Aug 31, 2026
07a1fa1
docs: verify against a production export; fix inverted ability fields
codeGlaze Aug 31, 2026
0a77d84
docs: retract the negative-numbers bug, which was my renderer not the…
codeGlaze Aug 31, 2026
271056b
docs: re-verify the clipping bug by measurement instead of pixels
codeGlaze Aug 31, 2026
23ef685
docs: calibrate the hyphen finding between the alarm and the dismissal
codeGlaze Aug 31, 2026
9f89d9e
fix: 'Based on <class>' uses the app's callout system, not a bespoke box
codeGlaze Aug 31, 2026
d4f48b7
dev: prove spell pages can be generated on demand with unique field n…
codeGlaze Aug 31, 2026
c52b956
docs: knowledge base for the PDF form techniques, and a build plan
codeGlaze Aug 31, 2026
0d563db
refactor: legacy-migration notice uses the callout system; document t…
codeGlaze Aug 31, 2026
ad6d33c
docs: the overflow cutoff is a font size, not a word count
codeGlaze Aug 31, 2026
fe2a3e9
Prune orphaned widgets, report unplaceable fields, and add fit-text
codeGlaze Aug 31, 2026
835ae3f
Rewrite the pdf namespace docs around what actually bites
codeGlaze Aug 31, 2026
c17569b
Cut reviewer-facing narrative out of the pdf comments
codeGlaze Aug 31, 2026
eab4fa2
Rewrite pdf comments as reference documentation
codeGlaze Aug 31, 2026
4621b4c
refactor: lift notification view components into views.notifications
codeGlaze Aug 31, 2026
e7ca257
Apply the house comment style to the pdf and security changes
codeGlaze Aug 31, 2026
ba9db37
Remove the remaining knowledge-base links and coined terms from comments
codeGlaze Aug 31, 2026
5d015a6
Warn that multiple-ip-attempts-to-same-account? has no callers
codeGlaze Aug 31, 2026
05840e9
test: browser regression for the notification components after the lift
codeGlaze Aug 31, 2026
439f445
Spill overflowing text onto continuation pages, and fix a hang in spl…
codeGlaze Aug 31, 2026
fa83619
Raise the spill threshold to 8pt and count capacity in lines
codeGlaze Aug 31, 2026
25f5d9a
refactor: finish the notifications migration — banners render through…
codeGlaze Aug 31, 2026
7b51381
Generate spellcasting pages for classes past the template's last
codeGlaze Aug 31, 2026
0296d84
Give every form field its own name
codeGlaze Aug 31, 2026
858e5ab
test: browser acceptance for the notification surfaces
codeGlaze Aug 31, 2026
94fa2fc
Name every checkbox after what it does
codeGlaze Aug 31, 2026
f956c69
Bake the static template cleanups into resources/ instead of every re…
codeGlaze Aug 31, 2026
47c413b
dx: make it obvious the full app runs locally for e2e
codeGlaze Aug 31, 2026
581513a
Shrink a single-line value that is wider than its box
codeGlaze Aug 31, 2026
29fd42c
Add a browser check of the PDF export, and stop reporting options as …
codeGlaze Aug 31, 2026
f9ca6ae
Read the exported PDF by intercepting the route
codeGlaze Aug 31, 2026
dfb0d07
Assert the exported PDF's contents, not just that it is a PDF
codeGlaze Aug 31, 2026
10ec0dc
Cover multi-page sheets in the browser check
codeGlaze Aug 31, 2026
dd1bf01
Mark a class's later spell pages as continuations
codeGlaze Aug 31, 2026
a0c004d
docs: bring branch changelog up to date
codeGlaze Aug 31, 2026
3f8ef25
Merge feat/starting-equipment into integration
codeGlaze Aug 31, 2026
b4e9946
changelog: fold starting-equipment into [Summer Patch]
codeGlaze Aug 31, 2026
0d9aa18
changelog: add the folded starting-equipment content to CHANGELOG.md
codeGlaze Aug 31, 2026
fb663ae
Let a spell level box be relabelled, so a spare box can take another …
codeGlaze Sep 1, 2026
6201cff
Draw the level relabel as the hexagon's shape, not a rectangle
codeGlaze Sep 1, 2026
587fe94
Correct the hexagon offset, found by stroking the patch
codeGlaze Sep 1, 2026
331a167
Size the level patch by what it must not cover, and measure it
codeGlaze Sep 1, 2026
ddcab59
Stop the patch scale option shadowing pdf/scale
codeGlaze Sep 1, 2026
cab51a0
Let the cantrips box carry a spell level too
codeGlaze Sep 1, 2026
e371c19
Split fields that span pages, so nothing mirrors between spell pages
codeGlaze Sep 1, 2026
eb1d542
Place the reused cantrips box's slot labels off the printed ones
codeGlaze Sep 1, 2026
bc9ba8a
Make the browser checks cover every caster, and drop the fixed sleeps
codeGlaze Sep 1, 2026
9cec587
Record what this work established, and guard it on the templates
codeGlaze Sep 1, 2026
1a714de
Add the branch changelog, and require clojure.string in common_test
codeGlaze Sep 1, 2026
be1701d
Give the reused cantrips bar the inputs its labels name
codeGlaze Sep 1, 2026
5189129
Measure the spell row, and correct what the plan said about it
codeGlaze Sep 1, 2026
9fe47b6
Measure what page packing is worth, and mock three shapes of it
codeGlaze Sep 1, 2026
e355162
Correct what classes-in-columns is worth, and settle on it
codeGlaze Sep 1, 2026
d97e9e0
Find where a spell page should break, and correct two claims
codeGlaze Sep 1, 2026
b1ec19d
Root the spell page grouping in what 5e keeps separate
codeGlaze Sep 1, 2026
dc0923a
Measure what a concentration and component flag would cost a row
codeGlaze Sep 1, 2026
17f3797
Find why an inline concentration flag does not scan
codeGlaze Sep 1, 2026
45fda48
Measure what a per-row annotation costs the file
codeGlaze Sep 2, 2026
63a1b6a
Find where a field's weight actually is, and how to share it away
codeGlaze Sep 2, 2026
17e75b3
Show that shared appearances break editing, and stop calling read-onl…
codeGlaze Sep 2, 2026
506e49e
Share one appearance between checkboxes that draw the same thing
codeGlaze Sep 2, 2026
10e5ffc
Explain why appearance sharing pays for ticks and not for text
codeGlaze Sep 2, 2026
4608ca6
Record what a form field actually weighs
codeGlaze Sep 2, 2026
1f66f9b
Ship one copy of a page image a template uses twice
codeGlaze Sep 2, 2026
b0f9efc
Repack the raster sheets' images with a PNG predictor
codeGlaze Sep 2, 2026
c620960
Record that the templates ship the same artwork seven times
codeGlaze Sep 2, 2026
bb9eab6
Correct a namespace docstring that still described per-request pruning
codeGlaze Sep 2, 2026
62a3667
Correct a changelog hash that pointed at the wrong commit
codeGlaze Sep 2, 2026
8dc4ec7
Merge integration into fix/pdf-endpoint-hardening
codeGlaze Sep 2, 2026
bc5ec3c
Check the variants really are one layout before proposing a shared ma…
codeGlaze Sep 2, 2026
e5bdaf7
Check the spell pages, not page 1, and find the attribution constraint
codeGlaze Sep 2, 2026
f2d5411
Prove the page-generation scheme on style 4, and correct where the sa…
codeGlaze Sep 2, 2026
de9a746
Keep generated spell pages with the other spell pages
codeGlaze Sep 2, 2026
a78aaaf
Pick each style's master by page kinds, not by page count
codeGlaze Sep 2, 2026
b43572c
Grow one master per style instead of shipping seven cut variants
codeGlaze Sep 2, 2026
5acc20e
Open a no-caster master rather than taking the spell page out of one
codeGlaze Sep 2, 2026
858eea7
Fix a misspelled description key on the Wand of the War Mage
codeGlaze Sep 2, 2026
c27d653
Measure what growing a master costs in time and allocation
codeGlaze Sep 2, 2026
a93d132
Clone every generated spell page in one pass over the form
codeGlaze Sep 2, 2026
3e171a6
Separate what an export holds from what it throws away
codeGlaze Sep 2, 2026
33e975f
Stop scanning for nothing on every export
codeGlaze Sep 2, 2026
affc462
Stop repeating work the export already did
codeGlaze Sep 2, 2026
602b792
Note the repeated-work fixes in the changelog
codeGlaze Sep 2, 2026
eb58f1e
Record what export churn is, and what it is not
codeGlaze Sep 2, 2026
da39ead
Record how export cost scales with concurrent requests
codeGlaze Sep 2, 2026
4037a57
Record what a thousand simultaneous exports actually costs
codeGlaze Sep 2, 2026
10936bf
Let the operator size the export stack
codeGlaze Sep 2, 2026
eb6c69f
Document what an export costs and how to size it
codeGlaze Sep 2, 2026
16fbbf2
Have a turned-away export retry itself
codeGlaze Sep 3, 2026
67ec728
Dress the busy page as the site, and make it reachable in dev
codeGlaze Sep 3, 2026
b8d93c8
Move the busy page's styling into the stylesheet
codeGlaze Sep 3, 2026
aa7b681
Make the busy page look like the site
codeGlaze Sep 3, 2026
e30f677
Record the queue, the busy page, and what is style 1 only
codeGlaze Sep 3, 2026
828c248
Print a card for every magic item a character carries
codeGlaze Sep 3, 2026
0f19095
Draw the magic item card instead of typesetting it
codeGlaze Sep 3, 2026
9eb66fb
Give the rank marks their own rule, and the card a foot
codeGlaze Sep 3, 2026
867ce0f
Escalate the card frame with rarity, and give the name some size
codeGlaze Sep 3, 2026
5a2ccf8
Separate the top three ranks on the diamond frame
codeGlaze Sep 3, 2026
d000d64
Track the charges of the items that actually have them
codeGlaze Sep 3, 2026
f9fb327
fix(ac): stop unarmored-defense and natural-armor from stacking
codeGlaze Sep 3, 2026
e4ace9e
Move the charge track out of the foot and give it a band
codeGlaze Sep 3, 2026
7ec908d
Give the item name room, and the overflow marker a place to stand
codeGlaze Sep 3, 2026
41bc407
Centre the card's captions by measuring them
codeGlaze Sep 3, 2026
e77c237
Measure the card instead of eyeballing it
codeGlaze Sep 3, 2026
f7f46da
Merge remote-tracking branch 'origin/integration' into feature/one-te…
codeGlaze Sep 3, 2026
b88b3b6
Split a card's description once, and drop the superseded spike
codeGlaze Sep 3, 2026
3c6f9a5
Record that the browser can wrap text exactly, and when to let it
codeGlaze Sep 3, 2026
f13a60a
Bound the work a single export request can buy
codeGlaze Sep 3, 2026
134a1ab
Bound the request itself, so the next feature is covered by default
codeGlaze Sep 3, 2026
c99e6ac
Draw card icons from their SVGs instead of 32px rasters
codeGlaze Sep 3, 2026
c394eb9
Write icon form coordinates to one decimal place
codeGlaze Sep 3, 2026
3e966c1
Record the vector icon cost on time and memory, not just file size
codeGlaze Sep 3, 2026
fecf5d0
Build card fonts and the image loader once per document
codeGlaze Sep 4, 2026
7c35e83
Refuse the private addresses InetAddress has no predicate for
codeGlaze Sep 4, 2026
718c5ef
Cover the image fetch transport against a real server
codeGlaze Sep 4, 2026
f31a88a
Bound how long an image transfer may take, not just how big it is
codeGlaze Sep 4, 2026
9928f34
Bring the branch changelog current and file the image follow-ups
codeGlaze Sep 4, 2026
d3a3bfa
Resolve an image host once and connect to that answer
codeGlaze Sep 4, 2026
d72ff90
Exercise the DNS pin with hostnames, and document the deployment cases
codeGlaze Sep 4, 2026
5ae760f
Add a findable runbook for the character image fetch
codeGlaze Sep 4, 2026
1ce9f62
Make the image egress configuration announce itself
codeGlaze Sep 4, 2026
d158134
Add the spell packer, and correct the plan's page count
codeGlaze Sep 4, 2026
f699553
Add a max-fill stress test for every style's spell sheet
codeGlaze Sep 4, 2026
404438a
Establish that style 4's licence footer is drawing, not artwork
codeGlaze Sep 4, 2026
0b4d499
fix(ac): Bracers of Defense no longer vanishes on a natural-armor cha…
codeGlaze Sep 4, 2026
ba967f8
One spell page per style 4 master, and fix cloning for last-page styles
codeGlaze Sep 4, 2026
53566a6
Print the site line on spell and magic item card backs
codeGlaze Sep 4, 2026
712cfea
Print the site line on every character sheet page
codeGlaze Sep 4, 2026
a1f23c4
Measure where the site line fits instead of reading it off the text
codeGlaze Sep 4, 2026
2e0f451
Add a gallery script that fills every style with one character
codeGlaze Sep 4, 2026
80af785
Stop losing spells and fields off printed sheets, and guard against it
codeGlaze Sep 4, 2026
b284e50
Print style 4's backstory and allies in its Notes box
codeGlaze Sep 4, 2026
9b4e0a2
perf(homebrew): open the builder-loop investigation with validated fi…
codeGlaze Sep 4, 2026
e782534
perf(homebrew): keep the probe harnesses, ignore the generated packs
codeGlaze Sep 4, 2026
afd50ba
Merge integration into feature/one-template-per-style
codeGlaze Sep 4, 2026
8785b16
perf(homebrew): answer the builder-loop question; port the linear kah…
codeGlaze Sep 4, 2026
254da03
Fetch an export's images concurrently and resolve each host once
codeGlaze Sep 4, 2026
bbdb901
Mark concentration, casting time and costly materials on the spell row
codeGlaze Sep 4, 2026
6953d0f
Apply packed-box relabelling sent by the builder, bounds-checked
codeGlaze Sep 4, 2026
4aa475c
perf(homebrew): confirm spells are built on the Race tab, and measure…
codeGlaze Sep 4, 2026
6fe778f
Split spells by the chosen style's row counts, not style 1's
codeGlaze Sep 4, 2026
901906b
Turn a packing into fields: several classes to a page, in columns
codeGlaze Sep 4, 2026
3d353d7
Give a pact caster the first column, and head each column with its class
codeGlaze Sep 4, 2026
42926aa
perf(homebrew): most of the spell work is detail panels nobody opened
codeGlaze Sep 4, 2026
7adc272
Size a column heading to the compartment it sits in
codeGlaze Sep 4, 2026
cd99871
docs(kb): write down the documentation tenets and the reminder hook
codeGlaze Sep 4, 2026
6d9d767
Give the class name the bar and set CANTRIPS small at its end
codeGlaze Sep 4, 2026
78e1295
Put CANTRIPS in the narrow compartment and the class name in the wide…
codeGlaze Sep 4, 2026
1a986ca
test(browser): drive the import conflict modal; stop reading it as a …
codeGlaze Sep 4, 2026
3dc95d3
Enlarge the CANTRIPS label and pad it off each bar's own edge
codeGlaze Sep 4, 2026
1da1794
test(browser): make a failed import report what the page actually showed
codeGlaze Sep 4, 2026
c8d1834
Print each class's DC and attack, and refuse packing on unmeasured st…
codeGlaze Sep 4, 2026
7eebf5f
Set the per-class DC and attack bold and near-black
codeGlaze Sep 4, 2026
20a979d
test(browser): dismiss the cookie banner so the conflict modal is cli…
codeGlaze Sep 4, 2026
a2e50be
Head a no-cantrips class's column too, beside its slots
codeGlaze Sep 4, 2026
944a398
perf(homebrew): measure the memory and the freezes
codeGlaze Sep 4, 2026
68aba9c
fix(cookies): give the consent banner an explicit opt-out for testing
codeGlaze Sep 4, 2026
9ae79a7
Build the packed layout from the character, and split Pact Magic prop…
codeGlaze Sep 4, 2026
28fd620
Clear the lint backlog: 30 warnings to 0
codeGlaze Sep 5, 2026
72fad69
docs(kb): architecture tenets, and a sequenced plan for the builder chug
codeGlaze Sep 5, 2026
d25f385
test(spells): pin the spell peek's content before making :help lazy
codeGlaze Sep 5, 2026
ebe708f
perf(spells): defer the spell peek until someone opens it
codeGlaze Sep 5, 2026
2747553
fix(spells): force the peek behind the expanded? gate, not on every r…
codeGlaze Sep 5, 2026
a875217
Pack spell columns on all four sheet styles
codeGlaze Sep 5, 2026
27b9360
docs(kb): correct step 1 - it does not move the freeze, and the premi…
codeGlaze Sep 5, 2026
d853094
test(browser): drive the builder the way people use it, and find the …
codeGlaze Sep 5, 2026
642796c
Offer the spell sheet layout in the PDF options
codeGlaze Sep 5, 2026
f9c3486
test(browser): throttle the CPU to a real device, and add the clean-l…
codeGlaze Sep 5, 2026
9a89562
docs(kb): price a bounded cache, and drop the hand-rolled LRU idea
codeGlaze Sep 5, 2026
9d3a22e
Group the PDF options and explain each one
codeGlaze Sep 5, 2026
ecc1e0e
docs(kb): revised delivery plan with exit criteria, and what to do in…
codeGlaze Sep 5, 2026
6cd529e
One sticky header instead of a fixed copy above an inline one
codeGlaze Sep 5, 2026
e4b3674
docs(kb): PHASE 0 RESULT - builder-open is EDN parsing, not template …
codeGlaze Sep 5, 2026
2738c46
docs(kb): analysis after Phase 0 - do not run the transit spike next
codeGlaze Sep 5, 2026
3b87a48
Never pack a character the columns cannot hold
codeGlaze Sep 5, 2026
4ffc02a
Test the phone header on a phone, not on a narrow desktop
codeGlaze Sep 5, 2026
eae1b7a
docs(kb): close the load-path analysis - one parse, two co-equal heads
codeGlaze Sep 5, 2026
50d122f
Keep spell levels out of the cantrips box
codeGlaze Sep 5, 2026
1c7d40c
Run the ClojureScript tests, and bring the branch docs current
codeGlaze Sep 5, 2026
6f2717b
test(browser): spike chunked per-source parsing, recommend the migration
codeGlaze Sep 5, 2026
65d35da
Remove the style-1 relabel and cantrips-reuse paths
codeGlaze Sep 5, 2026
50b8f3f
docs: record why library storage is one blob while import/export are …
codeGlaze Sep 5, 2026
f1bd423
docs: distinguish quarantine's post-parse chunking from chunked storage
codeGlaze Sep 5, 2026
7536549
Fold the branch changelog into Summer Patch
codeGlaze Sep 5, 2026
da840ef
Merge branch 'feature/one-template-per-style' into integration
codeGlaze Sep 5, 2026
c35ae64
test/docs: prove the homebrew library is stored as one localStorage v…
codeGlaze Sep 5, 2026
1fdfbf3
docs: plan for chunked per-source library storage
codeGlaze Sep 5, 2026
83f605f
docs/test: withdraw copy-then-delete migration, measure the real quota
codeGlaze Sep 5, 2026
1dcaeec
docs/test: chunks need not be whole sources -- withdraw two limits
codeGlaze Sep 5, 2026
6a02e72
docs: park the chunked-storage plan; it does not fix the reported freeze
codeGlaze Sep 5, 2026
7eb968d
fix: build the character once per change, from values that agree
codeGlaze Sep 5, 2026
d98d6b6
test: probe entity/build calls per click in the real app
codeGlaze Sep 5, 2026
c61ca79
test: also count debounced-build-sub constructions per click
codeGlaze Sep 5, 2026
69bfcd7
test: capture the call stack at each build (STACKS=1)
codeGlaze Sep 5, 2026
2a18b15
fix: stop the builder running two debounced character builds
codeGlaze Sep 5, 2026
e026e50
docs: record the two-build diagnosis, including three wrong ones
codeGlaze Sep 5, 2026
49dfffc
style: cut the debugging narrative out of comments
codeGlaze Sep 5, 2026
7365aea
test: drive class and level by select, not by clicking a card
codeGlaze Sep 5, 2026
4f50a0a
docs/test: class and level switches also run exactly 1 build now
codeGlaze Sep 5, 2026
dc66715
fix: narrow the built-character fix to the nil case that was measured
codeGlaze Sep 5, 2026
3cf3565
docs: label the two built-character subs at their definitions
codeGlaze Sep 5, 2026
cceba56
test: baseline probe for class body cost
codeGlaze Sep 5, 2026
ff118df
test: also count memoized-spell-option in the class body probe
codeGlaze Sep 5, 2026
b2c9ca9
test: NOMEMO=1 to A/B the spell-option memoize
codeGlaze Sep 5, 2026
39d1e13
test: two passes over the same classes, to shape the heap growth
codeGlaze Sep 5, 2026
4a85643
docs: withdraw the two claims lazy class bodies was based on
codeGlaze Sep 5, 2026
6e31cb2
test: probe the reported freeze -- Race<->Class tab flipping under CP…
codeGlaze Sep 5, 2026
d08a792
test: sample heap around each tab switch, and run 8 round trips
codeGlaze Sep 5, 2026
30bb635
test: attribute the freeze -- spy on the builder fns during tab switches
codeGlaze Sep 5, 2026
d6f981f
test: prove the spy armed, and add a positive control
codeGlaze Sep 5, 2026
4b94e96
docs: the freeze is realising one class's spell options
codeGlaze Sep 5, 2026
0986cf4
test: CPU-profile the freeze and rank functions by self time
codeGlaze Sep 5, 2026
9d7e2bf
test: profile a RUN of switches, and say whether the freeze was captured
codeGlaze Sep 5, 2026
26fcb7e
test: make import progress detection work on prod builds too
codeGlaze Sep 5, 2026
e3ef225
docs/test: the freeze survives a production build
codeGlaze Sep 5, 2026
0885541
test: rank by INCLUSIVE time, and profile only the freezing switch
codeGlaze Sep 5, 2026
82eeb25
test: count template construction, the layer the profile implicates
codeGlaze Sep 5, 2026
d3b3203
perf: unchunk a class's level options so touching them builds only wh…
codeGlaze Sep 5, 2026
edbc829
Revert "perf: unchunk a class's level options"
codeGlaze Sep 5, 2026
b0fb699
test: capture the stack at the first level-option call
codeGlaze Sep 5, 2026
a702552
test: fix escaping that silently killed the probe's instrumentation
codeGlaze Sep 5, 2026
c819437
docs: root cause of the freeze, and the five diagnoses that were wrong
codeGlaze Sep 5, 2026
f289290
test: raise Error.stackTraceLimit so the level-option consumer is vis…
codeGlaze Sep 5, 2026
89beace
test: capture the level-option stack PER SWITCH, not once per session
codeGlaze Sep 5, 2026
6b943e7
perf: drop the memoize whose cache key builds 2820 level options
codeGlaze Sep 5, 2026
c90016a
perf: drop memoizes whose cache lookup deep-compares every class in t…
codeGlaze Sep 5, 2026
4b67b3f
perf: unmemoize delete-class and add-class, keyed on the class collec…
codeGlaze Sep 5, 2026
f0790ff
docs: record the confirmed root cause and the measured fix
codeGlaze Sep 5, 2026
2bb966d
docs: add KB index and verification-discipline, and cross-link the en…
codeGlaze Sep 5, 2026
b35dbe6
docs: prod verification of the freeze fix
codeGlaze Sep 5, 2026
0634c5c
docs/test: DO-NOT-MEMOIZE comments, the full memoize scan, and a func…
codeGlaze Sep 5, 2026
1bac07c
test: use the real add/delete class controls
codeGlaze Sep 5, 2026
32d50cc
docs: record the functional test result for the unmemoized handlers
codeGlaze Sep 5, 2026
f5cf962
Merge remote-tracking branch 'origin/integration' into perf/homebrew-…
codeGlaze Sep 5, 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
39 changes: 39 additions & 0 deletions .githooks/pre-push
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/usr/bin/env bash
# pre-push guard (reminder, not an auto-fold): refuse to push a commit that still
# carries docs/branch-changelog.md onto integration / develop / main. Mirrors
# .github/workflows/changelog-guard.yml so a forgotten fold is caught locally
# instead of on CI. The fold itself stays a deliberate manual step:
# scripts/fold-branch-changelog.sh "<release>" (then commit, then push)
#
# Activate once per clone: scripts/setup-hooks.sh (or: git config core.hooksPath .githooks)

status=0
zero="0000000000000000000000000000000000000000"

# Current in-progress release = the first "## [Name]" in CHANGELOG.md, so the
# suggested fold command is copy-pasteable. Falls back to a placeholder.
release="$(grep -m1 -oE '^## \[[^]]+\]' CHANGELOG.md 2>/dev/null | sed -E 's/^## \[(.+)\]$/\1/')"
release="${release:-<release>}"

while read -r _local_ref local_sha remote_ref _remote_sha; do
[ "$local_sha" = "$zero" ] && continue # branch deletion — skip
case "$remote_ref" in
refs/heads/integration|refs/heads/develop|refs/heads/main)
if git cat-file -e "${local_sha}:docs/branch-changelog.md" 2>/dev/null; then
target="${remote_ref#refs/heads/}"
echo "" >&2
echo " pre-push blocked: docs/branch-changelog.md is still un-folded on the commit" >&2
echo " bound for '${target}'. Fold it into CHANGELOG.md, then commit and re-push:" >&2
echo "" >&2
echo " scripts/fold-branch-changelog.sh \"${release}\"" >&2
echo "" >&2
echo " (Decide whether this branch earned a '## Highlights' before folding —" >&2
echo " see docs/branch-changelog.template.md. To bypass once: git push --no-verify.)" >&2
echo "" >&2
status=1
fi
;;
esac
done

exit $status
3 changes: 2 additions & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation if necessary
- [ ] There is no commented out code in this PR.
- [ ] My changes generate no new warnings (check the console)
- [ ] My changes generate no new warnings (check the console)
- [ ] `docs/branch-changelog.md` is updated in the house style (`docs/branch-changelog.template.md`), and I decided whether this branch earns a `## Highlights`.
32 changes: 32 additions & 0 deletions .github/workflows/changelog-guard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Guard: a branch changelog must be FOLDED into CHANGELOG.md (and removed) before
# landing on integration or develop. See docs/CONTRIBUTING.md.
#
# Runs on push (the post-merge backstop): if a merge landed on integration/develop
# without folding its docs/branch-changelog.md, this goes red — run
# scripts/fold-branch-changelog.sh, commit, and push again. Not run on
# pull_request, since the branch changelog legitimately lives on the feature branch
# until it is folded at merge time.

name: Changelog guard

on:
push:
branches: [integration, develop, main]
workflow_dispatch:

permissions:
contents: read

jobs:
branch-changelog-folded:
name: Branch changelog folded
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: A branch changelog must be folded before landing here
run: |
if [ -f docs/branch-changelog.md ]; then
echo "::error file=docs/branch-changelog.md::An un-folded branch changelog is present on $GITHUB_REF_NAME. Fold it into CHANGELOG.md and remove it before landing — run: scripts/fold-branch-changelog.sh \"<release>\""
exit 1
fi
echo "OK — no un-folded branch changelog on $GITHUB_REF_NAME."
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,18 @@ cljsjs/

# Design handoff reference material (preserved on agents/develop, not committed to code branches)
design_handoff_character_menus

# Generated clojure-CLI cljs build artifact (regenerated from project.clj; lein/figwheel-main is canonical)
/deps.edn

# Deploy-injected static vendor assets (font-awesome, etc.). index.clj references
# /assets/... at runtime, but these binaries are provided at deploy time and are
# not part of the source tree. A local copy may exist to render the screenshot
# harness faithfully; never commit the vendored fonts/CSS.
/resources/public/assets/
/package-lock.json

# Perf-investigation scratch: throwaway probe scripts and the multi-megabyte .orcbrew
# packs generated by dev/scale_orcbrew_pack.clj. The harnesses worth keeping live in
# test/browser/; the packs are regenerable and must not be committed.
/dev-scratch/
Loading
Loading