interface_notice — version 1.2

Source: presets/interface-notice.satz

Purpose

Tells the projects that read this estate's interface when an exported value changes: one Pub/Sub message per apply that changes one.

The map asks how the projects hear of a change as a choice, question oneof interface_notice, with one option per delivery form; Pub/Sub is the one satz has, and this pack is it. A second form — a webhook, a push of the interface to a customer repository — is a second option and a pack of its own beside this one.

The estate's exports (export statements, interfaces/) are what the projects beside it read, in their own state and their own pipelines. This pack puts a notice behind them, in four pieces in the infrastructure project:

  1. a bucket that holds one object, interface.json — not the state bucket;
  2. a Pub/Sub topic;
  3. the grant that lets Cloud Storage's service agent publish to that topic;
  4. a storage notification: every new generation of an object in the bucket publishes one message to the topic.

The object is the estate's exported values as JSON (interface, estate, core, and interfaces with one map per interface), written from the root module's local.satz_interface, which satz emits beside the outputs. Terraform rewrites the object only when its content changes, so an apply that changes an exported value publishes one message and an apply that changes nothing publishes none. The message names the object; the object holds the new values.

A project subscribes in its own state — its own google_pubsub_subscription on the topic, a push to its CI's webhook or a pull from a runner. The topic and the object are core exports of this pack (interface_topic, interface_object), so every interface and its README carry them, with the subscription to write.

The service agent's address carries the project's number, which only exists once the project does, so the pack reads it with the provider's google_storage_project_service_account data source, in a trusted hcl block: satz writes no data source of its own. The notification names its topic through the grant, so it is created after the grant, and the object records the notification's id, so it is written after the notification and its first generation is published too.

NO CLAIM. No catalog control covers it.

Use it

params {
  interface_notice_pubsub = true

  // the pack's own defaults — copy only the lines you change
  interface_notice_project = infra_project_name
  interface_notice_bucket_name = "{customer_shortname}-infra-001-interface"
  interface_notice_topic_name = "{customer_shortname}-satz-interface"
  interface_notice_location = default_region
}

use "presets/interface-notice.satz" when interface_notice_pubsub

interface_notice_pubsub is the gate: while it is falsy the pack contributes nothing — no resources, no params, no claims. It is declared by estate_map, and the estate's own binding wins.

Needs from outside the pack:

Params

param default
interface_notice_project infra_project_name
interface_notice_bucket_name "{customer_shortname}-infra-001-interface"
interface_notice_topic_name "{customer_shortname}-satz-interface"
interface_notice_location default_region

Questions

What to ask before this pack is configured, and what changing the answer costs.

asks about prompt reversal blast recommends
interface_notice_project Which project holds the bucket and the topic the interface notice publishes through? recreate low —

interface_notice_project — Whoever may read the topic learns when the estate's exported values change and reads them from the object. The infrastructure project keeps it with the estate's other plumbing. Moving it later is a new topic, and every project's subscription has to be written again.

Contributes

resource type labels
google_pubsub_topic interface_notice
google_pubsub_topic_iam_member interface_notice_publisher
google_storage_bucket interface_notice
google_storage_bucket_object interface_notice
google_storage_notification interface_notice

Raw HCL: 1 hcl block(s) — trusted: "the storage service agent's address carries the project number, which the provider's data source reads". Opaque to the compliance plane.

Exports

Outputs of the root module and values of the interfaces under interfaces/ in every estate that uses this pack: a core export is carried by every interface, another one by its own interface and every interface that uses it. An interface a pack declares is common: every project's folder carries it.

interface output value description
core interface_topic "${google_pubsub_topic.interface_notice.id}" The topic that carries one message per apply that changes an exported value
core interface_object "gs://{interface_notice_bucket_name}/interface.json" The object that holds the exported values as JSON

Claims

None — this pack proves no control by itself.

History

version date change
1.2 2026-09-26 the header and the question's text say project where they said team, and interfaces/ where they said hcl/interfaces/; the resources are unchanged
1.1 2026-09-25 gated on interface_notice_pubsub, the Pub/Sub option of the map's choice interface_notice; the header says the choice is where a further delivery form joins. The resources are unchanged
1.0 2026-09-25 first version: tells the teams whose HCL reads the estate's interface when an exported value changes. A bucket, a Pub/Sub topic, the grant that lets Cloud Storage's service agent publish to it, and a storage notification in the infrastructure project; the object interface.json holds the exported values, rewritten only when one changes, so each apply that changes an export publishes one message. Exports interface_topic and interface_object

The whole library's history: the changelog in presets/CHANGELOG.md.

Notes

No notes yet.