Skip to content
Merged
36 changes: 36 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Validate Markdown

on:
pull_request:
branches:
- main
paths:
- "**.md"
types:
- opened
- synchronize
- reopened
- ready_for_review

jobs:
lint:
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

- name: Check links
uses: lycheeverse/lychee-action@v1
with:
args: >
--verbose
--no-progress
--exclude-mail
'**/*.md'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
78 changes: 78 additions & 0 deletions .rumdl.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# rumdl configuration for holdex/contractor-terms
# https://github.com/rvben/rumdl

# Inherit settings from another config file (relative to this file's directory)
# extends = "../base.rumdl.toml"

[global]
line-length = 120

# List of rules to disable (uncomment and modify as needed)
# disable = ["MD013", "MD033"]

# List of rules to enable exclusively (replaces defaults; only these rules will run)
# enable = ["MD001", "MD003", "MD004"]

# Additional rules to enable on top of defaults (additive, does not replace)
# Use this to activate opt-in rules like MD060, MD063, MD072, MD073, MD074
# extend-enable = ["MD060", "MD063"]

# Additional rules to disable on top of the disable list (additive)
# extend-disable = ["MD041"]

# List of file/directory patterns to include for linting (if provided, only these will be linted)
# include = [
# "docs/*.md",
# "src/**/*.md",
# "README.md"
# ]

# List of file/directory patterns to exclude from linting
exclude = [
# Common directories to exclude
".git",
".github",
"node_modules",
"vendor",
"dist",
"build",
# Specific files or patterns
"CHANGELOG.md",
"LICENSE.md",
]

# Respect .gitignore files when scanning directories (default: true)
respect-gitignore = true

# Markdown flavor/dialect (uncomment to enable)
# Options: standard (default), gfm, commonmark, mkdocs, mdx, quarto
# flavor = "mkdocs"

[MD013]
# Allow long lines in legal prose — don't wrap at 80 chars
line_length = 120
code_blocks = false
tables = false
headings = true
reflow = true # Enable automatic line wrapping (required for --fix)

[MD024]
# Allow duplicate headings — e.g. "Notice" appears in multiple sections
allow_different_nesting = true

[MD033]
# Allow inline HTML if ever needed
allowed_elements = []

# [MD003]
# style = "atx" # Heading style (atx, atx_closed, setext)

# [MD004]
# style = "asterisk" # Unordered list style (asterisk, plus, dash, consistent)

# [MD007]
# indent = 4 # Unordered list indentation

# [MD044]
# names = ["rumdl", "Markdown", "GitHub"] # Proper names that should be capitalized correctly
# code-blocks = false # Check code blocks for proper names (default: false, skips code blocks)
44 changes: 44 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Changelog

All notable changes to the Holdex Independent Contractor Standard Terms will be
documented here in plain English. Contractors are notified of updates by email
at least 14 days before changes take effect.

---

## v1.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
- Expenses and reimbursement
- Independent contractor status
- Communication channels and logging requirements
- Representations and warranties
- Confidential information, including return and deletion on termination
- 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
- 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
- Supersession clause — this Agreement immediately replaces all prior agreements
on signing, while preserving any accrued unpaid amounts from previous agreements

---

_Holdex Limited — [github.com/holdex/contractor-terms](https://github.com/holdex/contractor-terms)_
165 changes: 164 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,165 @@
# contractor-terms
Contractor Terms

This repository contains the Standard Terms and Special Terms template for
independent contractors working with Holdex Limited. It is published publicly
for transparency.

> **Issues and Discussions are disabled.** For questions, reach out through your existing Holdex contact.

---

## Repository Structure

```text
contractor-terms/
├── .github/
│ └── workflows/
│ └── lint.yml — markdown lint and link validation
├── .rumdl.toml — markdown lint configuration
├── README.md — this file
├── STANDARD_TERMS.md — the legal document (versioned by git tags)
├── SPECIAL_TERMS.md — blank template (filled in per contractor by HR; keep only the relevant compensation subsection)
└── CHANGELOG.md — plain English version history
```

---

## How This Works

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
automatically. Never edited retroactively.

**2. Special Terms** (`SPECIAL_TERMS.md`)
A blank template stored here. When preparing an agreement for a specific
contractor, HR copies and fills in the template, then stores the completed
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 Special Terms by the commit of their filled-in copy

---

## Workflow for Signing a Contractor Agreement

### 1. Prepare the Special Terms

Copy `SPECIAL_TERMS.md` to the private HR repository. 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.

### 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.

### 3. Confirm the version on record

Ensure the signed copy clearly references the Standard Terms tag in effect
at the date of signing. This is the version that governs that contractor's
relationship indefinitely unless updated per the process below.

---

## Workflow for Updating the Standard Terms

Follow these steps every time `STANDARD_TERMS.md` is changed.
**Never edit past releases.**

### 1. Create a branch

```bash
git checkout main
git pull
git checkout -b update/describe-your-change
```

### 2. Edit `STANDARD_TERMS.md`

Make your changes. Keep formatting consistent — the lint workflow will
flag issues automatically when you open a PR.

### 3. Update `CHANGELOG.md`

Add a new entry at the top describing what changed and why, in plain English.

### 4. Open a Pull Request

Push your branch and open a PR against `main`. A review and approval is
required before merging.

```bash
git add STANDARD_TERMS.md CHANGELOG.md
git commit -m "update: describe your change in plain English"
git push origin update/describe-your-change
```

### 5. Merge and tag a new release

Once approved and merged:

```bash
git checkout main
git pull
git tag v1.1 # increment the version number
git push origin v1.1
```

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.

### 6. Notify contractors

Send an email to all active contractors with:

- A summary of what changed
- 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]`

---

## 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 |

When in doubt, increment the minor version. Use a major version bump when
the change materially affects contractor obligations or Company rights —
these warrant extra care in contractor communication.

---

## Workflows

### `lint.yml`

Runs on every PR to `main` that touches a `.md` file. Two steps:

1. **rumdl** — enforces consistent markdown formatting per `.rumdl.toml`
2. **lychee** — validates all URLs and internal anchor links

A PR cannot be merged if either step fails.

---

## Ownership

This repository is owned and maintained by the HR team at Holdex Limited.
For questions or proposed changes, raise them internally through the HR team.

---

_Holdex Limited — [holdex.io](https://holdex.io)_
Loading
Loading