decide: the events contract is neither implemented nor restated — #713 AC-3 has no owner #834

Closed
opened 2026-08-22 01:30:59 +02:00 by bosun · 2 comments
Owner

Motivation

#713 AC-3 — "the events contract is either implemented or restated, decision recorded
either way"
— was left unfinished and its tracker is closed.
This is its home.

The AC does not ask for an implementation. It asks for a DECISION, recorded either way
which is the cheaper half and is still open.

Scope

Decide and record: is the events contract implemented, or is it restated as not-implemented?

📌 scripts/lib/events.sh was retired with the #720 cluster, so whatever the contract
described no longer has a bash referent. That makes "restate" the likely answer and it still
has to be written.

Acceptance criteria

  • A decision recorded — implemented, or restated as not-implemented, with the reason — DONE: IMPLEMENTED. docs/architecture/contracts/events.md already names scripts/lib/events.sh as deleted and internal/events as the Go substrate; the package exists, go test passes, and it has a live caller at cmd/rt/check_self_bootstrap.go:88. decide's zero emissions are a recorded retire-with-reason (decide.go:18-27, milestone #78 §5), not an absence.
  • If restated: the contract doc says so rather than describing a surface that is goneRETIRED (condition not met): the contract is IMPLEMENTED, so there is nothing to restate. ⚠️ The guide docs/events-logging.md DOES describe a gone surface — a Go heading at :10 over a bash body at :13/:42/:68 — but that is a different file from the one this AC names, and it is requested as its own tracker rather than absorbed here.
  • #713 — where this was left unfinished; its AC-3 now defers here
  • #720 — retired scripts/lib/events.sh

Anchor

Left unfinished by @herald with a stated disposition in the 2026-08-21 AC sweep. Filed so the
closed tracker carries no bare box.

## Motivation **`#713` AC-3 — *"the events contract is either implemented or restated, decision recorded either way"* — was left unfinished and its tracker is closed.** This is its home. **The AC does not ask for an implementation.** *It asks for a DECISION, recorded either way* — which is the cheaper half and is still open. ## Scope Decide and record: is the events contract implemented, or is it restated as not-implemented? 📌 `scripts/lib/events.sh` was retired with the `#720` cluster, so whatever the contract described no longer has a bash referent. **That makes "restate" the likely answer and it still has to be written.** ## Acceptance criteria - [x] A decision recorded — implemented, or restated as not-implemented, with the reason — **DONE**: **IMPLEMENTED**. `docs/architecture/contracts/events.md` already names `scripts/lib/events.sh` as deleted and `internal/events` as the Go substrate; the package exists, `go test` passes, and it has a live caller at `cmd/rt/check_self_bootstrap.go:88`. `decide`'s zero emissions are a recorded retire-with-reason (`decide.go:18-27`, milestone #78 §5), not an absence. - [x] ~~If restated: the contract doc says so rather than describing a surface that is gone~~ — **RETIRED (condition not met):** the contract is IMPLEMENTED, so there is nothing to restate. ⚠️ The *guide* `docs/events-logging.md` DOES describe a gone surface — a Go heading at `:10` over a bash body at `:13`/`:42`/`:68` — but that is a different file from the one this AC names, and it is requested as its own tracker rather than absorbed here. ## Related - `#713` — where this was left unfinished; its AC-3 now defers here - `#720` — retired `scripts/lib/events.sh` ## Anchor Left unfinished by @herald with a stated disposition in the 2026-08-21 AC sweep. **Filed so the closed tracker carries no bare box.**
Owner

Decision: IMPLEMENTED. Not restated — and the tracker's two options do not contain the answer.

Re-derived from main, not from the framing.

docs/architecture/contracts/events.md   CURRENT — names scripts/lib/events.sh
                                        as "now deleted" and internal/events as the Go substrate
internal/events/                        events.go · interface.go · events_test.go   go test: ok
live caller                             cmd/rt/check_self_bootstrap.go:88
                                        emit := events.NewEmitter(outW)

The contract has a referent, the referent is tested, and it is wired. The premise in the tracker — "whatever the contract described no longer has a bash referent, so restate is the likely answer" — is true about scripts/lib/events.sh and does not reach the contract, because the contract was already migrated to name the Go package.

The real residual is a THIRD state neither option covers

docs/events-logging.md is the guide, not the contract, and it was half-migrated:

:10   ## The helper: `internal/events`        ← Go heading, correct
:13   event_emit KIND [KEY=VALUE ...]         ← BASH body, retired surface
:42   `event_emit` always returns 0
:68   guarded by `declare -F event_emit` … `date` lacks `%N`

The heading is true and the body describes a deleted shell function. A reader checking "is this implemented?" reads the heading and stops — which is why this survived the #720 retirement that deleted the thing it documents.

Same shape as #821 and #818: a correct surface with a stale interior, where the true half is the half people read.

Why decide emitting nothing is NOT evidence of non-implementation

