mirror of
https://github.com/trailofbits/skills
synced 2026-06-21 14:12:00 +00:00
98b01ec8ff
* Expand let-fate-decide zodiac spread * let-fate-decide: address self-review nits - Compute ENTROPY_BITS from math.log2(math.comb(...)) so the dict cannot silently drift if the spread shape changes; test now verifies the formula and asserts the 100-bit floor. - Remove the ambiguous draw() wrapper (list-or-dict return); callers use explicit draw_zodiac_spread() / draw_cards() instead. - Extract _build_house_record() helper to bring draw_zodiac_spread() under the 50-line guideline. - Require --legacy explicitly for the positional count CLI; remove the implicit legacy flip when a bare integer was passed. - Generalize the rank-format test to all four minor suits. - Document test_reviewed_cards_avoid_unsafe_shortcuts as an exact-string regression guard rather than a semantic check. - SKILL.md: reframe example session as an explicit house-level fragment and note the draw agent's bullet output format. - README.md: correct the deck-shuffle description (two independent decks, not one 78-card shuffle); compute entropy text from formulas. - marketplace.json + plugin.json: sync description to mention the 12 Houses spread and the 100+ bit entropy budget. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * let-fate-decide: align SKILL.md description article with sibling surfaces PR review flagged the SKILL.md frontmatter said "Draws a 12 Houses..." while plugin.json, marketplace.json, and agents/draw.md all say "Draws the 12 Houses...". SPREAD_NAME is a single fixed spread, so "the" is correct. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * let-fate-decide: rename entropy_bits.minor_shuffle to minor_arcana PR review flagged inconsistent naming in the entropy_bits dict: major_arcana (deck-named) vs minor_shuffle (operation-named). The value is also log2(C(56,24)), an unordered selection — not log2(56!), a full shuffle — and every prose consumer (SKILL.md, README.md, the entropy_note f-string) already calls it "Minor Arcana selection". Rename for parallel structure. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * let-fate-decide: address PR follow-up nits 1. agents/draw.md: tighten portent template prose from "3-5 concise bullets" to "3 concise bullets" — the fenced template has exactly 3 placeholders, and a Haiku-class model will follow the template literally rather than the looser range. SKILL.md's example session synced to match. 2. references/INTERPRETATION_GUIDE.md: rewrite the Special Patterns section for the 12-house spread. The previous patterns were carried over from the 4-card hand and were broken in the new geometry: "Multiple Major Arcana" was guaranteed (12 Majors per draw), "All One Suit" was mathematically impossible (each Minor suit has only 14 cards vs. 24 Minor draws), "All Reversed" dropped from 2^-4 to 2^-36, and "Court Card Progression in sequence" had no meaning across houses. Replaced with four patterns calibrated to the new baseline frequencies: heavy reversal count (>= 24 of 36), heavy single-suit concentration (>= 10 of 24 Minors), weighty Majors in critical houses (1/8/12), and court cards clustering in people houses (3/7/11). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * let-fate-decide: fix reversal percentile, focus/Domain drift, Step 1 heading - Correct "Heavy Reversal Count": P(X>=24) for Binomial(36, 0.5) is ~3.26%, so "6th percentile" was wrong in both magnitude and direction. Reword to "roughly the top 3% of draws". - Align each house focus string to its house file **Domain** line (Houses 6, 7, 8, 9, 12 differed in content; House 8 dropped "secrets"). Both surfaces reach the interpreter on the default --content path. - Add test_zodiac_focus_matches_house_domain to pin the two surfaces together. - Fix Step 1 heading to "Read Each House and Card File" to match its body. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Dan Guido <dan@trailofbits.com>