Merge pull request 'Carry dejima's canonical statements: the disclaimer, and the push rule' (#8) from maturity-disclaimer into main

Reviewed-on: #8
Reviewed-by: branderson <brad@branderson.io>
This commit was merged in pull request #8.
This commit is contained in:
2026-08-10 21:05:05 -07:00
5 changed files with 60 additions and 0 deletions
+6
View File
@@ -29,6 +29,12 @@
Bounds what a compromised development VM can reach on your network, and tells
you what that bound actually is.
**Early development. Not ready to be depended on.** Nothing here has been
through outside review, an external audit, or adversarial testing by anyone but
the person who wrote it. Every security property this describes is a claim
awaiting scrutiny, not one that has survived it. Do not put this anywhere that
being wrong about it would matter.
**One maintainer, no support.** Nothing about this is promised: not a reply, not
a fix, not a release. [SECURITY.md](SECURITY.md) has the detail, and is where to
report a vulnerability rather than in a public issue.
+12
View File
@@ -17,6 +17,18 @@ behaviour because the rules live where the guest cannot read them.
[docs/threat-model.md](docs/threat-model.md) states what each layer grants, and
which stronger options were rejected and why.
## This is not proven software
These projects are in early development. Nothing in them has been through
outside review, an external audit, or adversarial testing by anyone other than
the people who wrote them. Where a design argument is stated it is one person's
reasoning; where a test asserts something it asserts what that person thought
to check.
Treat every security property described in any of these repositories as a claim
awaiting scrutiny rather than one that has survived it, and do not deploy them
where being wrong would matter.
## Reporting a vulnerability
Email **dejima@branderson.io**. Please do not open a public issue for a
+8
View File
@@ -100,6 +100,14 @@ with your personal key. The difference shows up exactly once, on the day the box
is owned: a scoped token is revoked and reissued, and a personal key is every
repository and every host that trusts it.
**Do not give a session push access to a forge it is not being used to push
to.** A session's forge is the one you chose; everywhere else is where its
dependencies and its reading live. dejima blocks GitHub push by default for
that reason and states the argument in full, including what an unsolicited pull
request costs the people receiving it, at [GitHub push: blocked by
default](https://gitbox.branderson.io/dejima/dejima/src/branch/main/docs/security.md#github-push-blocked-by-default-optional-opt-in).
It is not restated here, so that there is one copy of it to keep right.
**Do not forward your agent in.** `ssh -A` lends this VM your keys for the life
of the session, and this is a VM whose threat model says it may be owned. In
your SSH config, for this host:
+6
View File
@@ -1,5 +1,11 @@
# Threat model
**And none of it has been reviewed by anyone else.** This is early development:
the reasoning here is one person's, the tests assert what that person thought to
check, and no outside audit or adversarial testing has happened. Read what
follows as claims awaiting scrutiny rather than claims that have survived it.
See [SECURITY.md](../SECURITY.md).
What this defends, what it does not, and which options were rejected on
purpose. The last section matters most: it exists so a decision can be
overturned on new information rather than re-argued from nothing.
+28
View File
@@ -0,0 +1,28 @@
#!/usr/bin/env bats
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2026 Brad Anderson
#
# The maturity disclaimer, pinned in all three places a reader can land.
#
# A repository that argues at length for its own security properties is exactly
# the one that has to say those properties are unreviewed. It is also the line
# most likely to be quietly dropped as a project starts to feel established -
# not by decision, but by a rewrite of a section that happened to contain it.
#
# Nothing else here would notice. Every other test in this suite would still
# pass on a repository that had lost it.
setup() {
REPO="$(cd "$BATS_TEST_DIRNAME/.." && pwd)"
}
@test "every entry point says this is unreviewed early development" {
for f in README.md SECURITY.md docs/threat-model.md; do
grep -q 'reviewed by anyone else\|outside review' "$REPO/$f" || {
echo "$f does not say the work is unreviewed" >&2
false
}
done
grep -q 'Not ready to be depended on' "$REPO/README.md"
grep -q 'not proven software' "$REPO/SECURITY.md"
}