Skip to content

feat(publisher-services): implement BE-03 protected service configuration - #809

Merged
ja573 merged 5 commits into
developfrom
feature/publisher-services/be-03
Aug 13, 2026
Merged

feat(publisher-services): implement BE-03 protected service configuration#809
ja573 merged 5 commits into
developfrom
feature/publisher-services/be-03

Conversation

@ja573

@ja573 ja573 commented Aug 12, 2026

Copy link
Copy Markdown
Member

Task identity

Programme Publisher Services and Distribution Configuration
Task BE-03 — Protected service configuration
Risk HIGH
Approved specification docs/engineering/ai-delivery/tasks/BE-03.md, merged through specification PR #808
Exact authorized base 3b6b3a31f9358011f0c998015dfd0c2508380e83
Exact current head c678bdcec33c2aa01be1f887a85ff851dfe35891 (implementation 3facc3f9 + two docs-only CI-evidence commits + remediation c3206085 + docs-only alignment c678bdce)
Previous exact head 1315057983d389d1ef6b85bc4e69b81eda53aa79 — independently reviewed, decision BLOCKED
PR target develop
Implementing model Claude Opus 5, Extra High reasoning
Independent review of the current head NOT PERFORMED — required from a different agent/model at this exact head

develop was at exactly the authorized base at preflight and at push time; the
branch was created by the control agent at that SHA and was not recreated,
rebased, amended or force-pushed.

Review history

An independent HIGH-risk implementation review was performed on the previous
exact head 1315057983d389d1ef6b85bc4e69b81eda53aa79 and returned BLOCKED on
five findings:

# Severity Finding
1 P1 SDL guard coverage defect
2 P1 actor-check specification contradiction
3 P2 double publisher UPDATE / doubled trigger cascade
4 P2 DataLoader statement-count overclaim
5 P2 lifecycle call-site count arithmetic

Finding 2 was an authority conflict inside the approved specification itself —
its exact DDL CHECK (btrim(actor) <> '') contradicted its own acceptance-test
requirement to reject a whitespace-only actor — and only the CTO could resolve
it. The CTO resolved that conflict and authorized bounded corrections to all
five findings plus the generated-schema wording.
Remediation commit
c3206085 implements exactly that, appended as an ordinary commit with no
rebase, amend, squash or force-push. A second, documentation-only commit
c678bdce follows it, correcting two records that still described the
superseded two-UPDATE sequence; it changes no code, migration, schema,
GraphQL contract or test.

The amended specification text is a candidate in this pull request; it is
not yet reachable from develop, which remains at 3b6b3a31.

The current head has not been independently reviewed. The earlier review
applies only to 13150579. This head requires a fresh independent
HIGH-risk implementation review, and this PR claims no approval and no merge
authorization.

Full evidence: BE-03 implementation report.

Migration

thoth-api/migrations/20260813_v1.7.0/{up,down}.sql, created with the
repository-supported command under the explicitly authorized DATE override
make migration DATE=20260813, because 20260812 is already occupied by merged
BE-02. It produced exactly that one directory and nothing else; no existing
migration was appended to, renamed or rewritten.

It adds publisher.service_configuration_updated_at, the closed
publisher_service_configuration_source type and the append-only
publisher_service_configuration_history table with its primary key,
ON DELETE CASCADE foreign key, named non-whitespace actor check
CHECK (actor ~ '[^[:space:]]') and deterministic composite index. thoth-api/src/schema.rs is edited manually and atomically in
this same PR under ADR-0003 Architecture A.

Evidence: empty-database apply/revert/re-apply clean; populated 500-publisher /
2 000-work database migrated forward by the real runner with relfilenode
unchanged (no rewrite), packages unchanged, BE-02 assignments
byte-identical by md5 digest, zero audit rows and zero job tables;
observed locks and per-statement DDL timings recorded.

