Skip to content

feat: finalize cyclic topology support - #14

Merged
piotr-blue merged 49 commits into
nextfrom
feature/cyclic-topology
Aug 20, 2026
Merged

feat: finalize cyclic topology support#14
piotr-blue merged 49 commits into
nextfrom
feature/cyclic-topology

Conversation

@piotr-blue

Copy link
Copy Markdown
Contributor

Summary

Finalizes cyclic-topology support and prepares Blue Coordination 3.0.0-rc.3 for publication to Maven Central as a bounded external-pilot release candidate.

Highlights

  • completes the cyclic-topology acceptance and verification surface;
  • switches the build to published Maven Central dependencies only;
  • pins Language 3.1.0-rc.21, BEX 1.1.0-rc.4, and Repository 3.0.0-rc.21;
  • excludes Repository’s stale transitive Language rc.20 dependency;
  • removes obsolete local-composite and file-staged release paths;
  • updates RC preparation, staging, publication, and source-archive gates;
  • verifies Java 21 before canonical Java 17 staging and deployment;
  • normalizes all 490 tests to meaningful // given, // when, // then phases;
  • updates release, development, limitation, and migration documentation.

Verification

  • Java 17 clean stageRelease: passed
  • Java 21 clean releaseCheck: passed
  • Final verifyRcReadiness: passed
  • Published dependency preflight and isolation: passed
  • Publication POM and extracted source archive: passed
  • Unit, integration, consumer, and scenario suites: passed
  • Test architecture: 490/490 tests compliant
  • RC preparation tests: 5/5 passed
  • No conflicts, unmerged files, or whitespace errors

Release scope

This candidate is authorized for the bounded external-pilot tier.

It does not claim production readiness, stable-release readiness, durability, distributed execution, or a stable latency SLA.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 47475da0f9

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

if (selected == null) {
throw new IllegalArgumentException("No exact value at " + pointer);
}
return wrap(ExactValue.verified(selected));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve cyclic identity for root-pointer reads

When pointer is the valid root JSON Pointer ("") and this value is a cyclic member, copyNode() returns the local member body and ExactValue.verified(selected) recomputes that body's standalone hash. Consequently snapshot.valueAt("") does not equal snapshot.exact(), loses the authoritative MASTER#n BlueId, and reports cyclicMember() as false; preserve the original exact value for the root pointer instead of re-verifying its body.

Useful? React with 👍 / 👎.

Comment on lines +315 to +316
route.contains("timelineId=" + intent.timelineId())
&& route.contains("actorId=" + intent.actorId()));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Match route source identities exactly

When a rejected call uses a source ID that is a prefix of an accepted source—for example timeline team while the route contains timelineId=team-admin with the same actor—these substring checks report the source as accepted. The zero-attempt mapper then returns the fallback TARGET_NOT_SELECTED diagnostic instead of the promised precise TARGET_CHANNEL_SOURCE_MISMATCH; compare structured source fields or delimiter-bounded values rather than using contains.

Useful? React with 👍 / 👎.

Comment on lines +346 to +350
session.restoreCoordinationState(
resulting.terminated()
? SessionStatus.TERMINATED
: SessionStatus.READY,
frontier,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Catch up historical admissions before marking them ready

When a FULL_HISTORY or FROM_FRONTIER closure is admitted after the journal's global processedThrough cursor has already advanced beyond relevant retained entries, this publishes the epoch-zero state directly as READY without replaying those entries. Subsequent drains begin at that existing global cursor, so they cannot revisit the skipped history and the document silently exposes stale state despite the advertised import policy; admission must run a lane-local catch-up through the retained frontier before publishing application readiness.

Useful? React with 👍 / 👎.

Comment on lines +342 to +344
if (snapshot.status() != SessionStatus.READY) {
throw new IllegalStateException(
"DOCUMENT_NOT_READY: " + id);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Allow snapshots of terminated documents

When a Contracts process reaches TERMINATED, engine.document(id) still treats its durable final head as application-readable, but this additional SDK check rejects DocumentHandle.snapshot() as DOCUMENT_NOT_READY. The same handle can still return exact() and history(), leaving ordinary callers unable to obtain the otherwise valid final snapshot; accept TERMINATED alongside READY or consistently make termination unreadable at the engine boundary.

Useful? React with 👍 / 👎.

private ContractsClosureAdmissionReceipt admitCompiled(
Contracts10AuthoredClosureCompiler.CompiledClosure compiled,
Set<DocumentId> roots) {
engine.authorizeContractsPublicRoots(roots);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Roll back root authorization after failed admission

When Contracts returns NEEDS_RESOURCES or any complete non-publishing admission result, the root authorization performed here remains permanently installed even though the SDK immediately throws and no document was admitted. Reusing that still-absent DocumentId as an internal managed draft then fails because validateManagedDraftDeclarations sees it as a configured public Root, and later closure root matching can also be polluted; make authorization part of the successful admission transaction or remove it on every non-published outcome.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1aaeed36c5

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +115 to +116
ContractsRootFeederCoordinator.EventProgress progress =
feeder.process(entry);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Honor transition budgets between cohort commits

When one entry selects multiple disconnected cohorts and the remaining transition budget is smaller than their combined work, this single feeder.process(entry) call executes every selected cohort in ContractsRootFeederCoordinator.process before the budget is checked again. For example, DrainBudget(1, ...) can publish two independent one-document closures and report two committed transitions, even though these are separate PROCESS commits that can be paused between; pass the remaining transition allowance into cohort execution or stop after the permitted cohort instead of exceeding maxCommittedProcessTransitions.

Useful? React with 👍 / 👎.

@piotr-blue
piotr-blue merged commit e3a4800 into next Aug 20, 2026
4 checks passed
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