Skip to content

Record where code under another licence may live - #187

Merged
iderex merged 1 commit into
mainfrom
records/code-under-another-licence
Aug 24, 2026
Merged

Record where code under another licence may live#187
iderex merged 1 commit into
mainfrom
records/code-under-another-licence

Conversation

@iderex

@iderex iderex commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Closes #180.

What this does

Entry two of #46 was answered on 2026-08-24: an experiment may bring in code
under a licence that is not this board's, only inside a quarantined directory
carrying its own licence file. Record 0000 says a decision that exists only in
an issue is not yet recorded, so this writes it down.

The answer fixed the shape and not the layout, so the record fixes the layout and
argues the placement rather than asserting it. The directory is
experiments/<slug>/borrowed/, its licence is
experiments/<slug>/borrowed/LICENSE, one per experiment, and it sits inside the
experiment rather than at the root.

Why inside the experiment. Record 0002 refuses a root directory it does not
name, and says so in its own words:

git grep -n 'does not name is refused' origin/main -- docs/decisions/0002-repository-layout.md

so a shared quarantine at the root is a change to that record rather than a
placement choice. The same record makes the layout inside a named directory
loose, and experiments/<slug>/ already holds one experiment and everything it
needs. A root quarantine would also separate borrowed code from the experiment
that borrowed it: deleting an abandoned experiment leaves its borrowed code
behind, and two experiments borrowing different versions of one thing collide in
a directory neither owns. Both are in section four.

What the quarantine buys. The boundary is in the layout rather than in
somebody's attention. A person promoting a result walks a directory tree, and a
directory named borrowed with a licence file in it is visible to a walk; a
declaration in a header is visible only to somebody who opened the header. The
failure the rule is written against lands on whoever promotes the result, which
is later, elsewhere, and after the person who knew has stopped thinking about it.

The declaration. Borrowed: in the experiment record header names the source
and the licence, and its absence means the experiment borrowed nothing. The
record says plainly that the format does not carry that field today, so adding it
is a change to the format that goes through
docs/decisions/0013-how-the-record-format-changes.md rather than a header
somebody writes and a reader discovers.

What this record does not claim

Nothing in this repository refuses a violation of this rule today, and the
record says so at the rule rather than in a footnote. No check reads borrowed/,
no check reads the field, and the field is not part of the format yet. What
stands behind the rule is this record, the contributing guide and whoever reads
the change. That sentence is what stops the rule being read as a gate, and it is
the state on the day this lands rather than a permanent one - entry two's answer
says the check is ordinary gate work, and the runner already walks experiments/
and already reads the header.

It also does not decide which licences may be borrowed from. Some are
incompatible with promotion into a GPL plugin board whatever directory the code
sits in, and this record fixes where borrowed code lives rather than which
licences are acceptable.

The gate

Run at this head, in the order CONTRIBUTING.md names:

go build ./cmd/... ./internal/...        (no output)
go vet ./cmd/... ./internal/...          (no output)
gofmt -l cmd internal                    (no output)
go test -count=1 ./cmd/... ./internal/...
ok  	github.com/Flowfin/lab/cmd/contexts	0.686s
ok  	github.com/Flowfin/lab/cmd/lab	13.004s
ok  	github.com/Flowfin/lab/cmd/notices	52.408s
ok  	github.com/Flowfin/lab/cmd/pullrequest	0.661s
ok  	github.com/Flowfin/lab/internal/check	0.877s
ok  	github.com/Flowfin/lab/internal/contexts	0.627s
ok  	github.com/Flowfin/lab/internal/hardware	0.652s
ok  	github.com/Flowfin/lab/internal/invariants	0.949s
ok  	github.com/Flowfin/lab/internal/notices	0.639s
ok  	github.com/Flowfin/lab/internal/prose	0.666s
ok  	github.com/Flowfin/lab/internal/pullrequest	0.682s

go run ./cmd/lab check .
examined .
1 experiment directory walked, 1 record read
21 decision records read
the time this run read is 2026-08-24T19:34:32Z
0 refused

This adds no code, so it adds no refusal site and owes no fixture. What holds it
is the record checks already running over this tree: the section rule that
refuses a record missing any of the four headings, and the numbering rule that
refuses two records under one number. The run above is those checks reading
twenty-one records where they read twenty before.

The integration-hardware harness was not asked for and produced nothing here.

The means

Markdown under docs/decisions/, because record 0000 fixes that decisions live
there one per file in that shape, and the checks that read a decision record
already read that directory. No language, runtime or dependency is added.

No second person has read this change. The gate output above stands in place of
one.

Entry two of the plan's decision issue was answered on 2026-08-24: an experiment
may bring in code under a licence that is not this board's, only inside a
quarantined directory carrying its own licence file. Record 0000 says a decision
that exists only in an issue is not yet recorded, and this writes it down.

The answer fixed the shape and not the layout, so this record fixes the layout
and says why that placement rather than another. The directory is
experiments/<slug>/borrowed/ with its licence at
experiments/<slug>/borrowed/LICENSE, one per experiment, inside the experiment
rather than at the root. Record 0002 refuses a root directory it does not name,
so a shared quarantine at the root would be a change to that record, and it
would also separate borrowed code from the experiment that borrowed it: deleting
an abandoned experiment would leave its borrowed code behind, and two
experiments borrowing different versions of one thing would collide in a
directory neither owns.

What the quarantine prevents is a footgun placed where attention is lowest. A
tree that reads as uniform and is not fails on whoever promotes the result,
which is later, elsewhere, and after the person who knew has stopped thinking
about it. A directory named borrowed with a licence file in it is visible to
somebody walking a tree; a line in a header is visible only to somebody who
opened the header.

The declaration is a Borrowed: field naming the source and the licence, and the
record says plainly that the format does not carry that field today, so adding
it is a change that goes through record 0013 rather than a header somebody
writes and a reader discovers.

NOTHING REFUSES A VIOLATION OF THIS TODAY and the record says so at the rule. No
check reads borrowed/, no check reads the field, and the field is not part of
the format yet. What stands behind it is this record, the guide and whoever
reads the change. Writing that down is what stops the rule being mistaken for a
gate.

The gate at this head: go build, go vet and gofmt are silent, every package
passes, and the runner reads 21 decision records over its own tree and refuses
nothing.

Refs #180

Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
@iderex iderex added documentation Improvements or additions to documentation planning labels Aug 24, 2026
@iderex iderex self-assigned this Aug 24, 2026
@iderex
iderex merged commit 032d11e into main Aug 24, 2026
25 checks passed
@iderex
iderex deleted the records/code-under-another-licence branch August 24, 2026 19:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation planning

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Record whether an experiment may bring in code under another licence

1 participant