Actor constraint (corrected). The authoritative invariant is that an audit
actor must contain at least one non-whitespace character. The constraint is
CHECK (actor ~ '[^[:space:]]') under the unchanged name
publisher_service_configuration_history_actor_check, with the table, the
actor text NOT NULL column and the whole audit architecture unchanged and no
second constraint added. Verified against PostgreSQL 17.10 (CI uses
postgres:17) that POSIX [[:space:]] covers space, tab, newline, carriage
return, vertical tab and form feed. Re-applied on a fresh disposable database:
apply → revert → re-apply clean, and the catalog reports
CHECK ((actor ~ '[^[:space:]]'::text)). Real INSERTs against the live
constraint reject '', ' ', ' ', '\t', '\n', '\r', '\v',
'\f' and a mixed whitespace string, and accept ' real-actor-42 ' and
'\t\nreal-actor-42\r\n'. The superseded btrim predicate accepted
everything from the tab case downwards, which is the defect this closes.

Canonical write coordinator

One authoritative production write path,
replace_publisher_service_configuration, owns every committed write across
subscription_package, desired enabled platform state, the configuration token
and the audit table, in one transaction on one connection, under an explicit
caller-supplied source/actor write context. It makes no authorization
decision of its own. The GraphQL mutation is its only production caller.

Sequence: publisher row FOR UPDATE first → read under lock → stale
expectedUpdatedAt rejected before validation and every lifecycle call →
normalize (dedupe + linked closure) → validate the whole desired set →
package written directly (so no publisher_history row) → lifecycle applied
only through BE-02's connection-scoped primitives, enable_on called
unconditionally per desired group → token bumped and exactly one audit
row written iff something changed → commit.

BE-02 lifecycle composition

Additive, behaviour-preserving refactor: enable_on/disable_on take
&mut PgConnection, assume a caller-owned transaction, return a #[must_use]
Changed/Unchanged outcome, and check is_assignable() themselves before
any write
. The pool-level enable/disable keep their signatures, semantics,
ordering, error behaviour and early pre-connection non-assignable check, and now
delegate. There is still exactly one linked-platform algorithm in the
repository. BE-02's 40 existing lifecycle tests pass unchanged.

Protected GraphQL

PublisherServiceConfiguration (publisher, subscriptionPackage,
effectiveCapabilities, enabledDistributionPlatforms, updatedAt), the
owner-and-superuser publisherServiceConfiguration query, the superuser-only
publisherServiceConfigurations report and publisherServiceConfigurationCount,
and the superuser-only replacePublisherServiceConfiguration mutation. Exactly
one new error variant (StalePublisherServiceConfiguration) and one new
into_field_error arm (STALE_SERVICE_CONFIGURATION).

Authorization is least-privilege with no role inheritance: superuser, or
exactly PUBLISHER_USER for the target publisher. PUBLISHER_ADMIN,
WORK_LIFECYCLE and CDN_WRITE without PUBLISHER_USER are denied — alone and
combined. Anonymous is rejected before any publisher load; a NULL zitadel_id
fails closed for every non-superuser; a multi-publisher account reads its two and
not a third. Every matrix row is tested, each requesting effectiveCapabilities,
so capability exposure follows the same single decision.

Effective capabilities are exactly ThothPackage::capabilities() in that
slice's order, derived on read from the same locked row that reports the package,
persisted nowhere — no capability column, table, override, cache or second
mapping, and no capability input. OASIS returns []. Upgrade and downgrade
change them automatically; a platform-only change does not.

Audit

Exactly one row per committed change, with actor = PolicyContext::user_id()
and source = SUPERUSER_API for every row BE-03 writes; no BE-03 path emits
MIGRATION_BACKFILL. before_state/after_state carry exactly three keys —
subscriptionPackage, enabledDistributionPlatforms (canonical order),
configurationVersion — asserted by a test that fails if any key is ever added.
No activation identifier, per-row timestamp, capability list, credential or
publisher metadata. No audit JSON is exposed through GraphQL.

Concurrency

Two clients on one token → one winner, one STALE_SERVICE_CONFIGURATION that
writes nothing; the same with linked OAPEN/DOAB leaves no one-sided pair; a stale
true-no-op still fails; a stale repair still fails and the split pair
survives byte-identically; two concurrent repairs → one repair plus one stale;
different publishers do not contend; a replacement concurrent with a direct BE-02
transition serializes on the publisher row lock with no deadlock; the token
is strictly monotonic per publisher across a sequence containing a repair.

OAPEN/DOAB repair

