---
name: contract_amendment_tracking
description: Track how a contract changed across its base agreement and every amendment: build a clause by clause change register, reconcile conflicting clauses with ranked conflict rules, flag terms that were silently replaced or dropped in a restatement, check whether each amendment was actually executed, and produce a current state summary a reviewer can trust. Ships a register template, a tested reconciler tool, conflict rules, and a worked three amendment example. Use when someone asks what a contract says now, whether an amendment changed a clause, which version of a term governs, or wants an amendment history or a consolidated current position.
---

# Contract Amendment Tracking

## Purpose

After two or three amendments, nobody can say from memory what a contract says now. The base agreement says one fee, Amendment 1 raised it, and Amendment 3 restated the whole section from an old copy, so one service fell out without anyone announcing it. The signed documents hold the answer. Finding it takes a register, not a reread of the pile each time.

This skill gives you one workflow for that job:

- The change register: `assets/change-register-template.csv`. One row per clause per change, with the text before and after, the document that made the change, and whether that document was executed.
- The reconciler: `scripts/amendment_register.py`, standard library only. It validates a register, prints the current state of every clause, gives an as-of view for any date, and flags orphan changes, rival replacements, changes after a deletion, renumber collisions, unexecuted documents, and clauses a restatement may have silently dropped.
- The conflict rules: `references/conflict-rules.md`. Eight ranked rules for deciding which text governs when documents disagree, starting with the language in the documents themselves.
- A worked example: `references/worked-example.md` and `assets/worked-register.csv`. One services agreement, three executed amendments, one unsigned draft, and one silent drop caught by the tool.
- The summary template: `assets/current-state-template.md`.

The output is tracking and reconciliation. It reports what the signed documents say and where they disagree. It is not legal advice, and a genuine conflict goes to counsel or gets settled by a clarifying amendment, never by this workflow picking a winner on its own.

## Workflow

1. **Assemble the full set before reading any of it closely.** List every document that claims to be part of the deal: the base agreement, each amendment, addendum, supplement, change order, side letter, restated agreement, and every exhibit or schedule any of them incorporates. For each one record the title, the date signed, the effective date, and where the signed copy was seen. Name any document that another document references but that nobody produced. A missing amendment in the middle of the sequence invalidates every conclusion after it, so the set gets settled first.

2. **Confirm execution for each document.** Check the signature blocks against the amendment formality the base agreement requires. Standard entire agreement clauses allow amendment only by a writing signed by both parties, or by an authorized representative of each. Mark each document executed, draft, or unsigned in the register. Drafts and unsigned documents are tracked and reported as pending. They never change the current state.

3. **Open the register from the template and enter the base agreement first.** One row per clause that could ever matter, action original, with a short summary of the clause as signed in new_text. Summaries stay short and carry the operative number, date, period, or test in plain words, for example "Fees USD 10000 per month". Full clause text belongs in a consolidated copy, covered in step 8, not in the register.

4. **Enter each amendment in effective date order, one row per clause it touches.** Use the action that matches what the document does to that clause: add for a new clause, replace when wording changes, delete when a clause is removed, clarify when the substance is confirmed and only a detail is pinned down, renumber when only the reference moves, and restate when a section or the whole agreement is republished in full. Fill prior_text with the summary exactly as the register currently holds it. A mismatch between prior_text and the register is a signal that the amendment was drafted against a different version, and the tool flags it. Classify by function, not by the word on the cover: an addendum that rewrites a price is a replace row for that clause.

5. **Capture the governing language of each amendment as you enter it.** Record in the notes what the amendment says about conflict and about everything else: which document controls if they disagree, and whether all other terms are ratified and unchanged. Record its order of precedence clause if it has one. These lines decide most conflicts later, and they are easy to miss once the rows are entered.

6. **Give every restatement a covers list.** When a document restates a section or the whole agreement, set clause_ref to the section, action to restate, and covers to every clause the restated text includes, separated by semicolons. Then enter separate rows for any clause whose wording the restatement actually changed. The covers list is what lets the tool compare the restatement against what was active before it.

