Skip to content

B.6.10 — Janus event-broker refusal (no Kafka SaaS US) for event-driven-eu#43

Merged
Bogala merged 8 commits into
mainfrom
b6-10-janus-rule
Jul 12, 2026
Merged

B.6.10 — Janus event-broker refusal (no Kafka SaaS US) for event-driven-eu#43
Bogala merged 8 commits into
mainfrom
b6-10-janus-rule

Conversation

@Bogala

@Bogala Bogala commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Implements B.6.10 (docs/new-archetypes-plan.md §6.1) — the standard
interdiction "pas de Kafka SaaS US (Confluent Cloud), Redpanda acceptable
(EU deployable)"
— as scaffold-time Janus refusal rules for the
event-driven-eu archetype. The direct sibling of b7-9-janus-ai
(J.8.c), reusing that brick's machinery verbatim.

Two new rules in the J8-RULE-NNN catalogue (next free block after 006):

  • J8-RULE-007Confluent Cloud (US-managed Kafka SaaS) refused as
    the event broker regardless of tier (tier: any, never a valid default;
    mirrors J8-RULE-004/005).
  • J8-RULE-008 — at --eu-tier T3, any US-managed Kafka SaaS
    (Confluent Cloud / AWS MSK / Azure Event Hubs) refused (tier: T3; mirrors
    J8-RULE-006), forcing self-hosted NATS JetStream / Redpanda on EU infra.

Grounded in the archetype schema flag
event_specifics.eu_sovereignty.no_kafka_saas_us: true (whose comment names
B.6.10 as its enforcement) + acceptable: [nats-jetstream, redpanda]. The
rule is a forward-looking guard: NATS JetStream is the sovereign default
(never refused); Redpanda is the sanctioned Kafka-API-compatible alternative;
Confluent Cloud is forbidden.

What changed

  • Reuse, not re-create: appends two entries to the EXISTING
    dispatch-table.yml::forbidden_combinations: list and adds a call site to
    bin/forge-init-event-driven-eu.sh for the EXISTING
    _refuse_if_forbidden_combination helper (both shipped by b7-9-janus-ai).
    No new registry, no new/duplicated helper.
  • New ### Event-broker rules (event-driven-eu) H3 in
    cross-layer-orchestrator.md (inside the existing "Forbidden archetypes &
    combinations" H2).
  • Standards: janus-orchestration-rules.md +2 catalogue rows;
    compliance-tiers.md::forbidden: += confluent-cloud (1.1.0→1.2.0) so the
    generic I.3 T3-RULE-005 review-time linter catches it, with a matching
    constitution-linter.sh REMEDIATION hint; forbidden-components-rules.md
    event-broker coupling note (1.1.0→1.2.0). No new T3-RULE-NNN — the
    reserved T3-RULE-008 Persistence slot is untouched.
  • Sibling-harness coupling: relaxed b7-9.test.sh::_test_b7_9_005
    numbering guard (it hard-pinned 006 as the last rule) to permit the
    newly-allocated 007/008 while still catching a 009+ collision — the same
    discipline b7-9 applied to i2/i3. Prevents main CI going red on merge.
  • Docs: docs/ARCHETYPES.md rows + note; CHANGELOG.md [Unreleased] entry.
  • Change pipeline in .forge/changes/b6-10-janus-rule/ (archived); B.6.10
    block appended to .forge/specs/janus-rules.md.

Constitution: no amendment (ENFORCES existing EU-sovereign posture); additive
per "Extending the catalogue"; J8-RULE-007/008 never-reused (ADR-J8-004).

Test plan

New harness .forge/scripts/tests/b6-10.test.sh (12 tests: 9 L1 + 3 L2),
registered in forge-ci.yml. TDD RED→GREEN witnessed (11 fail → 12 pass).

  • b6-10.test.sh --level 1,212/12 (L1 anchors/registry/wrapper/std/token
    • numbering invariant; L2 exercises the reused helper: confluent-cloud@any ⇒
      exit 3 + J8-RULE-007, T3+us-managed-kafka ⇒ exit 3 + J8-RULE-008,
      T3+nats-jetstream ⇒ exit 0 no refusal).
  • End-to-end wrapper (FORGE_EDE_FORCE_SCAFFOLD=1): confluent-cloud and
    T3+us-managed-kafka both emit the structured [REFUSAL: …] and exit 3;
    fresh init still refuses as candidate ("not-yet-scaffoldable", not a
    J8-RULE); NATS default at T3 fires 0 refusals.
  • No regression: b7-9 15/15, j8 20/20, i2 14, i3 18, j7 21, k4 22,
    b6-1 19, b6-2 10, b7-pythia 19, foundations 22 (+ t4/i5/i6/k3/k5/b7-1/b7-2a).
  • verify.sh PASS (b6-10 change validates against schema, no open questions);
    constitution-linter.sh PASS 76/0; validate-standards-yaml.sh all STD-PASS.

Parallel-lane note

Shared files (CHANGELOG.md, forge-ci.yml, dispatch-table.yml,
cross-layer-orchestrator.md) are co-edited additively/disjointly with the
five sibling B.6 lanes — merge conflicts are expected and handled centrally.

🤖 Generated with Claude Code

Bogala and others added 8 commits July 10, 2026 13:34
Proposal/specs/design/tasks/open-questions + archived .forge.yaml for the
B.6.10 standard interdiction (docs/new-archetypes-plan.md §6.1): refuse a
US-managed Kafka SaaS (Confluent Cloud) as the event-driven-eu event broker,
NATS JetStream / Redpanda are the sanctioned EU-deployable brokers.

Namespace FR-B6-JR-*; direct sibling of b7-9-janus-ai (J.8.c). All three
open questions resolved (rule-ID allocation, tier-scoping, I.3 coupling).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… L2)