Membership-equal split states are repaired, not skipped: split activation,
split enabled_at, and one-sided pairs named by either member — each bumps the
token and writes exactly one audit row whose states differ only in
configurationVersion. A fully normalized pair is a true no-op writing
nothing. JISC_NBK fails before any write, both when the request would otherwise
change nothing and when it would otherwise change the package. OCLC_KB and
EX_LIBRIS_KB stay independent. A direct enable_on(JISC_NBK) regression proves
the primitive fails before any write whether the caller's transaction is then
committed or rolled back.

Staff report and query efficiency

Superuser only, checked before any database access. Filters render in the merged
repository shape — publishers: [Uuid!] = [], packages: [ThothPackage!] = [],
enabledPlatforms: [DistributionPlatform!] = [] — with AND semantics for
enabledPlatforms and a mandatory publisher_id ASC tie-breaker.

Measured with the existing observed-loader harness. The accurate statement shape
is bounded, not constant: the merged ADR-0007 assignment loader has
MAX_BATCH_SIZE = 200, so a report page of N publishers issues

two set-based report statements plus ceil(page publisher count / MAX_BATCH_SIZE)
set-based assignment-loader dispatches; no per-publisher SQL loop.

Page size Publisher page Latest change Assignment statements Loader chunks
1 1 1 1 [1]
25 1 1 1 [25]
200 1 1 1 [200]
201 1 1 2 [200, 1]

The earlier claim that "the count does not grow with N" was wrong without the
batch-size qualification — it holds only while N ≤ MAX_BATCH_SIZE — so 201 is
asserted as a regression point. There is still no second loader: the
protected field reuses BE-02's existing request-local ADR-0007 loader,
loader-first, try_load only.

Trigger and write-amplification evidence

Because the token is a publisher column, every committed change also moves
publisher.updated_at and refreshes work.updated_at_with_relations across the
publisher's catalogue. All six cases were reproduced against a real disposable
database with two imprints, two target works and a control work of another
publisher:

Case token publisher.updated_at target works control work
package-only moves moves move unchanged
platform-only moves moves move unchanged
linked repair moves moves move unchanged
true no-op unmoved unmoved unmoved unchanged
stale unmoved unmoved unmoved unchanged
rollback unmoved unmoved unmoved unchanged

One publisher UPDATE per committed change (corrected). The reviewed head
wrote subscription_package at step 8 and the token at step 10, so a combined
change updated the publisher row twice and ran the shared AFTER UPDATE
work-freshness cascade twice over the same rows. Step 8 now compares only, and
step 10 issues a single conditional UPDATE carrying the package when it
changed and always the token:

Committed change Publisher UPDATEs Work-freshness cascades
package-only 1 1
platform-only 1 1
linked repair 1 1
combined package + platform 1 1
true no-op 0 0
stale 0 0

The committed write footprint is therefore one publisher row + bounded
configuration/audit rows + N related work rows
for every committed shape — no
longer 2N for a combined change. Optimistic concurrency, the
staleness-before-validation ordering, whole-set prevalidation, the monotonic
token expression and the one-audit-row-per-committed-change rule are unchanged,
and no shared trigger, package location or token architecture was altered.

Catalogue-scale measurement re-run after the fix (disposable environment
only; not a production SLA and deliberately not extrapolated
): 2 000 target
works, 23 SQL statements for the whole request (was 24), 1 publisher
UPDATE, 2 000 work rows changed by the trigger, 0 unrelated works changed,
39.55 ms (was 86.35 ms). No per-work application loop — the request
issues no statement against work at all. Stop-condition 19 reassessed from
the new evidence
as not triggered.

SDL and client

Exactly +72 / −0 lines: the three new object types, one input, one new enum,
three queries, one mutation, and ThothPackage / PublisherCapability becoming
reachable only through the protected type. No existing field, nullability,
default or description changed. thoth-client/assets/queries.graphql is
unchanged (reviewed conclusion: the internal export client consumes none of the
new surface). thoth-client/assets/schema.graphql is build-generated and
gitignored under existing repository authority, so it is regenerated, never
committed or hand-edited
; thoth-client/.gitignore was not modified and the
artifact was not force-added. The specification wording was corrected to match
those mechanics: regenerate through the normal build path, record the exact SDL
diff against the authorized base, record a reproducible artifact identity,
verify the client through the repository-supported workspace path, and record
the backend head for APP-01 pinning.