7. **Validate, and work every finding.** Run `python3 scripts/amendment_register.py validate REGISTER.csv`. A BLOCK stops the summary until a human resolves it: an orphan change pointing at a clause that never existed, a change applied after its clause was deleted, two rival replacements on one date with no supersedes link, a renumber into a live clause, or a SILENT_DROP, where a restatement omits a clause that was active under it. A REVIEW item gets a written answer in the summary: a prior text mismatch, a double delete, or a document that is not executed. Never edit the register just to clear a finding. The finding is either a register error, which you fix and note, or a fact about the documents, which goes in the summary.

8. **Build the current state, and an as-of view when the question has a date.** Run `python3 scripts/amendment_register.py current REGISTER.csv` for the position today, and add `--as-of YYYY-MM-DD` when someone asks what governed on a past date, for example during a disputed invoice period. Run the summary subcommand for clause histories: `python3 scripts/amendment_register.py summary REGISTER.csv`. Where a consolidated, fully amended copy of the agreement exists, check the tool output against it clause by clause. Where none exists, the register output is the closest thing to one, and the summary says that plainly.

9. **Reconcile conflicts with the ranked rules, and record which rule settled each one.** Work `references/conflict-rules.md` in order: the documents own conflict, precedence, and ratification language first, then execution, then the common default that a more recent executed amendment ranks above an earlier one and above the base agreement, then specific over general and negotiated over boilerplate as interpretation aids. Write the rule used into the register notes for that clause. When no rule settles a conflict, both texts go in the summary side by side, with the recommended next step: a short clarifying amendment signed by both parties, or advice from counsel.

10. **Chase renumbering pointers.** For every renumber row, search the base agreement, all amendments, and all schedules for references to the old number. List each reference that the amendment did not update as a dangling pointer in the summary. Renumbering is where cross references to notice, termination, and liability clauses quietly break.

11. **Write the current state summary from the template.** Lead with what is in force now, clause by clause, with the source document and the last change for each. Follow with a short paragraph per amendment, the deleted and renumbered list, and every open finding in plain words with what would settle it. Name the unsigned draft and what it would change if signed, labeled as pending. Fill the documents relied on section from step 1, including anything referenced and not produced.

12. **Update the living records the amendment changed.** A register that says the fee, term, cap, or notice period changed is only half the job. Note in the summary which downstream records now need the new value: billing, obligation and deadline trackers, renewal dates, and notice addresses. An amendment that is executed but never reaches those records creates drift between what the contract says and what the business does.

13. **Verify the tool before trusting it on a real contract.** Run `python3 tests/score_worked.py` from this skill folder. Expected result: 9 of 9 checks pass, covering the silent drop flag, the unsigned draft being held out of the current state, the as-of view returning the Amendment 1 fee, and the template validating clean.

## Output Contract

- A change register in the template columns, one row per clause per change, in effective date order, with execution status on every row and the governing language of each amendment in its notes.
- A current state table giving, for every tracked clause, its status, its current position in plain words, the document that last changed it, and the change row behind that.
- An as-of current state whenever the question is tied to a date, with the date stated on the summary.
- A findings list where every BLOCK and REVIEW item from validation appears in plain words, with the clause, the documents involved, and what would settle it. No finding is dropped to make the summary read cleanly.
- A conflict note for every reconciled clause, naming the rule from the conflict rules that settled it.
- A current state summary built on the template, with deleted and renumbered clauses, dangling pointers, pending drafts, and the documents relied on all named.

## Operating Rules

- Signed documents are the only source. Summaries, slide decks, email threads, and memory can point you to a document. They never enter the register as a change.
- Execution decides force. A document changes the current state only when it was executed the way the base agreement requires and its effective date has arrived.
- Date order is a default, not a law. Apply the most recent amendment wins default only when the documents own language does not say otherwise, and mark the notes when you used it.
- A clause missing from a restatement stays active and flagged until both parties confirm the drop in writing. Silence in a restatement is a question, never a deletion.
- Keep both sides of an unsettled conflict visible. A tidy summary that hides a conflict is a wrong summary.
- One row does one thing. A document that adds one clause, replaces another, and renumbers a third gets three rows, so each change can be checked on its own.
- Federal contract files use their own vocabulary. Under FAR 43.103 a bilateral modification is signed by both sides and a unilateral modification by the contracting officer alone. Record which kind each modification is instead of forcing the commercial labels onto it.
- When the documents and this skill disagree about how a contract works, the documents win, and the disagreement gets noted in the register so the next reviewer sees it.
