Skip to content
24 changes: 18 additions & 6 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,36 @@ on:
- ready_for_review

jobs:
lint:
checks:
if: github.event.pull_request.draft == false
uses: holdex/github-actions/.github/workflows/markdown-check.yml@main

check-links:
if: github.event.pull_request.draft == false
needs: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: holdex/github-actions/.github/actions/base/checkout@05eefbf2dfd772dbb2c12b9985d21ac24c5da0e5
with:
ref: 05eefbf2dfd772dbb2c12b9985d21ac24c5da0e5

- uses: ./.holdex-actions/.github/actions/base/setup-runtime
with:
package-manager: bun

- uses: ./.holdex-actions/.github/actions/composed/pr-checks
with:
run-prettier: false
run-markdown: true
run-commits: true
package-manager: bun

- name: Check links
uses: lycheeverse/lychee-action@v1
with:
args: >
--verbose
--no-progress
--exclude-mail
--exclude-path .holdex-actions
--exclude-path node_modules
'**/*.md'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
102 changes: 93 additions & 9 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,38 +6,122 @@ at least 14 days before changes take effect.

---

## v1.0 — 2026-03-29
## v1.1.0 — 2026-04-01

**Standard Terms:**

- Confidential Information — general business information obligation reduced
from indefinite to 3 years from termination date; trade secrets remain
indefinitely confidential
- Intellectual Property — pre-existing IP carve-out added; Contractor retains
ownership of pre-existing tools, methodologies, and general knowledge; Company
receives a perpetual non-exclusive license to use any pre-existing IP
incorporated into Work Product
- Intellectual Property — moral rights waiver qualified to "to the extent
permitted by applicable law" to accommodate jurisdictions where moral rights
are inalienable (e.g. Italy, EU)
- Intellectual Property — added Prior Inventions Disclosure: pre-existing IP the
Contractor wishes to retain must be listed in the Special Terms schedule at
signing; unlisted IP incorporated into Work Product is presumed Company-owned;
the list cannot be amended after signing without mutual written consent
- Intellectual Property — added Third-Party IP Warranty: the Contractor warrants
Work Product is original, contains no unlicensed third-party or open source
materials that would restrict the Company's use, and that the Contractor has full
authority to assign; breach triggers a contractor indemnity obligation
- Non-Solicitation — employee non-solicitation made mutual;
client non-solicitation reduced from 3 years to 1 year, and narrowed to services
substantially similar to those provided under this Agreement
- Indemnification — mutual indemnification added; Company now indemnifies
Contractor against its own gross negligence, willful misconduct, breach, and
third-party IP claims related to materials provided by the Company; Notice
clause made mutual
- General Provisions — Entire Agreement clause now cross-references the
Supersession clause in Special Terms rather than restating it
- Notices clause line length fixed for formatting consistency
- Services — added Subcontracting clause: the Contractor may not subcontract any
part of the Services without prior written approval; if approved, the Contractor
remains fully liable and must bind any subcontractor to equivalent obligations
- Services — added Audit Right: the Company may request the Contractor's trace log
and supporting records on 5 business days' notice; overbilling identified by an
audit must be repaid within 14 days
- Engagement Modes — added Monthly Hours Cap clause for Retainer engagements: hours
above the cap set in the Special Terms require prior written approval from an
Authorised Issuer; unapproved excess hours are not payable
- Work Orders — added Rejection and Cure clause: an Authorised Issuer must provide
written reasons when rejecting a deliverable; the Contractor then has at least 5
business days to remedy and resubmit; if no written rejection is given within
10 business days of submission, the deliverable is deemed accepted
- Compensation — added Invoice Submission Deadline: invoices must be submitted
within 30 days of the billing period end (Retainer) or written acceptance
(Project/Milestone); the Company is not obligated to pay late invoices
- New section: Data Protection and Information Security — requires PDPO compliance
and adherence to applicable data protection laws; restricts use of Company data
to performance of Services; mandates minimum security measures (full-disk
encryption, strong unique credentials with MFA, up-to-date software, secure
networks); requires 24-hour written incident notification; makes the Contractor
financially responsible for remediation costs where a breach results from their
non-compliance with this section; obligations survive termination
- Termination — added Termination for Cause: the Company may terminate immediately
and without notice for material breach (unremedied after 5 business days), fraud,
criminal conduct, confidentiality breach, or violation of applicable law; payment
on cause termination is limited to work accepted before the termination date, net
of any amounts owed by the Contractor
- Updates — added Summary for Convenience Only clause: any changelog or summary
provided in an update notification is informational only; the full text of the
Standard Terms prevails in the event of inconsistency

**Special Terms template:**

- Rate Card — added Monthly Hours Cap field to the Retainer section
- Added Prior Inventions Schedule section (between Supersession and Signatures)
for the Contractor to disclose pre-existing IP at the time of signing