Regenerated after the complete remediation: base artifact SHA-256
0ba96aa1aa15006e8bf8b9f4a711f9e493eec4ce51911eebc32fb99d1ba53a67, head
artifact SHA-256
25329c1687d8b4222638c2f673bd2751a13adeda8c6f181d4ac83e869abac479, diff
unchanged at +72 / −0, and the head artifact is byte-identical to the
previous head
— independent confirmation that this remediation changed no
production GraphQL contract. The APP-01 pin is the head SHA
c678bdcec33c2aa01be1f887a85ff851dfe35891 plus that artifact SHA-256; the
c678bdce commit is documentation-only, so the artifact is unchanged from
c3206085.
thoth-app was not modified.

Authorized merged-test changes

Two merged SDL guards contained global exclusions that BE-03 intentionally
falsifies. Both were amended only to preserve their security intent, and both
are now stricter than the whole-document string searches they replace:

  • graphql::tests — the public Publisher type, NewPublisher and
    PatchPublisher expose no package, capability or configuration field; exactly
    one field in the schema returns PublisherCapability and it is
    PublisherServiceConfiguration.effectiveCapabilities; every ThothPackage
    reference is the enum declaration, the protected field, the superuser input or
    a superuser report argument;
  • distribution_platform_tests — no BE-02 type nor the public Publisher
    exposes package, capability or configuration state, and BE-02's four public read
    surfaces are asserted verbatim as unchanged.

Guard coverage defect, repaired. As reviewed, both guards extracted a type
body with .split_once('}'), which stops at the first closing brace after
the declaration. In the real generated SDL that is the brace closing the
imprints field's nested default
order: ImprintOrderBy = {direction: "ASC", field: "IMPRINT_NAME"}, so
everything declared after imprintscontacts and distributionPlatforms
was never inspected, and a protected field added there would have passed both
guards silently.

