Compares each YAML playbook rule to the matching contract provision and emits one ordered finding with found, character-exact excerpt, and status derived from action_* (ok/risk/reject). Apply when an NDA, MSA, DPA, lease, or vendor DD questionnaire must be scored against machine-checkable fields such as max_years or acceptable_jurisdictions. Not a contract-drafting generator and not advice beyond encoded rules; skip reviews that have no playbook.
A contract reviewer applies a structured deviation policy to a contract, clause by clause, and emits a structured review. Each finding is traceable to a machine-checkable rule — never unsupported opinion.
When to Use
Use this skill whenever reviewing any contract — NDA, MSA, vendor DD questionnaire, lease, DPA — against a structured rules-based playbook. The playbook is a list of clause rules. Each rule names a clause, describes the policy in prose, and encodes the policy as machine-checkable fields (e.g. max_years, acceptable_jurisdictions, must_be_present).
Free-form review without a structured playbook. The entire method depends on each finding being traceable to a machine-checkable rule. With no playbook, there is no objective threshold to compare against, so the output degrades into unsupported opinion. If the user wants a general read, tell them so and ask for the playbook.
Drafting contracts from scratch. Review answers "does this provision comply with our policy?"; drafting answers "what should this provision say?" Using a deviation policy as a drafting template produces bland, defensive language that ignores commercial intent.
Legal advice beyond the playbook's encoded rules. The playbook captures a firm's settled positions. Anything outside it (novel risk, jurisdiction-specific enforceability, regulatory interpretation) requires a lawyer's judgement. Flag the gap rather than improvising a rule.
Contracts whose clause types the playbook does not cover. If the playbook has no rule for, say, an arbitration clause, you cannot review that clause — there is no policy to apply. Note the uncovered area so the playbook owner can extend it; do not invent a threshold.
Deprecated rule types or outdated playbook formats. Older shapes like must_be_exactly (replaced by acceptable_set) or YAML 1.1 (which coerces no/off/yes to booleans and mis-parses unquoted thresholds) silently change the meaning of a rule. The danger is not that they fail loudly — it is that they pass while meaning something else. Migrate the playbook before reviewing against it.
Any workflow that treats contract text as low-sensitivity. Contracts routinely contain personal data, pricing, and confidential terms. If a request would route that text through an untrusted channel, log it in the clear, or expose it to parties outside the engagement, stop and confirm the handling first — a leaked draft is far costlier than a delayed review.
A stale playbook. Thresholds anchored to a statute or survey go out of date when the law or market moves. A rule that was correct last year can produce confidently wrong findings today. If you notice a rule's source predates a known change in the relevant law, surface it instead of applying the rule blindly.
Prerequisites
A structured playbook in YAML (or equivalent machine-readable format) containing clause rules with machine-checkable fields.
The contract text in a readable format (plain text, Markdown, or HTML — strip tags before extracting excerpts).
If the playbook uses YAML 1.1, migrate to YAML 1.2 first to avoid silent boolean coercion of no/off/yes.
Confirm the playbook is current: check each rule's source field against known legal or market changes.
Procedure
Step 1: Load and validate the playbook
Parse the playbook file. Confirm it is valid YAML (or the specified format).
Check for deprecated rule types (must_be_exactly → migrate to acceptable_set).
If YAML 1.1 is in use, migrate to YAML 1.2 before proceeding.
Inventory the clause list — you will emit one finding per clause, in the playbook's declared order. No additions, no deletions.
Step 2: Walk the playbook — four-step loop per clause
For each clause rule in the playbook, repeat:
2a. Locate the corresponding provision in the contract
The contract may use different headings. Use three strategies in order:
Heading match — try the playbook's key and label against the contract's section headings (e.g. playbook governing_law → contract heading "Governing Law" or "Choice of Law").
Operative-verb scan — search for verbs/phrases that mark the clause function. ("shall return or destroy" → return/destruction; "irreparable harm" + "injunctive" → equitable relief; "governed by and construed in accordance with" → governing law).
Keyword neighbourhood — for numeric rules, find the unit ("year", "months", "$") and read the surrounding sentence to decide whether it is the term, survival, notice period, or some other duration.
If you searched and the contract really has nothing, set found: false and excerpt: "". Do not manufacture an excerpt. Do not infer one from the playbook prose. A missing clause is a legitimate finding.
2b. Apply the rule
Check the contract's position against the policy fields. Recognise the rule shape:
Rule shape
Field example
"ok" means
Numeric ceiling
max_years: 3, max_months: 24
Contract value ≤ ceiling
Numeric floor
min_years: 1
Contract value ≥ floor
Must be present
must_be_present: true
Provision exists
Must be absent
must_be_absent: true
Provision (or specific phrasing) does NOT exist
Acceptable set
acceptable_jurisdictions: ["England and Wales", "New York", "Delaware"]
Contract value ∈ set
Required feature
must_allow_destruction: true
Provision contains the feature
Conjunction of features
must_require_notice && must_require_cooperation
All features present
Conditional structural
must_be_bilateral_if_present
Provision absent OR present-and-symmetric
A playbook entry may carry a source field naming the published authority the rule is anchored to (a survey, statute, treatise, or firm-published practice guide). When present, treat it as load-bearing — the rule's threshold is not arbitrary; it is the cited source's stated value.
A clause may combine several rule shapes (e.g. "must be present AND have backup carve-out AND allow destruction"). The clause's overall status is ok only if every sub-rule passes.
2c. Classify the outcome
Status is derived from the playbook's action_* field, not from the rule shape. This is the most common place an agent goes wrong: it sees must_be_absent and reaches for reject by reflex. Don't. Use the prescribed action to decide status:
action_if_ok ("accept", "no_change") → status ok
Any action that begins with request_ (request_reduction / request_addition / request_revision / request_change / request_amendment) → status risk. The "request_" prefix is the signal: we still want the contract; we're going to negotiate. Even a must_be_absent clause whose action_if_present is request_revision is still risk, not reject.
action_if_present (or action_if_violated) of reject_and_remove / reject / walk_away → status reject. The rule's prescribed response is to refuse, not to negotiate.
When the playbook is silent on a particular outcome, fall back to: action prefix request_ → risk; explicit reject/walk-away → reject.
2d. Record the finding
Emit a structured finding with these non-optional fields:
clause — the playbook clause key
found — boolean; true if the provision was located in the contract
excerpt — verbatim substring of the contract source (see rules below); "" when found: false
status — ok, risk, or reject (derived from action, not rule shape)
action — the playbook's prescribed action for this outcome
rationale — one sentence stating the operative facts and the rule applied
Step 3: Extract the verbatim excerpt
The excerpt is what proves your finding. Three hard rules:
It must be a substring of the contract source — character-for-character, including punctuation and capitalisation. Do not paraphrase. Do not stitch together text from different paragraphs.
Keep it short and targeted — the smallest excerpt that contains the operative language. Most playbooks bound this (e.g. ≤ 400 characters). If the operative language spans more than that, choose the most diagnostic phrase.
For a found: false finding, the excerpt is "".
When extracting from Markdown or plain text, copy the exact run including any quotation marks, parentheses, or numerical values. When extracting from HTML, strip tags first; do not include rendered artifacts.
Step 4: Write the rationale
One sentence. State the operative facts and the rule applied. Examples:
ok: "Term is one year, within the 3-year maximum."
risk (numeric ceiling): "Survival is ten years, exceeding the 7-year cap."
risk (missing feature): "Definition exclusions cover the four standard exceptions but omit a residuals carve-out."
reject: "A non-compete covenant is present; the playbook's prescribed action for this clause is reject_and_remove."
Avoid: hedging ("appears to", "may be"), restating the playbook in full, repeating the rationale across clauses.
Step 5: Emit output
Emit one entry per playbook clause, in the playbook's declared order. No additions, no deletions.
Schema fields are non-optional: clause, found, excerpt, status, action, rationale. Use empty string (not null, not missing) when the value is empty.
The output format is whatever the instruction specifies (usually JSON). Validate the file is parseable before declaring done.
"This Agreement shall commence on the Effective Date and continue for a period of five (5) years unless earlier terminated in accordance with Section 9 (Termination). Upon expiry of the initial term, this Agreement shall automatically renew for successive one (1) year periods unless either party gives ninety (90) days' written notice of non-renewal."
Finding:
{
"clause": "term",
"found": true,
"excerpt": "continue for a period of five (5) years",
"status": "risk",
"action": "request_reduction",
"rationale": "Term is five years, exceeding the 3-year maximum."
}
"During the Term and for twelve (12) months thereafter, Employee shall not, directly or indirectly, engage in any business competitive with the Company within the United States, nor solicit any customer or employee of the Company, without the Company's prior written consent."
Finding:
{
"clause": "non_compete",
"found": true,
"excerpt": "Employee shall not engage in any business competitive with the Company",
"status": "reject",
"action": "reject_and_remove",
"rationale": "A non-compete covenant is present; the playbook's prescribed action for this clause is reject_and_remove."
}
Example 3: Missing clause (must-be-present)
Playbook entry:
clause: data_destruction
label: "Return or Destruction of Data"
must_be_present: true
must_allow_destruction: true
action_if_missing: "request_addition"
action_if_violated: "request_revision"
Contract: No matching provision found.
Finding:
{
"clause": "data_destruction",
"found": false,
"excerpt": "",
"status": "risk",
"action": "request_addition",
"rationale": "No return/destruction clause found; playbook requires one with destruction right."
}
Pitfalls
Confusing term and survival. Two different durations. The contract's "Term" section is the active period; survival is buried at the end of that section as "the provisions of Sections X, Y, Z shall survive...". Read the whole Term section before classifying either.
Treating a must_be_absent rule as a numeric ceiling. If the playbook says must_be_absent: true, a 1-year non-compete still violates the rule even though "1 year" sounds reasonable — the presence matters, not the value. The violation's status then comes from the prescribed action as always: request_* → risk; only an explicit reject / walk-away action makes it reject.
Granting credit for a partial feature. "Must allow destruction AND have backup carve-out" requires both. Don't mark ok for a return/destruction clause that allows destruction but lacks the backup carve-out.
Reading the recital as the clause. The preamble often paraphrases obligations ("the parties wish to protect..."); the operative clause is later. Find the operative clause.
Inferring presence from a cross-reference. If Section 9 says "Sections 3, 4, 5 ... shall survive", Sections 3, 4, and 5 themselves are not the survival clause — they're whatever they were. The survival clause is the cross-reference itself.
Going directly from rule shape to status. A must_be_absent rule with action_if_present: "request_revision" is risk, not reject. Always derive status from the action_* field.
Paraphrasing the excerpt. The excerpt must be a character-for-character substring. Any paraphrasing — even minor word swaps — invalidates the finding's grounding.
Skipping silent clauses. Don't skip clauses just because the contract is silent on them — silence is itself a finding (found = false) and may trigger an action (e.g. "request_addition").
Using null instead of empty string. Schema fields are non-optional. Use "" (empty string), not null or missing keys.
Verification
Run the test suite against sample contracts with known playbook outcomes.
Verify all rule types (numeric ceiling, floor, must-be-present, must-be-absent, acceptable set, required feature, conjunction, conditional structural) produce correct status mappings.
Confirm verbatim excerpts are exact substrings of source contracts — character-for-character, including punctuation and capitalisation.
Validate JSON output schema compliance: all required fields present (clause, found, excerpt, status, action, rationale), empty strings not null.
Check that missing clauses correctly return found: false with empty excerpt and appropriate action-derived status.
Confirm one finding per playbook clause, in declared order — no additions, no deletions.
Confirm status is derived from action_* fields, not from rule shape (e.g. must_be_absent with request_* action → risk, not reject).
Test for security vulnerabilities, such as unauthorized access to contract data or potential data breaches.
Validate playbook updates to ensure they reflect changes in laws, regulations, or industry standards.
Related Skills
contract-extraction — for pulling structured data from contracts before playbook review.
clause-classification — for identifying clause types when playbook keys don't match headings.
redline-generation — for producing negotiated markup after playbook review findings.
1---2name: contract-playbook-review3description: Compares each YAML playbook rule to the matching contract provision and emits one ordered finding with found, character-exact excerpt, and status derived from action_* (ok/risk/reject). Apply when an NDA, MSA, DPA, lease, or vendor DD questionnaire must be scored against machine-checkable fields such as max_years or acceptable_jurisdictions. Not a contract-drafting generator and not advice beyond encoded rules; skip reviews that have no playbook.4---56# Contract Playbook Review
78A contract reviewer applies a structured deviation policy to a contract, clause by clause, and emits a structured review. Each finding is traceable to a machine-checkable rule — never unsupported opinion.
910## When to Use
1112Use this skill whenever reviewing any contract — NDA, MSA, vendor DD questionnaire, lease, DPA — against a structured rules-based playbook. The playbook is a list of clause rules. Each rule names a clause, describes the policy in prose, and encodes the policy as machine-checkable fields (e.g. `max_years`, `acceptable_jurisdictions`, `must_be_present`).
1314Trigger keywords: playbook review, contract review, deviation policy, clause-by-clause, NDA review, MSA review, DPA review, vendor questionnaire, lease review.
1516### Do NOT use when:
1718- **Free-form review without a structured playbook.** The entire method depends on each finding being traceable to a machine-checkable rule. With no playbook, there is no objective threshold to compare against, so the output degrades into unsupported opinion. If the user wants a general read, tell them so and ask for the playbook.
19- **Drafting contracts from scratch.** Review answers "does this provision comply with our policy?"; drafting answers "what should this provision say?" Using a deviation policy as a drafting template produces bland, defensive language that ignores commercial intent.
20- **Legal advice beyond the playbook's encoded rules.** The playbook captures a firm's *settled* positions. Anything outside it (novel risk, jurisdiction-specific enforceability, regulatory interpretation) requires a lawyer's judgement. Flag the gap rather than improvising a rule.
21- **Contracts whose clause types the playbook does not cover.** If the playbook has no rule for, say, an arbitration clause, you cannot review that clause — there is no policy to apply. Note the uncovered area so the playbook owner can extend it; do not invent a threshold.
22- **Deprecated rule types or outdated playbook formats.** Older shapes like `must_be_exactly` (replaced by `acceptable_set`) or YAML 1.1 (which coerces `no`/`off`/`yes` to booleans and mis-parses unquoted thresholds) silently change the meaning of a rule. The danger is not that they fail loudly — it is that they pass while meaning something else. Migrate the playbook before reviewing against it.
23- **Any workflow that treats contract text as low-sensitivity.** Contracts routinely contain personal data, pricing, and confidential terms. If a request would route that text through an untrusted channel, log it in the clear, or expose it to parties outside the engagement, stop and confirm the handling first — a leaked draft is far costlier than a delayed review.
24- **A stale playbook.** Thresholds anchored to a statute or survey go out of date when the law or market moves. A rule that was correct last year can produce confidently wrong findings today. If you notice a rule's `source` predates a known change in the relevant law, surface it instead of applying the rule blindly.
2526## Prerequisites
2728- A structured playbook in YAML (or equivalent machine-readable format) containing clause rules with machine-checkable fields.
29- The contract text in a readable format (plain text, Markdown, or HTML — strip tags before extracting excerpts).
30- If the playbook uses YAML 1.1, migrate to YAML 1.2 first to avoid silent boolean coercion of `no`/`off`/`yes`.
31- Confirm the playbook is current: check each rule's `source` field against known legal or market changes.
3233## Procedure
3435### Step 1: Load and validate the playbook
36371. Parse the playbook file. Confirm it is valid YAML (or the specified format).
382. Check for deprecated rule types (`must_be_exactly` → migrate to `acceptable_set`).
393. If YAML 1.1 is in use, migrate to YAML 1.2 before proceeding.
404. Inventory the clause list — you will emit one finding per clause, in the playbook's declared order. No additions, no deletions.
4142### Step 2: Walk the playbook — four-step loop per clause
4344For each clause rule in the playbook, repeat:
4546#### 2a. Locate the corresponding provision in the contract
4748The contract may use different headings. Use three strategies in order:
49501. **Heading match** — try the playbook's `key` and `label` against the contract's section headings (e.g. playbook `governing_law` → contract heading "Governing Law" or "Choice of Law").
512. **Operative-verb scan** — search for verbs/phrases that mark the clause function. ("shall return or destroy" → return/destruction; "irreparable harm" + "injunctive" → equitable relief; "governed by and construed in accordance with" → governing law).
523. **Keyword neighbourhood** — for numeric rules, find the unit ("year", "months", "$") and read the surrounding sentence to decide whether it is the term, survival, notice period, or some other duration.
5354If you searched and the contract really has nothing, set `found: false` and `excerpt: ""`. Do not manufacture an excerpt. Do not infer one from the playbook prose. A missing clause is a legitimate finding.
5556#### 2b. Apply the rule
5758Check the contract's position against the policy fields. Recognise the rule shape:
5960| Rule shape | Field example | "ok" means |
61|---|---|---|
62| Numeric ceiling | `max_years: 3`, `max_months: 24` | Contract value ≤ ceiling |
63| Numeric floor | `min_years: 1` | Contract value ≥ floor |
64| Must be present | `must_be_present: true` | Provision exists |
65| Must be absent | `must_be_absent: true` | Provision (or specific phrasing) does NOT exist |
66| Acceptable set | `acceptable_jurisdictions: ["England and Wales", "New York", "Delaware"]` | Contract value ∈ set |
67| Required feature | `must_allow_destruction: true` | Provision contains the feature |
68| Conjunction of features | `must_require_notice && must_require_cooperation` | All features present |
69| Conditional structural | `must_be_bilateral_if_present` | Provision absent OR present-and-symmetric |
7071A playbook entry may carry a `source` field naming the published authority the rule is anchored to (a survey, statute, treatise, or firm-published practice guide). When present, treat it as load-bearing — the rule's threshold is not arbitrary; it is the cited source's stated value.
7273A clause may combine several rule shapes (e.g. "must be present AND have backup carve-out AND allow destruction"). The clause's overall status is `ok` only if *every* sub-rule passes.
7475#### 2c. Classify the outcome
7677**Status is derived from the playbook's `action_*` field, not from the rule shape.** This is the most common place an agent goes wrong: it sees `must_be_absent` and reaches for `reject` by reflex. Don't. Use the prescribed action to decide status:
7879- `action_if_ok` ("accept", "no_change") → status `ok`
80- Any action that begins with `request_` (`request_reduction` / `request_addition` / `request_revision` / `request_change` / `request_amendment`) → status `risk`. The "request_" prefix is the signal: we still want the contract; we're going to negotiate. Even a `must_be_absent` clause whose `action_if_present` is `request_revision` is still **risk**, not reject.
81- `action_if_present` (or `action_if_violated`) of `reject_and_remove` / `reject` / `walk_away` → status `reject`. The rule's prescribed response is to refuse, not to negotiate.
8283When the playbook is silent on a particular outcome, fall back to: action prefix `request_` → `risk`; explicit reject/walk-away → `reject`.
8485#### 2d. Record the finding
8687Emit a structured finding with these non-optional fields:
8889- `clause` — the playbook clause key
90- `found` — boolean; `true` if the provision was located in the contract
91- `excerpt` — verbatim substring of the contract source (see rules below); `""` when `found: false`
92- `status` — `ok`, `risk`, or `reject` (derived from action, not rule shape)
93- `action` — the playbook's prescribed action for this outcome
94- `rationale` — one sentence stating the operative facts and the rule applied
9596### Step 3: Extract the verbatim excerpt
9798The excerpt is what proves your finding. Three hard rules:
991001. It must be a **substring** of the contract source — character-for-character, including punctuation and capitalisation. Do not paraphrase. Do not stitch together text from different paragraphs.
1012. Keep it **short and targeted** — the smallest excerpt that contains the operative language. Most playbooks bound this (e.g. ≤ 400 characters). If the operative language spans more than that, choose the most diagnostic phrase.
1023. For a `found: false` finding, the excerpt is `""`.
103104When extracting from Markdown or plain text, copy the exact run including any quotation marks, parentheses, or numerical values. When extracting from HTML, strip tags first; do not include rendered artifacts.
105106### Step 4: Write the rationale
107108One sentence. State the operative facts and the rule applied. Examples:
109110- **ok:** "Term is one year, within the 3-year maximum."
111- **risk (numeric ceiling):** "Survival is ten years, exceeding the 7-year cap."
112- **risk (missing feature):** "Definition exclusions cover the four standard exceptions but omit a residuals carve-out."
113- **reject:** "A non-compete covenant is present; the playbook's prescribed action for this clause is reject_and_remove."
114115Avoid: hedging ("appears to", "may be"), restating the playbook in full, repeating the rationale across clauses.
116117### Step 5: Emit output
118119- Emit one entry per playbook clause, in the playbook's declared order. No additions, no deletions.
120- Schema fields are non-optional: `clause`, `found`, `excerpt`, `status`, `action`, `rationale`. Use empty string (not null, not missing) when the value is empty.
121- The output format is whatever the instruction specifies (usually JSON). Validate the file is parseable before declaring done.
122123## Examples
124125### Example 1: Numeric ceiling rule (Term duration)
126127**Playbook entry:**
128```yml
129clause: term
130label: "Term"
131max_years: 3
132action_if_ok: "accept"
133action_if_violated: "request_reduction"
134source: "Firm NDA Playbook v2.1"
135```
136137**Contract excerpt:**
138> "This Agreement shall commence on the Effective Date and continue for a period of five (5) years unless earlier terminated in accordance with Section 9 (Termination). Upon expiry of the initial term, this Agreement shall automatically renew for successive one (1) year periods unless either party gives ninety (90) days' written notice of non-renewal."
139140**Finding:**
141```json
142{
143 "clause": "term",
144 "found": true,
145 "excerpt": "continue for a period of five (5) years",
146 "status": "risk",
147 "action": "request_reduction",
148 "rationale": "Term is five years, exceeding the 3-year maximum."
149}
150```
151152### Example 2: Must-be-absent rule (Non-compete)
153154**Playbook entry:**
155```yml
156clause: non_compete
157label: "Non-Compete"
158must_be_absent: true
159action_if_present: "reject_and_remove"
160source: "Firm MSA Playbook v3.0"
161```
162163**Contract excerpt:**
164> "During the Term and for twelve (12) months thereafter, Employee shall not, directly or indirectly, engage in any business competitive with the Company within the United States, nor solicit any customer or employee of the Company, without the Company's prior written consent."
165166**Finding:**
167```json
168{
169 "clause": "non_compete",
170 "found": true,
171 "excerpt": "Employee shall not engage in any business competitive with the Company",
172 "status": "reject",
173 "action": "reject_and_remove",
174 "rationale": "A non-compete covenant is present; the playbook's prescribed action for this clause is reject_and_remove."
175}
176```
177178### Example 3: Missing clause (must-be-present)
179180**Playbook entry:**
181```yml
182clause: data_destruction
183label: "Return or Destruction of Data"
184must_be_present: true
185must_allow_destruction: true
186action_if_missing: "request_addition"
187action_if_violated: "request_revision"
188```
189190**Contract:** No matching provision found.
191192**Finding:**
193```json
194{
195 "clause": "data_destruction",
196 "found": false,
197 "excerpt": "",
198 "status": "risk",
199 "action": "request_addition",
200 "rationale": "No return/destruction clause found; playbook requires one with destruction right."
201}
202```
203204## Pitfalls
205206- **Confusing term and survival.** Two different durations. The contract's "Term" section is the active period; survival is buried at the end of that section as "the provisions of Sections X, Y, Z shall survive...". Read the whole Term section before classifying either.
207- **Treating a `must_be_absent` rule as a numeric ceiling.** If the playbook says `must_be_absent: true`, a 1-year non-compete still violates the rule even though "1 year" sounds reasonable — the presence matters, not the value. The violation's *status* then comes from the prescribed action as always: `request_*` → `risk`; only an explicit reject / walk-away action makes it `reject`.
208- **Granting credit for a partial feature.** "Must allow destruction AND have backup carve-out" requires *both*. Don't mark `ok` for a return/destruction clause that allows destruction but lacks the backup carve-out.
209- **Reading the recital as the clause.** The preamble often paraphrases obligations ("the parties wish to protect..."); the operative clause is later. Find the operative clause.
210- **Inferring presence from a cross-reference.** If Section 9 says "Sections 3, 4, 5 ... shall survive", Sections 3, 4, and 5 themselves are *not* the survival clause — they're whatever they were. The survival clause is the cross-reference itself.
211- **Going directly from rule shape to status.** A `must_be_absent` rule with `action_if_present: "request_revision"` is `risk`, not `reject`. Always derive status from the `action_*` field.
212- **Paraphrasing the excerpt.** The excerpt must be a character-for-character substring. Any paraphrasing — even minor word swaps — invalidates the finding's grounding.
213- **Skipping silent clauses.** Don't skip clauses just because the contract is silent on them — silence is itself a finding (`found = false`) and may trigger an action (e.g. "request_addition").
214- **Using null instead of empty string.** Schema fields are non-optional. Use `""` (empty string), not `null` or missing keys.
215216## Verification
217218- [ ] Run the test suite against sample contracts with known playbook outcomes.
219- [ ] Verify all rule types (numeric ceiling, floor, must-be-present, must-be-absent, acceptable set, required feature, conjunction, conditional structural) produce correct status mappings.
220- [ ] Confirm verbatim excerpts are exact substrings of source contracts — character-for-character, including punctuation and capitalisation.
221- [ ] Validate JSON output schema compliance: all required fields present (`clause`, `found`, `excerpt`, `status`, `action`, `rationale`), empty strings not null.
222- [ ] Check that missing clauses correctly return `found: false` with empty excerpt and appropriate action-derived status.
223- [ ] Confirm one finding per playbook clause, in declared order — no additions, no deletions.
224- [ ] Confirm status is derived from `action_*` fields, not from rule shape (e.g. `must_be_absent` with `request_*` action → `risk`, not `reject`).
225- [ ] Test for security vulnerabilities, such as unauthorized access to contract data or potential data breaches.
226- [ ] Validate playbook updates to ensure they reflect changes in laws, regulations, or industry standards.
227228## Related Skills
229230- **contract-extraction** — for pulling structured data from contracts before playbook review.
231- **clause-classification** — for identifying clause types when playbook keys don't match headings.
232- **redline-generation** — for producing negotiated markup after playbook review findings.
Run npx skillmds@latest add kayforkind/contract-playbook-review in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Compares each YAML playbook rule to the matching contract provision and emits one ordered finding with found, character-exact excerpt, and status derived from action_* (ok/risk/reject). Apply when an NDA, MSA, DPA, lease, or vendor DD questionnaire must be scored against machine-checkable fields such as max_years or acceptable_jurisdictions. Not a contract-drafting generator and not advice beyond encoded rules; skip reviews that have no playbook. It is listed under Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: docs only. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
Kayforkind (@kayforkind) published this skill. Their other Agent Skills are listed on their SkillMD profile.