Track Deadlines and Signatures
One skill for every standing-state tracker agent maintain. scope param pick tracker; atomic read-merge-write discipline shared.
Parameter: scope
signatures- watch connected signing platform (DocuSign / PandaDoc / HelloSign) for outstanding docs. Draft polite reminders for laggards (never send). File executed copies to connected doc-storage (Google Drive / Dropbox / Notion). Write status board tosignature-status/{YYYY-MM-DD}.md.counterparties- append executed agreement tocounterparty-tracker.jsonat agent root. Fields:id,counterparty,agreementType,executedDate,effectiveDate,term,autoRenewal,noticePeriod,governingLaw,keyObligations,renewalDate,signedCopyPath. Feeddeadlinesscope (renewal clock) +weekly-reviewscope (rollup).deadlines- seed + refresh canonical legal calendar. Static deadlines (Delaware March 1 annual report, 83(b) 30-day from grant, 409A refresh 12 months, DSR 30-day GDPR / 45-day CCPA, TM office action 6-month, annual board consent) + dynamic deadlines fromcounterparty-tracker.json(renewal clocks, notice windows). Writedeadline-calendar.jsonat agent root + 90-day readout todeadline-summaries/{YYYY-MM-DD}.md. Flag ≤ 30 days urgent, overdue critical.weekly-review- aggregate across agent by readingoutputs.json: what shipped this week (contract reviews, drafts, audits, filings), what pending signature (fromsignature-status/most recent), next deadline (fromdeadline-calendar.json), what flagged for attorney review (attorneyReviewRequired: trueentries without resolution). Writeweekly-reviews/{YYYY-MM-DD}.md.
If user name scope plain English ("chase signatures", "log this deal", "what's due", "Monday review"), infer. If ambiguous, ask ONE question naming 4 options.
When to use
- Explicit: "where are my signatures", "log {counterparty}'s executed {type}", "what's due soon / overdue", "Monday legal review", "weekly legal readout".
- Plain-English asks map to a
scope: "nudge / chase pending signatures" / "who hasn't signed yet" →signatures; "I just signed something, log it" / "log this signed agreement" / "track this auto-renewal" →counterparties; "check my legal deadlines" / "what's coming up in the next 90 days" →deadlines; "weekly legal review" / "Monday rollup" →weekly-review. - Implicit: chained from
review-a-contract(any mode) tocounterpartieswhen contract hit executed status; from scheduled routines forweekly-review+deadlines; fromsort-my-legal-inboxwhen detect executed-copy attachment forcounterparties.
Ledger fields I read
Read config/context-ledger.json first.
universal.legalContext+context/legal-context.md- recommended not required. Enrichweekly-reviewwith standing context. If missing +weekly-reviewscope, runset-up-my-legal-infoskill or proceed with note.universal.entity- required fordeadlines(formation date gate Delaware March 1 relevance; 409A date set 12-month clock).domains.contracts.signingPlatform- required forsignatures. If missing, ask ONE question - connect DocuSign / PandaDoc / HelloSign or paste status.domains.contracts.documentStorage- required forsignatures(where to file executed copies) +counterparties(where signed copy live -signedCopyPath).counterparty-tracker.json- required forcounterparties(read-merge-write) +deadlines(source of dynamic renewal clocks) +weekly-review(new logs this week).deadline-calendar.json- required fordeadlines(baseline to diff against) +weekly-review(next-deadline surface).outputs.json- required forweekly-review(roll-up source).
If any required field missing, ask ONE targeted question with right modality hint, write, continue.
Steps
- Read ledger + state files. Gather missing required fields per above. Write atomically.
- Discover tools via Composio.
composio search signing-platform(signatures),composio search document-storage(signatures + counterparties). No discovery needed fordeadlinesorweekly-review(pure file ops). - Branch on
scope.signatures:- Execute signing-platform slug - list outstanding envelopes. For each: recipient, sent date, days open, last-viewed status.
- Draft polite reminder per laggard (> 5 days open). Never send - drafts go into status board for founder to send.
- For executed envelopes, fetch PDF via signing-platform slug. Execute doc-storage slug to save to well-known path (
contracts/executed/{counterparty}-{YYYY-MM-DD}.pdf). - Write
signature-status/{YYYY-MM-DD}.md- three sections: Outstanding (+ reminders) / Recently executed (+ paths) / Stalled (> 14 days open - recommend outreach or withdraw). For each executed envelope, recommend chain totrack-deadlines-and-signaturesscope=counterparties to log.
counterparties:- Take input: counterparty name, agreement type, executed date, effective date, term, auto-renewal, notice period, governing law, key obligations (brief), signed-copy path. Ask ONE question for any missing field.
- Compute
renewalDatefromeffectiveDate + term - noticePeriod(critical date = when notice must be given to avoid auto-renewal). - Read-merge-write
counterparty-tracker.jsonatomically. Do not overwrite existing rows -idstable; update-in-place on match. - Append to
outputs.jsonastype: "counterparty-log".
deadlines:- Start from canonical static deadline set:
- Delaware annual report - March 1 every year (gate on
universal.entity.state === "DE"). - 83(b) election window - 30 days from each option grant / founder-stock restricted-purchase. Source:
outputs.jsonentries for recent grants. - 409A refresh - 12 months from
universal.entity.four09aDate. - DSR response window - 30 days (GDPR Art. 15) / 45 days (CCPA); track from any
dsr-responseentry inoutputs.json. - TM office action response - 6 months from each office action; gate on
domains.ip.marks. - Annual board consent - 365 days from last board consent.
- Delaware annual report - March 1 every year (gate on
- Enrich with dynamic deadlines from
counterparty-tracker.json- for each open row, computerenewalDate+ notice-deadline (=renewalDate - noticePeriod). - Read-merge-write
deadline-calendar.json:id,kind,label,due,source,authority,urgency(critical if overdue or ≤ 30 days; high ≤ 90 days; medium ≤ 180 days; low > 180 days). - Write
deadline-summaries/{YYYY-MM-DD}.md- 90-day readout: Critical + High first; for each, cite authority (e.g. "8 Del. C. §503", "IRC §83(b)", "GDPR Art. 15"). - Append to
outputs.jsonastype: "deadline-summary".
- Start from canonical static deadline set:
weekly-review:- Read
outputs.json. Filter to entries withcreatedAtorupdatedAtwithin last 7 days. - Group by
domain(contracts / compliance / entity / ip / advisory). For each: what shipped, titles + paths. - Read most recent
signature-status/- surface outstanding signatures + stalled. - Read
deadline-calendar.json- next 3 deadlines by urgency. - Surface any
attorneyReviewRequired: trueentries that don't yet haveescalation-brieffollow-up. - Write
weekly-reviews/{YYYY-MM-DD}.md- sections: What shipped (by domain) / Pending signature / Next 3 deadlines / Attorney-review backlog / Recommended next moves. - Append to
outputs.jsonastype: "weekly-review".
- Read
- Atomic writes everywhere (
*.tmp→ rename). - Summarize to user. One short paragraph in plain language: the most important thing from this run (the deadline they need to know about, the signatures still pending, what shipped this week). Never name files or paths.
What I never do
- Send reminders, request signatures, or file executed copies anywhere outside configured doc-storage. Every "sendable" artifact is draft in status board.
- Invent counterparty, term, or deadline. If field not in input or source file, mark UNKNOWN / TBD + ask ONE targeted question.
- Promise auto-renewal won't fire - dates I cite mechanical; founder decides to send notice.
- Overwrite
counterparty-tracker.jsonordeadline-calendar.json- read-merge-write always. - Cite statutory deadline without naming authority (GDPR Art. 15, IRC §83(b), 8 Del. C. §503, etc.).
- Hardcode tool names - Composio discovery at runtime only.
Outputs
signature-status/{YYYY-MM-DD}.md(scope=signatures).- Updates
counterparty-tracker.json(scope=counterparties). deadline-summaries/{YYYY-MM-DD}.md+ updatesdeadline-calendar.json(scope=deadlines).weekly-reviews/{YYYY-MM-DD}.md(scope=weekly-review).- Appends to
outputs.json.