Extraction now lives in one test-only module,
thoth-api/src/graphql/sdl_support.rs, and is brace-balanced and
string-aware
. String awareness is required rather than defensive: the real SDL
contains braces inside descriptions (\d{4,9} in doi), escaped quotes
(Timestamp) and """ block strings inside a type body
(Imprint.crossmarkDoi).

Extraction Publisher block has contacts( has distributionPlatforms: catches tampered field
old split_once('}') 1203 chars no no no
new brace-balanced 1733 chars yes yes yes

The tampered case inserts subscriptionPackage: ThothPackage! after
imprints and asserts the guard fails, which is the regression the old
extraction could not catch. Both guards additionally assert the two
post-imprints sentinels as a coverage precondition, and every
.split_once('}') extraction in distribution_platform_tests was replaced. The
real regenerated Publisher type contains none of subscriptionPackage,
effectiveCapabilities, any capability field, serviceConfiguration* or
serviceConfigurationUpdatedAt. The guards were strengthened, never weakened
or deleted
, and BE-02's four verbatim read surfaces are untouched.

No other merged test's behavioural expectation was changed.

Checks

git diff --check, cargo fmt --all -- --check, cargo check --workspace and
cargo clippy --all --all-targets --all-features -- -D warnings all clean at the
remediation head. cargo test --workspace: 1252 passed, 0 failed (BE-03 adds
80 tests; the remediation adds 8 and strengthens 2 existing ones without
weakening any). cargo run migrate / --revert exercised against disposable
databases only — no environment or production database was contacted.

Write-path containment, re-run at this exact head. The pool-level
PublisherDistributionPlatform::(enable|disable)( search returns 61 hits —
model/publisher_distribution_platform/tests.rs 45,
graphql/distribution_platform_tests.rs 14,
model/publisher_service_configuration/tests.rs 2 — every one in a test file,
with per-file counts derived mechanically rather than by hand. The reviewed
head's report said 66 (and 50 for the first file); both numbers were wrong and
are corrected. Zero production callers bypass the canonical coordinator,
which is the invariant that matters and is unchanged.

GitHub CI results for this exact head are recorded in the PR checks below.

Boundaries

Repository history only. No merge, deployment, environment migration,
production migration, production access, MIG-01, backfill, assignment creation,
distribution activation, dissemination, BE-04, APP-01, APP-02, thoth-app
change, shared publisher-trigger change, OBSERVE/ENFORCE change, workflow
change or workflow dispatch. PR #799 untouched. Merge would authorize repository
integration only.

Do not merge: fresh independent exact-head review and explicit CTO merge
authorization are outstanding.

ja573 added 5 commits August 12, 2026 22:55
…tion

Implement the approved bounded BE-03 specification as an inactive additive
foundation, from the authorized base 3b6b3a3.

Database (migration 20260813_v1.7.0, with schema.rs edited manually and
atomically under ADR-0003 Architecture A):

- publisher.service_configuration_updated_at, the canonical optimistic
  concurrency token, strictly increasing per publisher;
- the closed publisher_service_configuration_source type (SUPERUSER_API,
  MIGRATION_BACKFILL) with no OTHER, UNKNOWN or Default;
- the append-only publisher_service_configuration_history audit table with a
  named non-blank actor check, an ON DELETE CASCADE foreign key and a
  deterministic composite index.

Exactly one authoritative production write path owns every committed write of
package, enabled-platform desired state, configuration token and audit history
in one transaction on one connection, under an explicit caller-supplied
source/actor context: publisher row lock first, stale expectedUpdatedAt rejected
before any validation or lifecycle call, whole normalized desired set validated
before the first write, subscription_package written directly so no
publisher_history row is produced, platform state applied only through BE-02's
lifecycle primitives, and exactly one audit row per committed change carrying
bounded three-key canonical before/after state.

BE-02's lifecycle is refactored additively into connection-scoped enable_on and
disable_on primitives that return a must_use Changed/Unchanged outcome and check
is_assignable() themselves before any write. The pool-level enable/disable keep
their signatures, semantics, early non-assignable check and merged tests, and
there is still exactly one linked-platform algorithm, so a membership-equal but
split OAPEN/DOAB pair is repaired rather than skipped.

GraphQL adds the protected PublisherServiceConfiguration type with effective
capabilities derived on read from the canonical package and persisted nowhere,
the owner-and-superuser publisherServiceConfiguration query under a
least-privilege per-publisher check with no role inheritance, the superuser-only
publisherServiceConfigurations report and publisherServiceConfigurationCount,
and the superuser-only replacePublisherServiceConfiguration mutation. Exactly one
new error variant and one new into_field_error arm are added. ThothPackage and
PublisherCapability become SDL-reachable only through the protected type.

Accepted and measured consequence: because the token is a publisher column,
every committed change also moves publisher.updated_at and refreshes
work.updated_at_with_relations across that publisher's catalogue through the
existing trigger's single set-based statement; a no-op, a stale request and a
rollback move none of the three, and other publishers are never touched.

Inactive foundation only: the migration creates zero audit rows and changes no
package or assignment; no job, dissemination or activation exists; no
environment or production migration was executed.
Normal pull_request-triggered CI on the draft implementation PR completed with
all ten checks passing, including run_migrations against CI's own PostgreSQL
service. Record the per-check results in the implementation report's CI section
in place of the PENDING placeholder. No workflow file was changed and no
workflow was dispatched.
The recorded per-check durations are from the run on the implementation commit;
every push to the branch re-runs the same ten checks and the live per-head
result is the pull request's own check record under ADR-0005.
The independent HIGH-risk implementation review of exact head 1315057
returned BLOCKED on five findings. The CTO resolved the single blocking
authority conflict and authorized bounded corrections to all five plus the
generated-schema wording. This commit implements exactly that.

P1 SDL guard coverage. The shared `sdl_block()` used `.split_once('}')`,
which stopped at the first closing brace after the declaration. In the real
generated SDL that is the brace closing `imprints`' nested
`order: ImprintOrderBy = {...}` default, so every field after `imprints` was
never inspected and a protected field added there passed both guards. A new
test-only `graphql::sdl_support` provides one brace-balanced, string-aware
extractor: string awareness is required because the real SDL contains braces
inside descriptions, escaped quotes and `"""` block strings inside a type
body. Measured on the real SDL, the old extraction covered 1203 characters
and missed `contacts` and `distributionPlatforms`; the new one covers 1733
and catches a `subscriptionPackage` field inserted after `imprints`. Both
guards now use it and assert those two post-`imprints` sentinels as a
coverage precondition. Guards are strengthened, never weakened; BE-02's four
verbatim read surfaces are unchanged.

P1 actor-check contradiction. The specification's exact DDL
`CHECK (btrim(actor) <> '')` contradicted its own acceptance wording, since
one-argument `btrim` trims spaces only and so accepted a tab-only or
newline-only actor. Per the CTO decision the authoritative invariant is that
an audit actor must contain at least one non-whitespace character. The
specification and the unmerged migration now express that one invariant as
`CHECK (actor ~ '[^[:space:]]')`, verified against PostgreSQL 17.10 to cover
space, tab, newline, carriage return, vertical tab and form feed. Same table,
same column, same constraint name, same audit architecture; only the
predicate is strengthened, and no second constraint is added.

P2 doubled publisher UPDATE. Step 8 wrote `subscription_package` and step 10
wrote the token, so a combined change updated the publisher row twice and ran
the shared AFTER UPDATE work-freshness cascade twice over the same rows. Step
8 now compares only, and step 10 issues one conditional UPDATE carrying the
package when it changed and always the token. Every committed change shape
now costs exactly one publisher UPDATE and one cascade; a true no-op or stale
request costs zero. Re-measured at 2000 works: 23 statements (was 24), one
publisher UPDATE, 2000 target rows refreshed, 0 unrelated, 39.55 ms (was
86.35 ms). Stop condition 19 reassessed from the new evidence: NOT TRIGGERED.

P2 DataLoader statement count. The report claimed the count does not grow
with N. The merged ADR-0007 loader has MAX_BATCH_SIZE = 200, so the accurate
shape is two set-based report statements plus ceil(N / MAX_BATCH_SIZE)
set-based assignment dispatches, with no per-publisher loop. A 201-publisher
regression asserts chunks [200, 1] and two dispatches. No second loader.

P2 call-site arithmetic. Re-run at this head: the pool-level enable/disable
search returns 61 hits, not 66, with per-file counts derived mechanically
(45/14/2) rather than by hand. All are in test files; zero production callers
bypass the coordinator, which is the invariant that matters and is unchanged.

Generated-schema wording. `thoth-client/assets/schema.graphql` is
build-generated and ignored under existing repository authority, so the
specification's "commit the regenerated schema" was unsatisfiable. It now
requires regeneration through the normal build path, the exact SDL diff, a
reproducible artifact identity, workspace-path client verification and the
backend head for APP-01 pinning. `.gitignore` is untouched and the artifact is
not force-added. Regenerated after the full remediation: 72 added / 0 removed
against the authorized base and byte-identical to the previous head, so no
production GraphQL contract changed.

The amended specification is a candidate in this PR and is not yet reachable
from develop. The new exact head has not been independently reviewed and
requires a fresh HIGH-risk review.
…er UPDATE

Two records still described the superseded two-UPDATE sequence after the
remediation commit changed it:

- implementation report section 5 item 5 still presented "two publisher UPDATE
  statements on a package change" as an accepted measured consequence, and
  cross-referenced step 8 as the package writer;
- specification section 18 still attributed the no-publisher_history-row test to
  step 8.

Both now describe the corrected sequence: step 8 compares only, step 10 issues
the single conditional UPDATE. Section 18 additionally requires the per-shape
write-footprint tests the remediation added, so the acceptance criteria state
the one-UPDATE property rather than leaving it implied by the transaction
sequence alone.

Documentation only. No code, migration, schema, GraphQL contract or test change.

ja573 commented Aug 13, 2026

Copy link
Copy Markdown
Member Author

Control record — BE-03 HIGH-risk merge authorization (2026-08-13)

Exact implementation head: c678bdcec33c2aa01be1f887a85ff851dfe35891
Base: develop at 3b6b3a31f9358011f0c998015dfd0c2508380e83

Fresh independent HIGH-risk implementation review of this exact head returned APPROVED with no findings. The reviewer declared independence from both implementation/remediation and the prior reviewer that returned BLOCKED on 1315057983d389d1ef6b85bc4e69b81eda53aa79, and independently re-derived the load-bearing repository, database, migration, GraphQL, authorization, concurrency, DataLoader, trigger/catalogue-scale, generated-SDL and scope evidence.

CTO authorization supplied in the control conversation explicitly approves the BE-03 implementation and the bounded CTO-authorized BE-03 specification corrections on this exact head and authorizes merge of PR #809 into develop only if the head remains exactly c678bdcec33c2aa01be1f887a85ff851dfe35891, develop has no material drift, and required exact-head CI remains successful.

Immediately before this control record, GitHub was re-checked: PR #809 is OPEN/DRAFT/UNMERGED and mergeable at the exact head above; develop remains 3b6b3a31f9358011f0c998015dfd0c2508380e83; the exact-head build-test-and-check, run-migrations, check-changelog, and publish-to-dockerhub pull-request workflows are all completed/successful.

Authorization boundary: repository integration only. This does not authorize deployment, environment or production migration execution, production access, MIG-01, backfill, assignment creation, distribution activation, dissemination, BE-04, APP-01, APP-02, OBSERVE/ENFORCE changes, workflow changes or manual workflow dispatch, or action on PR #799.

@ja573
ja573 marked this pull request as ready for review August 13, 2026 12:31
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@ja573
ja573 merged commit 3ba4452 into develop Aug 13, 2026
10 checks passed

ja573 commented Aug 13, 2026

Copy link
Copy Markdown
Member Author

Control record — BE-03 HIGH-risk merge authorization and independent review

Exact implementation head: c678bdcec33c2aa01be1f887a85ff851dfe35891

Fresh independent exact-head implementation review: APPROVED — findings NONE. Reviewer declared independence from both the implementing/remediation agent and the prior reviewer that returned BLOCKED on 1315057983d389d1ef6b85bc4e69b81eda53aa79.

CTO authorization supplied in the control conversation on 2026-08-13 explicitly approved the BE-03 implementation and bounded CTO-authorized BE-03 specification corrections at that exact head and authorized merge into develop, subject to no head drift, no material develop drift, and successful exact-head required CI.

Pre-merge controls were satisfied: PR head remained c678bdcec33c2aa01be1f887a85ff851dfe35891; develop remained 3b6b3a31f9358011f0c998015dfd0c2508380e83; exact-head pull-request CI was successful. Normal merge produced 3ba4452c316399d80cd8d85e7d5e1bd05e252664, whose parents are exactly the former develop head and the authorized implementation head.

Authorization boundary remains unchanged: repository integration only. No deployment, environment or production migration execution, production access, MIG-01, backfill, assignment creation, distribution activation, dissemination, BE-04, APP-01, APP-02, OBSERVE/ENFORCE changes, workflow changes/manual workflow dispatch, or action on PR #799 is authorized by this merge.

ja573 added a commit that referenced this pull request Aug 14, 2026
Bounded review remediation for BE-03-CLOSEOUT-01. Additive only; the
existing commit is untouched.

Finding 1 - correct the ADR-0005 evidence claim. The CHANGELOG entry and
implementation report sections 5 and 15 asserted absolutely that no merge
commit SHA is transcribed into repository files, which the same change
contradicts by legitimately recording b51bcc0 as the exact CTO-authorized
implementation base, its identity as PR #812's merge commit, and PR #809's
merge commit as ancestry evidence. The wording now distinguishes prohibited
terminal-lifecycle transcription - copying GitHub lifecycle metadata merely
to restate terminal review, authorization or merge state - from exact SHAs
recorded as authorized base or preflight/ancestry evidence, which
repository controls require as execution evidence. No exact-base or
preflight evidence is removed and BE-03-CLOSEOUT-01.md section 18 is
unchanged.

Finding 2 - record the actual link-check command. Report section 9 carried
a prose description rather than an executable command. It now records the
exact reproducible command and its fresh result: 97 relative links checked,
0 broken, re-run after every repository-file edit including these.

Also clarifies report section 5.1: the two items are the additional BE-03
source-state hits found by the fresh classified search, distinct from the
closeout task record's own Status and section 18 updates that the
implementation authorization separately requires.

No classification, runtime, schema, migration, workflow or downstream
semantics changed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant