Two changes in one continuation, in this order: (A) the rename and three documentation items (step 1), five small Registry rules (step 2) and the burn rule (step 3); (B) the card IMAGE becomes a hive symbol (steps 4 and 5); one review (step 6). (A) touches no id, rule, window, threshold or address; paid upgrades are untouched. For (B), the specification below is normative.
(B) Replace the card IMAGE of Renderer; nothing else changes. Keep Registry and Composer bytecode (apart from steps 1 to 3), the Card struct, tokenURI(Card)/preimage(Card) signatures, and, relative to the step-1 result (the rename changes names outside the image), every metadata JSON key and byte except the image value. The image stays data:image/svg+xml, + the SVG percent-encoded by tools/gen_template.py percent_encode. The Renderer stays pure (no storage, no constructor args, no immutables) and under 24,576 B.
NORMATIVE SVG (one line, single quotes; a number is Python f'{v:.1f}' of a double unless literal; P(pts)=' '.join(f'{x:.1f},{y:.1f}'); D(pts)='M'+'L'.join(f'{x:.1f} {y:.1f}')):
Geometry: hex(x,y,r)=[(x+rcos(60k deg), y+rsin(60k deg)) for k=0..5]. H=sqrt(3)*96. Slot s=0..12 centre (500+dx,480+dy), (dx,dy): (0,0); (0,-H),(144,-H/2),(144,H/2),(0,H),(-144,H/2),(-144,-H/2); (144,-1.5H),(288,0),(144,1.5H),(-144,1.5H),(-288,0),(-144,-1.5H). Family (0-based catalog order) per slot: 5,0,1,2,3,4,6,7,8,9,10,11,12.
Tiers n per family: 1,2,3,4,3,1,1,1,1,1,1,1,1. lv=index(top[i])+1 in its tier list ([101],[201,202],[301..303],[401..404],[501..503],[601],[701],[801],[901],[1001],Ordinal,[1201],[1301]); Ordinal (1101-1105) lv=1 if top[i]!=0; lv=0 if top[i]==0. Class colour c: families 0-5 #00cc33, 6-10 #00ff41, 11 #dbfee6, 12 #8ff0a4. Rare ids 202,801,901,1001,1101,1102,1103,1104,1201 (each its family's top tier).
Community rings: shown=min(communityCount,39); the family in slot s gets k=#{d in 0,1,2 : 13d+s<shown} rings, radii R=[62,45,28][:k]. Opacities by k: 0 ['1.00']; 1 ['0.35','1.00']; 2 ['0.35','0.68','1.00']; 3 ['0.35','0.57','0.78','1.00'].
Honey for 0<lv<n: Q=hex(x,y,77), yb=max y of Q, yt=min y, L=yb-(yb-yt)lv/n. HONEY: walk Q's edges (Q[j],Q[j+1 mod 6]) in order, keep Q[j] if its y>=L, and when the edge crosses (exactly one end has y>=L) add (x0+t(x1-x0), L), t=(L-y0)/(y1-y0). ABOVE=[(x,min(y,L)) for (x,y) in Q].
ELEMENT ORDER: (1) (2) for each family i=0..12 in catalog order, at its slot centre (x,y): ; ZONES = per (r,o) in zip([77]+R, opacities[k]): . If lv==n: ZONES. If 0<lv<n: ZONES then per r in R . Then if lv>0 and top[i] is rare: . If lv==0: per r in R . (3) V=hex(500,480,440): ; then only if communityCount>39: steps=64 if count>=8192 else min(64, bitlen(count**8)-41) where ** is exponentiation (count to the eighth power, never XOR); C=[V[(4+j)%6] for j=0..6]; f=6steps/64, j=floor(f); pts=C[0..j], plus C[j]+(f-j)(C[j+1]-C[j]) if f>j; (4) #{tokenId}
No trigonometry onchain: tools/gen_template.py precomputes every coordinate string; the Renderer selects and concatenates them. BURN RULE TESTS (step 3, with a MockBurnExecutor that records calls, force-refunds and can revert): below 69 IMD no fee and attached ETH back, nothing attached = no refund call; at or above: no fee reverts BurnFeeRequired, with it the executor gets msg.value and refunds the surplus; caught failure returns the ETH, claim pending, code 2; quote above the cap skips (3); reverting preview skips (1); at most BURN_GAS plus the stipend reaches the call; a nonpayable contract claimant passes with nothing attached and with the exact fee, reverts only when rejecting a positive refund; invariant: balance after equals before; a pinned-block fork test through the real executor and OFT covers refunds. BURN RULE DOCS (step 3): README, CONCEPT.md, INTEGRATION.md (eighth argument; executor, OFT and destination as owner-configurable dependencies; the caps bound cost, not liveness), DISCLOSURE.md (a failing executor never blocks a claim; the Base burn is asynchronous).