Implement the first runtime producer of the t2c.event-log/v1 contract from
ticket-045. One deterministic codec must parse, validate and render the closed
DSL, maintain its SHA-256 chain and publish logs.dsl.txt atomically beside
every pipeline manifest.json for succeeded, degraded and failed runs.
The producer records only runtime-owned pipeline facts. A later integration ticket will acquire GitHub ticket, commit, push, PR, review, merge and branch events and render a separate workflow-level stream. It must consume evidence; it must not append to an immutable completed pipeline log.
t2c.event-log/v1 field order, enums, bounds, event IDs, sequence and digest
chain and accepts the ticket-045 canonical fixture.logs.dsl.txt beside manifest.json; the manifest registers its
repository-relative path before the log hashes a canonical immutable
projection of the persisted manifest.ADVISORY_INFERENCE and can never produce approval evidence.src/pipeline/event-log.ts owns the closed codec, validation
and atomic writer; src/pipeline/event-log-persistence.ts adapts persisted
pipeline evidence without mixing acquisition into the codec.src/pipeline/run.ts registers and writes the stream after the
manifest for success/degradation and after the failed manifest for errors.test/pipeline-event-log.test.ts and
test/pipeline.test.ts.owner/repository. Without one, the producer
uses local/<sha256-derived-id> so it neither guesses an owner nor leaks the
absolute worktree path.files registry. This prevents
a later approved receipt registration from invalidating the completed log;
all status, failure, stage, configuration, runtime and LLM audit fields
remain covered by the evidence digest.The human owner explicitly approved ticket-046 on 2026-08-05. This authorizes
the five implementation files and architecture declared in intent.json;
protected publication still requires independent exact-head evidence.
make governance: passed with 0 errors and 0 warnings.make docker-smoke: passed using the repository image build.git diff --check: passed; codec and persistence modules are 414 and 190
lines respectively, below the repository GOD-file size threshold.runPipeline function at CC=65 and 372 lines. Its orchestration is now
split into bounded private stages with a measured maximum of CC=5 and 20
lines per function; the public signature and all pipeline outputs remain
unchanged.git diff --check pass again.1180e45e017c435839c4a3b526cca105a09c7b4f after the deterministic
complexity repair.openrouter/z-ai/glm-5.2. Its LLM requested changes, but the findings were
advisory and contradicted by the complete-file context, deterministic
chain validation and passing tamper tests; they were not used as authority.main@c1decdb817acb06603a3051bc3370649566e1367; the implementation branch
was deleted, leaving only main remotely.