---

## v1.0.0 — 2026-03-29

Initial release of the Standard Terms and Special Terms template.

**Standard Terms covers:**

- Services, including record-keeping obligations
- Compensation — hourly, per-project, and milestone-based
- Engagement Modes — Retainer (hourly, no Work Order per task) and
Project/Milestone (formal Work Order required per engagement)
- Work Orders — GitHub issues only, issued by Authorised Issuers listed in
Special Terms, accepted by contractor comment. Applies to Project/Milestone
engagements only
- Compensation structured around Engagement Mode — Retainer hourly rate set at
signing; Project/Milestone fees defined per Work Order
- Expenses and reimbursement
- Independent contractor status
- Communication channels and logging requirements
- Representations and warranties
- Confidential information, including return and deletion on termination
- Information Sharing — applies to all contractors universally
- Intellectual property ownership and assignment
- Non-solicitation of employees and clients
- Non-compete restricted to specific clients worked with under this Agreement
- Termination with 7 days notice, with payment terms covering all three
payment types — including good faith negotiation for partially completed
milestones within 14 days, falling back to arbitration if unresolved
- Termination with 7 days notice, covering Retainer, Per Project, and
Milestone-Based payment types — including good faith negotiation for partially
completed milestones within 14 days, falling back to arbitration if unresolved
- Indemnification and liability cap
- General provisions
- Dispute resolution and arbitration in Hong Kong under HKIAC rules
- Process for updating these terms

**Special Terms template covers:**

- Company and contractor details
- Role and designated manager
- Services and information sharing
- Compensation section with three payment type options
- Company and contractor details including GitHub handle, Telegram and WhatsApp
- Engagement Details — Primary Capacity and designated manager
- Authorised Issuers (pre-filled: CEO and Co-Founder)
- Services
- Rate Card — Retainer hourly rate set at signing; Project/Milestone fees
defined per Work Order
- Work Order template for GitHub issue structure (Project/Milestone only)
- Commencement date
- Supersession clause — this Agreement immediately replaces all prior agreements
on signing, while preserving any accrued unpaid amounts from previous agreements
- Signature block

---

Expand Down
32 changes: 16 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Each contractor engagement produces two documents:

**1. Standard Terms** (`STANDARD_TERMS.md`)
The boilerplate legal terms governing all contractor relationships. Versioned
by git tags (e.g. `v1.0`). The tag is the version — git timestamps it
by git tags (e.g. `v1.0.0`). The tag is the version — git timestamps it
automatically. Never edited retroactively.

**2. Special Terms** (`SPECIAL_TERMS.md`)
Expand All @@ -40,7 +40,7 @@ version in the private HR repository alongside any signed artifacts.

The contractor signs a document that references both:

- The Standard Terms by tag (e.g. `v1.0`)
- The Standard Terms by tag (e.g. `v1.0.0`)
- The Special Terms by the commit of their filled-in copy

---
Expand All @@ -49,17 +49,17 @@ The contractor signs a document that references both:

### 1. Prepare the Special Terms

Copy `SPECIAL_TERMS.md` to the private HR repository. Fill in all
Copy [SPECIAL_TERMS.md](SPECIAL_TERMS.md) to the private HR repository and name it `AGREEMENT.md`. Fill in all
`<!-- PLACEHOLDER -->` fields. In the Compensation section, keep only
the subsection that applies to this contractor (Hourly, Per Project, or
Milestone-Based) and delete the other two. Record the Standard Terms tag
currently in effect (e.g. `v1.0`) at the top of the document.
currently in effect (e.g. `v1.1.0`) at the top of the document.

### 2. Send for signing

Share the filled-in Special Terms with the contractor for review and signature.
Signatures can be collected digitally (e.g. DocuSign) or as a signed PDF scan.
Store the signed copy in the private HR repository.
Signatures can be collected digitally (e.g. PandaDoc) or as a signed PDF scan.
Store the signed `AGREEMENT_SIGNED.pdf` file in the private HR repository.

### 3. Confirm the version on record

Expand Down Expand Up @@ -109,12 +109,12 @@ Once approved and merged:
```bash
git checkout main
git pull
git tag v1.1 # increment the version number
git push origin v1.1
git tag v1.1.0 # increment the version number
git push origin v1.1.0
```

