← back to Abrams
data/mag-20.json
168 lines
{
"title": "Mag-20 — Steve's top 20 standing-rule patterns",
"description": "The 20 best-practice patterns every Abrams / DW-family / agentabrams.com property MUST comply with. Auditor runs nightly and renders the live matrix at /mag-20. Sourced from MEMORY.md feedback entries + CLAUDE.md standing rules.",
"updated_at": "2026-05-14",
"patterns": [
{
"id": 1,
"rule": "Logo UL + hamburger UR on every page",
"source": "feedback_logo_ul_hamburger_ur_all_tabs.md",
"severity": "high",
"check": "grep .chrome .logo + .nav-burger in every public/*.html",
"category": "chrome"
},
{
"id": 2,
"rule": "Hamburger = Gucci '≡ MENU' style (3 bars + uppercase MENU label, top-right fixed)",
"source": "feedback_hamburger_gucci_menu_style.md",
"severity": "high",
"check": "grep '\\bMENU\\b' in nav-burger of every public/*.html",
"category": "chrome"
},
{
"id": 3,
"rule": "Hero CTA = single white pill ENTER button centered at bottom of hero",
"source": "feedback_hero_cta_enter_centered_bottom.md",
"severity": "high",
"check": "grep -E 'class=\"cta\"[^>]*>ENTER' in index.html; CSS bottom: anchor present",
"category": "hero"
},
{
"id": 4,
"rule": "Rotating hero OR 4-square grid (≥1500px long edge, ≥200KB) — except TSD",
"source": "feedback_rotating_hero_universal_except_tsd.md",
"severity": "medium",
"check": "n/a for Abrams Panel (wordmark hero is acceptable); applies to DW microsites",
"category": "hero"
},
{
"id": 5,
"rule": "Sort + density slider on every product grid",
"source": "CLAUDE.md sort+density block",
"severity": "high",
"check": "grep -E '<select id=\"sort\"|range.*density' in every grid-bearing public/*.html",
"category": "grid"
},
{
"id": 6,
"rule": "corner-nav.js wired on every page",
"source": "feedback_corner_nav_universal.md",
"severity": "high",
"check": "grep 'corner-nav.js' in every public/*.html",
"category": "chrome"
},
{
"id": 7,
"rule": "ns-modal CSS + nsContactOpen() function when contact modal is present",
"source": "feedback_ns_modal_css_missing_fanout.md",
"severity": "low",
"check": "if nsContactOpen() used, .ns-modal CSS must exist",
"category": "modal"
},
{
"id": 8,
"rule": "Customer-facing chat = lower-LEFT, woman avatar, never reveal vendor names",
"source": "feedback_bigred_customer_chat_universal.md",
"severity": "medium",
"check": "chat widget position bottom-left; SVG silhouette fallback; no AI vendor leaks",
"category": "chat"
},
{
"id": 9,
"rule": "Chip click → full-details modal (vendor scrubbed, says 'Designer Wallcoverings · SKU')",
"source": "feedback_dw_chip_click_full_details.md",
"severity": "medium",
"check": "n/a for Abrams Panel (no chip tiles); applies to DW catalog grids",
"category": "grid"
},
{
"id": 10,
"rule": "Viewport meta tag required for @media queries to fire on mobile",
"source": "feedback_viewport_meta_required_for_media_queries.md",
"severity": "high",
"check": "grep '<meta name=\"viewport\"' in every public/*.html",
"category": "responsive"
},
{
"id": 11,
"rule": "All projects under ~/Projects/ must be git repos (gitify rule)",
"source": "CLAUDE.md gitify block",
"severity": "high",
"check": "test -d <project>/.git",
"category": "git"
},
{
"id": 12,
"rule": "Commit after every success (one logical change = one commit)",
"source": "CLAUDE.md gitify block",
"severity": "medium",
"check": "git log shows commits per shipped feature (not daily-mega-commit)",
"category": "git"
},
{
"id": 13,
"rule": ".gitignore must exclude node_modules/, .env*, tmp/, *.log, .DS_Store, dist/, build/, .next/",
"source": "CLAUDE.md gitify block",
"severity": "high",
"check": "grep -c -E '(node_modules|\\.env|tmp/|\\*\\.log|\\.DS_Store|dist/|build/|\\.next/)' .gitignore == 7+",
"category": "git"
},
{
"id": 14,
"rule": "Never expose AI vendor names (Replicate/SDXL/Gemini/Ollama) to users",
"source": "feedback_never_expose_ai_software.md",
"severity": "critical",
"check": "grep -iE '(replicate|sdxl|gemini|claude-3|gpt-4|ollama|moonshot|kimi)' public/ should return 0 user-visible hits",
"category": "compliance"
},
{
"id": 15,
"rule": "Email mailers must include physical mailing address + unsubscribe (CAN-SPAM)",
"source": "comms-compliance",
"severity": "critical",
"check": "every email body contains physical address + STOP/unsubscribe before going to any external recipient",
"category": "compliance"
},
{
"id": 16,
"rule": "Subjects must NOT contain raw em-dash without RFC 2047 encoding (mojibake guard)",
"source": "feedback_email_no_mojibake.md",
"severity": "low",
"check": "grep '—' in email-hourly.sh subject line should be empty",
"category": "compliance"
},
{
"id": 17,
"rule": "Bind to 127.0.0.1 by default (internal panels never 0.0.0.0 unless explicit)",
"source": "security-auditor best-practices",
"severity": "high",
"check": "server.js app.listen uses BIND env-var defaulting to 127.0.0.1",
"category": "security"
},
{
"id": 18,
"rule": "Rate-limit any write endpoint (POST /api/*) — express-rate-limit on lead, wall, etc.",
"source": "security-auditor best-practices",
"severity": "high",
"check": "grep 'rateLimit' in server.js; each POST route has a limiter",
"category": "security"
},
{
"id": 19,
"rule": "After-hours email gate (Mon-Fri 9-5 PT only; no weekends)",
"source": "feedback_marketplace_local_only.md (after-hours quiet rule)",
"severity": "medium",
"check": "email-hourly.sh checks HOUR/DOW before sending; launchd plist scoped to Weekday 1-5 Hour 9-17",
"category": "compliance"
},
{
"id": 20,
"rule": "Every shipped artifact gets a Goal·How·Why explainer video via what-landed-video",
"source": "feedback_video_per_new_artifact.md + feedback_what_landed_video_every_tick.md",
"severity": "medium",
"check": "after each meaningful commit, ~/Videos/what-landed/<ISO>.mp4 generated",
"category": "publishing"
}
]
}