Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,11 @@ css/style.css.map
.DS_Store
assets/og/
bill-gate-report.md

# Scratch space for reproductions and workflow agents. Never committed.
.tmp-scratch/
.wf-scratch/

# Scratch space for reproductions. Never committed.
.tmp-scratch/
.wf-scratch/
29 changes: 23 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,14 +143,31 @@ fewer.

| | |
|---|---|
| [process/PROPOSING.md](process/PROPOSING.md) | How to write a bill. Start here. |
| [process/PROPOSING.md](process/PROPOSING.md) | How to propose a change. Start here — no terminal, no YAML, no GitHub account. |
| [process/AUTHORING-BY-HAND.md](process/AUTHORING-BY-HAND.md) | Writing the bill file directly. Same result, for anyone who prefers it. |
| [process/AMENDMENT-PROCESS.md](process/AMENDMENT-PROCESS.md) | Roles, lifecycle, thresholds, versioning. |
| [process/MINUTES-TEMPLATE.md](process/MINUTES-TEMPLATE.md) | What each body's record of resolution must contain. |
| [process/ADOPTION.md](process/ADOPTION.md) | What must be true before the in-browser bill builder goes live. |

The in-browser builder at `/propose/` is built but not yet published: it is an action surface, and
it opens when the ICC is ready to receive drafts. Authoring a bill by hand produces exactly the same
file — copy `bills/TEMPLATE.yaml` and run `npx opencodelaw bill validate`.
| [process/ADOPTION.md](process/ADOPTION.md) | What must be true before the two working surfaces go live. |

Two pages are built but **not yet published**, behind `PROPOSE_ENABLED`. They are action surfaces,
and they open together when the ICC is ready to receive.

- **`/propose/` — the document editor.** The proposer opens a copy of the constitution, changes the
words they want changed, and downloads their proposal. The operations are derived from the
difference: no target is picked, no id is typed, and the word YAML never appears. Re-opening a
proposal replays it onto *today's* constitution, so "based on the latest version" is not a rule
anyone follows — it is the only thing the page can produce.
- **`/icc/` — the clerking desk.** Numbering, the status transitions, the resolution sentence, the
three ballot sheets, each body's tally with the Article 16(3) verdict computing live, and a
browser-computed sha256 for each signed minutes PDF. It generates one record; it submits nothing
and **enacts nothing**.

Neither page uploads anything, and neither has authority the CLI does not re-check: `act enact`
recomputes the thresholds, re-reads every evidence file and re-verifies its checksum. A hand-forged
record fails at that gate exactly as it would if the pages did not exist.

Authoring a bill by hand produces exactly the same file — copy `bills/TEMPLATE.yaml` and run
`npx opencodelaw bill validate`.

## Honest limitations

Expand Down
19 changes: 18 additions & 1 deletion bills/TEMPLATE.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
# what your bill would change, before and after. Read that diff — it is what
# the approval meetings will read.
#
# Author's guide: process/PROPOSING.md
# Prefer not to write YAML? The propose page does all of this for you:
# https://constitution.stmorg.in/propose/
# Writing it by hand: process/AUTHORING-BY-HAND.md
# The rules this follows: process/AMENDMENT-PROCESS.md
# ---------------------------------------------------------------------------

Expand Down Expand Up @@ -75,6 +77,21 @@ operations:
text: |
The complete new text of Article 3, written out in full, exactly as it
should read once this Act is applied.
# If the provision has clauses, EVERY one must be ACCOUNTED FOR here —
# restated with its text, or carried as a tombstone with `status: omitted`.
# Leaving one out is refused: silence used to mean deletion, and a deleted
# clause takes its number and every citation to it with it. Nothing is ever
# deleted, at any depth. Changing only one clause? Target the clause
# instead: `target: art-3-s-2`, `scope: clause`.
# sections:
# - number: 1
# title: Admission
# text: |
# The complete text of clause (1).
# - number: 2
# title: Duties
# status: omitted
# note: Why clause (2) is being ended.

# A second example — delete to remove it.
# - id: op-2
Expand Down
174 changes: 174 additions & 0 deletions examples/starter/fixture-constitution-moved.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
# ---------------------------------------------------------------------------
# The FIXTURE constitution, MOVED ON to version 2.2.0.
#
# examples/starter/fixture-constitution.yaml, as it would stand after two
# other Acts had passed while a proposal sat waiting. Exactly two provisions
# differ, and each one exercises a different arm of the rebase:
#
# Article 1 untouched → a carried-over edit still applies cleanly
# Article 2 now reads as the proposer was going to ask for
# → their change has been enacted by someone else
# and is dropped
# Article 5 rewritten by a third party
# → their edit is parked and must be re-made against
# the words that are actually there
#
# The Guild does not exist. Nothing here is anyone's law.
# ---------------------------------------------------------------------------