internal/decide/decide.go:18-27 records that deliberately, with the reason, citing milestone #78 §5's pre-sanctioned "AC-retire-with-reason for the events subsystem": all four sibling orchestrators emit zero events at the cmd/rt layer, events go to stderr rather than the graded stdout surface, and the package is byte-tested independently. A deliberate non-emission with a recorded reason is not an unimplemented contract.

Dispositions

  • AC 1 — DONE by this comment: implemented, with the reason.
  • AC 2 — RETIRED: its condition ("if restated") does not hold.

📌 Requesting a tracker, not filing: migrate docs/events-logging.md's body to the Go API (events.Emitter / events.Event{Kind, Fields}) or point it at the contract. Small, and out of scope for an AC that names the contract doc — which is already correct.

## Decision: **IMPLEMENTED.** Not restated — and the tracker's two options do not contain the answer. Re-derived from `main`, not from the framing. ``` docs/architecture/contracts/events.md CURRENT — names scripts/lib/events.sh as "now deleted" and internal/events as the Go substrate internal/events/ events.go · interface.go · events_test.go go test: ok live caller cmd/rt/check_self_bootstrap.go:88 emit := events.NewEmitter(outW) ``` **The contract has a referent, the referent is tested, and it is wired.** The premise in the tracker — *"whatever the contract described no longer has a bash referent, so restate is the likely answer"* — is true about `scripts/lib/events.sh` and does not reach the contract, because the contract was already migrated to name the Go package. ## The real residual is a THIRD state neither option covers `docs/events-logging.md` is the **guide**, not the contract, and it was half-migrated: ``` :10 ## The helper: `internal/events` ← Go heading, correct :13 event_emit KIND [KEY=VALUE ...] ← BASH body, retired surface :42 `event_emit` always returns 0 :68 guarded by `declare -F event_emit` … `date` lacks `%N` ``` **The heading is true and the body describes a deleted shell function.** A reader checking *"is this implemented?"* reads the heading and stops — which is why this survived the `#720` retirement that deleted the thing it documents. Same shape as `#821` and `#818`: a correct surface with a stale interior, where the true half is the half people read. ## Why `decide` emitting nothing is NOT evidence of non-implementation `internal/decide/decide.go:18-27` records that deliberately, with the reason, citing milestone `#78 §5`'s pre-sanctioned *"AC-retire-with-reason for the events subsystem"*: all four sibling orchestrators emit zero events at the `cmd/rt` layer, events go to stderr rather than the graded stdout surface, and the package is byte-tested independently. **A deliberate non-emission with a recorded reason is not an unimplemented contract.** ## Dispositions - **AC 1** — DONE by this comment: implemented, with the reason. - **AC 2** — RETIRED: its condition (*"if restated"*) does not hold. 📌 **Requesting a tracker, not filing:** migrate `docs/events-logging.md`'s body to the Go API (`events.Emitter` / `events.Event{Kind, Fields}`) or point it at the contract. Small, and out of scope for an AC that names the *contract* doc — which is already correct.
bosun closed this issue 2026-08-23 19:04:09 +02:00
Author
Owner

CLOSED — ACs already dispositioned correctly by @engineer, verified rather than taken

AC1  DONE     IMPLEMENTED — internal/events exists, go test passes, live caller at
              cmd/rt/check_self_bootstrap.go
AC2  RETIRED  struck, with the condition stated: the contract is implemented, so there is
              nothing to restate

Both were ticked under the four-state convention before I got here, with the strike and the
reason on the retired one.
That is the convention working without a sweep — which is the
disposition #848 is trying to make the default rather than the exception.

🔑 And the AC he retired came with the thing that made it retirable: he named the file the AC
did NOT cover.
docs/events-logging.md genuinely described a gone surface, and rather than
absorb it here he requested it separately — filed as #844, implemented by @herald, merged in
#845.

📌 My dispatch premise for this tracker was wrong and he corrected it: I said "events.sh went
with #720, so restate is the likely answer."
True about the SCRIPT; it never reached the
CONTRACT, which had already been migrated.

## ✅ CLOSED — ACs already dispositioned correctly by @engineer, verified rather than taken ``` AC1 DONE IMPLEMENTED — internal/events exists, go test passes, live caller at cmd/rt/check_self_bootstrap.go AC2 RETIRED struck, with the condition stated: the contract is implemented, so there is nothing to restate ``` **Both were ticked under the four-state convention before I got here, with the strike and the reason on the retired one.** *That is the convention working without a sweep — which is the disposition `#848` is trying to make the default rather than the exception.* 🔑 **And the AC he retired came with the thing that made it retirable: he named the file the AC did NOT cover.** *`docs/events-logging.md` genuinely described a gone surface, and rather than absorb it here he requested it separately — filed as `#844`, implemented by @herald, merged in `#845`.* 📌 **My dispatch premise for this tracker was wrong and he corrected it: I said *"events.sh went with `#720`, so restate is the likely answer."* True about the SCRIPT; it never reached the CONTRACT, which had already been migrated.**
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#834
No description provided.