Mirrors b7-9.test.sh. L1 greps the new J8-RULE-007/008 anchors + H3
sub-section, the two forbidden_combinations entries, the wrapper call site,
the janus-orchestration-rules rows, and the confluent-cloud linter token.
L2 reuses the _mk_combo_fixture/_run_combo_helper pattern to exercise the
reused _refuse_if_forbidden_combination helper against the live registry:
confluent-cloud (any tier) => exit 3 + J8-RULE-007; T3 + us-managed-kafka
=> exit 3 + J8-RULE-008; T3 + nats-jetstream => exit 0 (sovereign default).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…t-driven-eu

Enforces the schema flag event_specifics.eu_sovereignty.no_kafka_saas_us:
- J8-RULE-007: Confluent Cloud (US-managed Kafka SaaS) refused as the event
  broker regardless of tier (tier: any, never a valid default).
- J8-RULE-008: at --eu-tier T3 any US-managed Kafka SaaS refused (tier: T3).

Two entries appended to the EXISTING dispatch-table.yml::forbidden_combinations
list; a new "Event-broker rules" H3 in cross-layer-orchestrator.md; the
event-driven-eu wrapper invokes the REUSED _refuse_if_forbidden_combination
helper (from b7-9-janus-ai) after the scaffoldability gate. No new registry
or helper. Sanctioned brokers: self-hosted NATS JetStream / Redpanda.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…nt-cloud)

- janus-orchestration-rules.md: +2 catalogue rows (J8-RULE-007/008), refusal
  semantics + full-rule-body prose updated (md-pattern, no semver frontmatter).
- compliance-tiers.md: forbidden: += confluent-cloud so the generic I.3
  T3-RULE-005 review-time linter catches it; SemVer 1.1.0 -> 1.2.0.
- constitution-linter.sh: REMEDIATION += confluent-cloud (NATS/Redpanda EU).
- forbidden-components-rules.md: event-broker coupling subsection; NO new
  T3-RULE-NNN (reserved T3-RULE-008 Persistence slot untouched); 1.1.0->1.2.0.
- REVIEW.md: KEEP-WITH-CHANGES entry for the two standard bumps.

Both sibling pins (i2/_test_i2_005, i3/_test_i3_008) already accept any valid
semver (relaxed by b7-9), so the bumps need no further harness change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ster CI

b7-9.test.sh::_test_b7_9_005 hard-pinned J8-RULE-006 as the last rule (its
upper-bound regex fired on any 007+). Allocating J8-RULE-007/008 legitimately
invalidates that bound, so it is relaxed to catch 009+ only (sibling-harness
coupling, the same discipline b7-9 applied to i2/i3). Without this, main CI
would go red on merge. Registers "b6-10.test.sh --level 1,2" in forge-ci.yml.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ARCHETYPES.md forbidden-combinations table += J8-RULE-007/008 rows, a new
"Event-broker refusals (event-driven-eu, B.6.10)" note, and the --eu-tier T3
row. CHANGELOG [Unreleased] Added entry for the B.6.10 sub-module.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…rules spec

APPENDS the B.6.10 ADDED-requirements block (FR-B6-JR-* / NFR-B6-JR-* /
ADR-B6-JR-*) to .forge/specs/janus-rules.md; the J.8.a/b/c/d blocks are
preserved unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… trim CI line budget

Final B.6 fan-out brick. Five sibling bricks merged first (#39, #42, #40,
#41, #44) and touched the same shared files. Conflicts in:
- .forge/standards/REVIEW.md (ledger entries at the same insertion
  point) — kept all three, reordered by actual landing order (b6-3,
  b6-9, then b6-10 last).
- .github/workflows/forge-ci.yml (harness registration insertion point)
  — merged into one consolidated b6-1..b6-10 block.
- CHANGELOG.md ([Unreleased] entries) — kept all five bullets in module
  order (B.6.4, B.6.5, B.6.6, B.6.9, B.6.10).

The merged forge-ci.yml landed at 382 lines (2 over the 380 budget,
t5-1.test.sh caught it) — condensed two harness-registration comment
blocks to free 4 lines, landing at 378/380.

Re-ran b6-10 (12/12), b7-9 (15/15), i3 (18/18), i2 (14/14), t5-1.test.sh
CI line-budget (17/17, 378/380 lines), verify.sh (551/0),
constitution-linter.sh (PASS 81/0) — all green post-merge.

This is the last of the 6 step-2 B.6 fan-out bricks (B.6.3/4/5/6/9/10).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Bogala Bogala merged commit e80d50a into main Jul 12, 2026
7 checks passed
@Bogala Bogala deleted the b6-10-janus-rule branch July 12, 2026 11:21
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