oficina / suite Public

Revision 8: the contract module is built and cannot be imported

The memoria session tried to wire the module and could not. Verified twice,
independently:

    $ go get amadan.net/oficina/suite@latest
    go: unrecognized import path: no go-import meta tags
    $ curl -o /dev/null -w '%{http_code}' "https://amadan.net/oficina/suite?go-get=1"
    302   -> /auth/login

The hub answers ?go-get=1 with a redirect to a login page, so the Go
toolchain never sees a go-import tag. It is not a missing tag so much as an
authenticated repo page standing where the tag should be.

So §12 step 2 is built rather than done. The code, fixtures and harness are
on main and their tests pass, and nothing can depend on any of it. That
matters because ruling 7 is "every app imports the module, serves its server
half, and passes the conformance suite in CI" — and there are no consumers
available to it. Steps 3 and 4 both say "against the module".

This is the same failure shape as S6 two revisions ago, which is why it is
worth the number: an artefact that exists reads as a step that is finished.
S6 had a number and no builder; the module has code and no consumer.

Three ways out are recorded and all three are Paul's, because each is hub or
hosting rather than doctrine: serve go-import for repo paths without auth,
which is the only one that works in CI and fixes every app at once; document
GOPRIVATE with a credential CI can hold, if the tag can be served behind
auth; or move the module to a resolvable host, which contradicts ruling 10 in
hosting but not in structure.

Two workarounds are recorded as deliberately refused. A local replace
directive works on one machine, breaks CI, and makes a go.mod a
machine-local artefact. Vendoring is the second copy ruling 7 exists to
prevent and defeats "fixtures are the interface" the first time a fixture
changes. The memoria session declined both and recorded itself blocked,
which is the right answer and is why this was found rather than papered
over.

The README stops repeating the doctrine's status. It still said revision 4
and three review passes while the doctrine was at 7 — this repository's own
README having become the stale second copy of the document whose §2
diagnoses exactly that. It now points at the doctrine's status block and
carries only what is about the repository, which today is that the module
cannot be imported. Its "an app imports the module" also stopped being
written in the present tense, because it is not true yet.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul Campbell pushed by paul@keymail.dev 1ece92b895f2c88b614c2f3183ce7e63ae5059b3 parent 2b78680
2 files changed, +48 −12
  • README.md +16 −10
  • docs/superpowers/specs/2026-09-05-suite-sharing-doctrine.md +32 −2
diff --git a/README.md b/README.md
index 9082fdb..1141e05 100644
--- a/README.md
+++ b/README.md
@@ -27,8 +27,10 @@ owns the rule that binds the others.
An app spec cites the doctrine and lists the rulings it consumes. It never
restates one.
-In code, an app imports the module, mounts the three sibling routes on a
-handler, and runs the harness against that handler in CI:
+In code, an app *will* import the module, mount the three sibling routes on
+a handler, and run the harness against that handler in CI. **Not yet — see
+Status: the import path does not resolve, so the module has no consumers and
+cannot get one.** The shape it will take:
```go
func TestSuiteConformance(t *testing.T) {
@@ -60,12 +62,16 @@ layer.
## Status
-The doctrine is a design, revision 4. Three review passes have run
-against it, by two models, neither of which wrote the draft: Claude Opus 5
-on revision 1, then GPT-6 via Codex on revision 2, then GPT-6 and Fable
-independently on revision 3. The last two agreed closely and both asked
-for changes. All three reports sit beside the doctrine, unedited.
+**The doctrine is the status.** Read its own status block rather than this
+one — it is at `docs/superpowers/specs/2026-09-05-suite-sharing-doctrine.md`
+and it says which revision it is, who has reviewed it, and what is
+deliberately unanswered.
-Revision 4 fixes what those reviews found most seriously wrong and says,
-in its status block, what it has deliberately left for later. It has not
-itself been reviewed. §12 step 1 waits.
+This section used to repeat all of that and went stale within a day: it
+still said revision 4 and three review passes when the doctrine was at 7,
+which is precisely the drift §2 diagnoses and §10 exists to stop, committed
+by this repository's own README about its own document. So it stopped
+repeating it.
+
+What belongs here, because it is about the repository rather than the
+doctrine: **the contract module cannot currently be imported.**
diff --git a/docs/superpowers/specs/2026-09-05-suite-sharing-doctrine.md b/docs/superpowers/specs/2026-09-05-suite-sharing-doctrine.md
index ac34d76..47622e3 100644
--- a/docs/superpowers/specs/2026-09-05-suite-sharing-doctrine.md
+++ b/docs/superpowers/specs/2026-09-05-suite-sharing-doctrine.md
@@ -3,7 +3,14 @@
How the apps of the suite share identity, membership and content with
each other, and where the line is that nothing crosses.
-**Status:** design, **revision 7**, 2026-09-05.
+**Status:** design, **revision 8**, 2026-09-05.
+
+**Revision 8 records that the contract module cannot be imported**, which
+makes §12 step 2 built rather than done. `amadan.net/oficina/suite` does not
+resolve for the Go toolchain: the hub answers `?go-get=1` with a 302 to
+`/auth/login`, so `go get` never sees a `go-import` meta tag. Verified twice,
+independently. The module has zero consumers today and cannot get one, and
+§12 steps 3 and 4 both say "against the module".
**Revision 7 moves S6 to where it is actually needed and records why it has
the shape it has.** Revision 6 gave it a step before memoria slice 1, which
@@ -1164,7 +1171,30 @@ that cannot be written as stated is a spec bug.
code. **A.1 is now the largest of the four**, because ruling 12 gives
the home a table it did not have and amends home §7's sentence that
ownership is the instance's business.
-2. **The contract module**, types and fixtures only: S1, S2, S3, the
+2. **The contract module** — **built, and not importable.** The code, the
+ fixtures and the harness are on `main` and their tests pass. Nothing can
+ depend on them: `go get amadan.net/oficina/suite` fails because the hub
+ redirects `?go-get=1` to a login page, so the toolchain never sees a
+ `go-import` tag. Until that is fixed this step is done in the sense that
+ the artefact exists, and not done in the sense ruling 7 means: "every
+ app imports the module" has no consumers available to it.
+
+ **Three ways out, and the choice is Paul's**, because each is hub or
+ hosting rather than doctrine: the hub serves `go-import` for repo paths
+ without auth, which is the only one that works in CI and fixes every app
+ at once; a documented `GOPRIVATE=amadan.net/*` with credentials CI can
+ hold, if the hub can serve the tag behind auth; or the module moves to a
+ resolvable host, which contradicts ruling 10 in hosting but not in
+ structure.
+
+ **What is deliberately not being done**: a local `replace` directive,
+ which works on one machine and breaks CI while making a `go.mod` a
+ machine-local artefact, and vendoring, which is the second copy ruling 7
+ exists to prevent and defeats "fixtures are the interface" the first time
+ a fixture changes. The memoria session declined both and recorded itself
+ blocked, which is the right answer.
+
+ Types and fixtures only: S1, S2, S3, the
hostile-hostname fixture, gates 1 to 4. No server half yet. Docs moves
its module path.
3. **memoria slice 1 against the module**, with Sheets and Docs serving