opencodelaw: "1.0"

info:
title: MARROW VALE LAMPLIGHTERS
organization: The Marrow Vale Lamplighters' Guild, Incorporated
jurisdiction: Marrow Vale, Province of Thule
registration: GUILD/0042/1897

version: 2.2.0
status: current
legal_status: adopted
effective_from: 2026-05-01

contact:
name: The Keeper of the Roll
email: keeper@marrowvalelamplighters.org
url: https://marrowvalelamplighters.org
license: CC-BY-4.0

preamble:
id: preamble
title: Preamble
title_source: editorial
content: |
We, the lamplighters of Marrow Vale, having kept the lamps of this town
alight through fog and frost since the founding, adopt these articles for
the ordering of the Guild.
adopted: 2025-09-01

articles:
- id: art-1
number: 1
title: Name
title_source: enacted
content: |
The Guild shall be known as the Marrow Vale Lamplighters' Guild, and in
these articles as "the Guild".

# Untouched by the fixture bill, so a test has something to prove was left
# alone when the bill is applied.
- id: art-2
number: 2
title: Objects
title_source: enacted
content: |
The objects of the Guild are:

1. to keep every public lamp in Marrow Vale alight from dusk to dawn;
2. to maintain the ladders, wicks, oil and glass in the Guild's keeping;
3. to train apprentices in the safe handling of flame at height;
4. to keep the Vale's clocks wound.

# An article carrying both its own body and sections. The fixture bill
# substitutes this one in full, sections and all, which is what exercises
# the "complete resulting text" rule on a subdivided provision.
- id: art-3
number: 3
title: Membership
title_source: enacted
content: |
Membership of the Guild is open to any person of the Vale who keeps a
lamp and abides by these articles.
sections:
- id: art-3-s-1
number: 1
title: Admission
title_source: enacted
content: |
A person becomes a lamplighter on being entered in the Lantern Roll
by the Council.
- id: art-3-s-2
number: 2
title: Duties
title_source: enacted
content: |
A lamplighter shall light the lamps of their assigned round at dusk
and extinguish them at dawn.
- id: art-3-s-3
number: 3
title: Withdrawal
title_source: editorial
content: |
A lamplighter may withdraw by returning their taper to the Keeper of
the Roll.

# A number held by no provision. The gap is recorded, never closed by
# renumbering the articles that follow it.
- id: art-4
number: 4
title: Reserved
title_source: editorial
status: reserved
note: Held for the article on night wardens, which the Guild has not yet adopted.

- id: art-5
number: 5
title: The Council of Wicks
title_source: enacted
content: |
1. The Council of Wicks consists of eleven lamplighters elected by the
Guild at the Michaelmas meeting, of whom two shall be apprentices.
2. The Council appoints from among its number a Keeper of the Roll, a
Keeper of the Oil and a Keeper of the Ladders.

# Reserved by the fixture bill: the number is kept, the text goes.
- id: art-6
number: 6
title: Meetings of the Council
title_source: enacted
content: |
1. The Council meets at the Lamp House on the first evening of each
quarter.
2. Notice of a meeting is given by lighting the blue lamp above the Lamp
House door for three nights beforehand.

# Omitted by the fixture bill. The number is never reused.
- id: art-7
number: 7
title: The Taper Fund
title_source: enacted
content: |
The Taper Fund holds the pennies collected from members at admission and
is expended by the Keeper of the Oil on tapers and matches.

- id: art-8
number: 8
title: Records and Accounts
title_source: enacted
sections:
- id: art-8-s-1
number: 1
title: The Roll
title_source: editorial
content: |
The Keeper of the Roll enters in the Lantern Roll the name of every
lamplighter, the round assigned to them, and the date of their
admission.
- id: art-8-s-2
number: 2
title: Annual Statement
title_source: enacted
content: |
The Keeper of the Oil lays before the Guild at the Michaelmas
meeting a statement of the oil bought, burned and remaining.

- id: art-9
number: 9
title: Amendment
title_source: enacted
content: |
1. These articles may be amended only by an instrument passed under this
article.
2. An amendment must be approved by the board, the intermediate board and
the units of the Guild.
3. Approval requires two thirds of those present and voting in each of
those bodies, abstentions being counted with neither side.
Loading
Loading