Then go to **GitHub → Releases → Draft a new release**, select the tag,
and publish. Copy the release URL — you will need it for contractor notifications.
Then go to [GitHub → Releases → Draft a new release](https://github.com/holdex/contractor-terms/releases/new), select
the tag, and publish. Copy the release URL — you will need it for contractor notifications.

### 6. Notify contractors

Expand All @@ -124,17 +124,17 @@ Send an email to all active contractors with:
- A link to the new release
- The date the new terms take effect (minimum 14 days from the email date)

Use the subject line: `Holdex Contractor Terms Update — v1.1 effective [DATE]`
Use the subject line: `Holdex Contractor Terms Update — [version_number] effective [DATE]`

---

## Versioning Convention

| Tag | Meaning |
| ------ | -------------------------------------------------------------------------- |
| `v1.0` | Initial release |
| `v1.1` | Minor update — clarification, new clause, small change |
| `v2.0` | Major update — significant change to rights, obligations, or payment terms |
| Tag | Meaning |
| -------- | -------------------------------------------------------------------------- |
| `v1.0.0` | Initial release |
| `v1.1.0` | Minor update — clarification, new clause, small change |
| `v2.0.0` | Major update — significant change to rights, obligations, or payment terms |

When in doubt, increment the minor version. Use a major version bump when
the change materially affects contractor obligations or Company rights —
Expand Down
34 changes: 27 additions & 7 deletions SPECIAL_TERMS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
> the Standard Terms published at:
> [github.com/holdex/contractor-terms](https://github.com/holdex/contractor-terms)
>
> **Standard Terms version applicable to this Agreement:** <!-- e.g. v1.0 -->
> **Standard Terms version applicable to this Agreement:** <!-- e.g. v1.0.0 -->

---

Expand Down Expand Up @@ -71,10 +71,11 @@

> Applies only if Engagement Mode is Retainer. Leave blank otherwise.

| Field | Value |
| --------------- | ---------------------- |
| Rate (USD/hour) | <!-- RATE_PER_HOUR --> |
| Payment Cycle | Monthly |
| Field | Value |
| ----------------- | ---------------------------------------- |
| Rate (USD/hour) | <!-- RATE_PER_HOUR --> |
| Payment Cycle | Monthly |
| Monthly Hours Cap | <!-- MONTHLY_HOURS_CAP (or "None") --> |

### Project and Milestone Fees

Expand All @@ -100,8 +101,8 @@ the issue must follow this structure:

```text
**Work Order — [Brief Title]**
Agreement: [Contractor Full Name] — Special Terms v[X] / Standard Terms v[X]
Payment Type: [Per-Project / Milestone-Based / Retainer + Commission]
Agreement: [Contractor Full Name] — Special Terms v[X.Y.Z] / Standard Terms v[X.Y.Z]
Payment Type: [Per-Project / Milestone-Based / Hourly]
Comment on lines +104 to +105
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check how Hourly/Retainer payment types are used across engagement modes

echo "=== Work Order references in STANDARD_TERMS.md ==="
rg -n -C3 'Work Order' STANDARD_TERMS.md | head -40

echo -e "\n=== Engagement Mode definitions ==="
rg -n -C5 'Engagement Mode' STANDARD_TERMS.md

echo -e "\n=== Payment Type references ==="
rg -n -C3 'Payment Type' STANDARD_TERMS.md SPECIAL_TERMS.md

Repository: holdex/contractor-terms

Length of output: 5354


Remove "Hourly" from the Work Order Payment Type options in SPECIAL_TERMS.md line 105.

Work Orders apply only to Project/Milestone engagements. Hourly billing applies exclusively to Retainer engagements, which don't use Work Orders. Keep Payment Type to: [Per-Project / Milestone-Based].

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@SPECIAL_TERMS.md` around lines 104 - 105, Edit SPECIAL_TERMS.md to remove the
"Hourly" option from the Work Order Payment Type line: change the line that
currently reads "Payment Type: [Per-Project / Milestone-Based / Hourly]" so it
only lists "Per-Project / Milestone-Based" (retain the surrounding brackets and
formatting), leaving the Agreement header ("Agreement: [Contractor Full Name] —
Special Terms v[X.Y.Z] / Standard Terms v[X.Y.Z]") unchanged.


**Scope:**
[Description of work to be delivered]
Expand Down Expand Up @@ -140,6 +141,25 @@ but unpaid amounts — remain valid and are not affected by this supersession.

---

## Prior Inventions Schedule

> This schedule is required by the Intellectual Property section of the Standard
> Terms. List all pre-existing intellectual property, tools, methodologies, and
> materials that the Contractor owns or has rights to and that may be incorporated
> into Work Product delivered under this Agreement. If there are no Prior
> Inventions to disclose, write "None" in the table below.
>
> This schedule cannot be amended after the Agreement is signed without the
> written consent of both Parties.

| # | Description of Prior Invention | Ownership / Licence Basis |
| - | ----------------------------------- | ------------------------- |
| 1 | <!-- PRIOR_INVENTION_1 or "None" --> | |

> Add rows as needed.

---

## Signatures

By signing below, both Parties confirm they have read, understood, and agreed to
Expand Down
Loading
Loading