Imported from BoardAI/vallor-plugins (
vallor/skills/contract-interactive-html/SKILL.md). Install upstream withnpx skills add BoardAI/vallor-plugins --skill contract-interactive-html. Copyright stays with the author.
/vallor:contract-interactive-html
Purpose
A 30-page MSA with 80 redline entries is unreadable as a single column. This skill turns the same content into a clickable view: sidebar of issues, click a row to see the clause in context with their language next to the proposed language, severity filter at the top, inline comment thread per clause.
It's the reviewer-facing counterpart to contract-report-html (which is the
read-only, printable distribution copy).
Load context
- Read
~/.claude/plugins/config/vallor/CLAUDE.md. - Apply the /design skill β same palette, but the layout is two-column (sidebar 280px + main pane).
- Read the source markdown redline. If the source is a contract PDF without a
redline, surface: "I need a redline to build this. Run
/vallor:contract-redlinefirst."
Ask the user for context (optional but encouraged)
Use the AskUserQuestion tool to calibrate the layout and emphasis. A long redline can be sliced many ways β questions up front avoid a rebuild.
Up front (before rendering): Ask 1-3 short questions when not obvious from the redline:
- Primary reader: lawyer-reviewer / business owner / external counsel
- Layout preference: side-by-side / stacked / drill-down (if
--modenot passed) - Default severity filter on load: all / π΄ only / π΄+π
- Whether to include inline comment threads (yes/no)
- Whether to include the playbook reference column
Mid-flight (after parsing the redline): Once you've indexed all issues, surface concrete asks before guessing on:
- Whether to group by clause vs by severity vs by section
- How to handle very long counterparty paragraphs (truncate with reveal vs full text)
- Whether to add a "deal-breakers only" preset filter
Rules:
- Every question must offer a reasonable default the user can pick to skip ahead.
- Ask follow-ups when answers reveal more depth or a non-default choice.
- Cap a single round at ~3 questions.
- Skip when the user has signaled a fast / default run.
Layout
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [Client] Β· Commercial Contracts [PRIVILEGED] β
β Acme Vendor MSA β Interactive Review β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β Recommendation: Push back Β· N findings (3 β HIGH, 8 β MED, 2 β LOW) β
β β
β Filter: [All] [β BLOCKING] [β HIGH] [β MEDIUM] [β LOW] β
β β
β βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Β§ 8.2 Indemnificationβ CLAUSE 8.2 β INDEMNIFICATION β HIGH β β
β β β HIGH β βββββββββββββββββββββββββββββββββββββββββ β β
β β Cap base too short β β β
β βββββββββββββββββββββββ€ THEIR LANGUAGE β β
β β Β§ 10.1 Liability cap β "Vendor's indemnification obligations are β β
β β β BLOCKING β limited to direct damages and shall not β β
β β On Never-accept list β exceed fees paid in the three (3) months β β
β βββββββββββββββββββββββ€ preceding the claim." β β
β β Β§ 14 Audit (missing) β β β
β β β MEDIUM β PROPOSED REPLACEMENT β β
β β Insert audit right β "Vendor shall indemnify, defend, and hold β β
β βββββββββββββββββββββββ€ harmless Customer..." β β
β β ... β β β
β β β WHY β β
β β β Three-month cap base is on the Never-accept β β
β β β list per playbook position [Limitation of β β
β β β liability β Never accept]. β β
β β β β β
β β β FALLBACK β β
β β β Cap base at 12 months of fees paid; carve β β
β β β out IP and data above the cap. β β
β β β β β
β β β COMMENTS β β
β β β [+ add comment] β β
β βββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Footer Β· PRIVILEGED & CONFIDENTIAL Β· Page X Β· [Reviewer] β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Interactivity
- Sidebar: Clickable list of findings. Severity dot on the left. Click a row to scroll the main pane to that clause.
- Filter bar: Vanilla JS show/hide by severity. State is preserved in the URL hash so a reviewer can bookmark "all blocking issues" and share the link.
- Side-by-side mode (default): Two columns inside the main pane β their language on the left, proposed on the right, with a synced scroll for long clauses.
- Stacked mode: Their language above, proposed below β better on narrow screens.
- Drill-down mode: Sidebar always visible; clicking expands the clause and collapses the others. Good for very long redlines (80+ entries).
- Inline comments: Each clause has a
[+ add comment]button. Comments are stored inlocalStoragekeyed by the file URL. Not shared β single-reviewer notes. Surfaces a warning iflocalStorageis empty when the file is opened from a different device. - Keyboard shortcuts:
j/kmove between findings,/focuses the filter,ctoggles the comment thread for the current clause.
Tech constraints
- Single HTML file. Embedded CSS and JS.
- No frameworks β vanilla JS, ~150 lines.
- Sanitize untrusted input. Counterparty text, vendor names, OSS data β all
set via
textContent, neverinnerHTML. UseDOMPurify(vendored, ~20kb) if any retrieved content might contain HTML; otherwise plaintextContent. - Print-friendly:
@media printcollapses sidebar, expands all clauses, hides the comment widget. - Works offline.
Output
Save to:
~/.claude/plugins/config/vallor/reports/<YYYY-MM-DD>-<slug>-interactive.html
Open in browser if --open is passed.
Decision tree
- Build the read-only PDF β
/vallor:contract-report-htmlthen print to PDF. - Build the approval deck β
/vallor:contract-approval-deck. - Stop here β file saved.
Examples
/vallor:contract-interactive-html redlines/acme-msa.md
/vallor:contract-interactive-html redlines/acme-msa.md --mode drill-down