個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Matches approved public AWS announcements to configured services and risk phrases, then sends review candidates to configured Slack destinations.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
AWS Public Change Alerting watches approved AWS RSS and Atom feeds for changes that may need review. It matches announcement text against your service catalog and risk rules, maps each result to configured environments, and sends a route-scoped candidate to Slack.
Matches are potentially relevant. The service uses public announcements and static environment profiles; operators confirm actual account or resource impact with their existing AWS tools.
Open the system diagram, walkthrough, and generated Slack message.檢視完整 README ↗AWS Public Change Alerting watches approved AWS RSS and Atom feeds for changes that may need review. It matches announcement text against your service catalog and risk rules, maps each result to configured environments, and sends a route-scoped candidate to Slack.
Matches are potentially relevant. The service uses public announcements and static environment profiles; operators confirm actual account or resource impact with their existing AWS tools.
Open the system diagram, walkthrough, and generated Slack message.
The application, Terraform roots, contracts, and test suite are implemented. The exact reviewed dev deployment passed its production-readiness gate for one environment, one Slack destination, four feeds, three services, four risk rules, and 300 deliveries per hour.
For that gate, the owner selected the current 4-feed, 3-service, 4-risk-rule policy unchanged.
That evidence applies only to the recorded dev deployment. Six of its 12 enabled service/risk pairs have no historical positive, Slack delivery has an explicit delivery_unknown state, and the recovery proof covers stopped restore and restart rather than live service on restored tables. Read the full assessment and its limits.
Dev runs only during supervised short windows and is parked between tests. L-59 must pass before unattended use.
| Milestone | State | Recorded result |
|---|---|---|
| D0 | Closed | First live public-feed candidate reached Slack and DynamoDB recorded posted. |
| M1 | Closed | Scheduled delivery, recovery, load, and alarm exercises completed in dev. |
| M2 | Closed | Retention, retirement, saved-response replay, and named recovery repairs completed. |
| M3 | Closed | The exact dev deployment passed its bounded production-readiness review. |
| M4 | Supervised proof passed | Fixed observation, early parking, and deadline cleanup after local waiter loss passed. |
| M5 | Closed | Offline maintenance tightened tracked agent-adapter guards, CLI help tests, package-manifest verification, and feed-claim parity and call-count coverage. |
The goal, readiness evidence, and September 8 live-window record carry the detailed results. GitHub Issues and milestones hold current backlog state.
Python 3.12 or newer is required.
git clone https://github.com/lilabrooks/aws-public-change-feed.git
cd aws-public-change-feed
python3.12 -m venv .venv
. .venv/bin/activate
make install
make check
make check runs formatting checks, Python and YAML lint, type checks, contract validation, corpus scoring, tests, and whitespace checks. It also validates Terraform and runs TFLint when those tools are installed. CI requires both tools and tests Terraform 1.10.0 as the minimum supported release.
| Command | Use |
|---|---|
make evaluate-corpus | Score the matcher against the labeled corpus and approved thresholds. |
make screen-feeds | Fetch the configured public feeds through the runtime acquisition path. |
make references-online | Check external links with Lychee. |
make terraform-clean | Remove generated .terraform directories from all four Terraform roots. |
make screen-feeds uses the public network. make references-online uses the network and requires Lychee. None of these commands deploy infrastructure or send a Slack message.
The corpus evaluator and feed screener accept --root and --config. Relative paths resolve from --root; absolute paths are accepted. The Make targets select config/dev.yaml.
Self-hosting is a reviewed AWS deployment, with automatic triggers kept off until the Slack preflight passes. It creates billable resources and stores internal environment metadata in AWS. The tracked deployment files describe this repository's dev environment, so a fork needs its own identifiers and evidence.
You need:
>= 1.10.0, < 2.0.0, TFLint, and an authenticated AWS CLI.Use examples/deployment.yaml as the field guide, then edit these tracked inputs:
infra/central/deployment.yaml: deployment ID, Region, configuration bucket, notification aliases, Slack routes, environment metadata, feed and Slack host allowlists, and scale limits.config/dev.yaml: feeds, services, aliases, profiles, environment policy, and risk rules. Every deployment environment needs one matching policy entry.infra/bootstrap/backend.tf and infra/central/backend.tf: literal state bucket and Region. Terraform backends can't read variables.The bootstrap buckets are derived as apcf-state-<deployment_id> and apcf-concurrency-<deployment_id>. Pick a short deployment ID that produces valid, globally unique names, or revise the naming rules and their tests. The configuration bucket must also be globally unique. Keep the deployment feed-host allowlist equal to the host set in the runtime configuration.
Environment account IDs and Regions are static review context. They grant no customer-account access.
Treat infra/live-control/ as an optional, deployment-specific root. It contains fixed account, Region, resource, and IAM values for the recorded dev environment and needs a reviewed port before another deployment can use it. The core bootstrap and central roots do not depend on it.
Run the full local gate after editing:
REQUIRE_TERRAFORM=1 REQUIRE_TFLINT=1 make check
The bootstrap root creates the bucket that later stores its own state. Follow the comment in infra/bootstrap/backend.tf: temporarily comment out its backend block, then run a local-state apply with your values.
terraform -chdir=infra/bootstrap init -input=false
terraform -chdir=infra/bootstrap plan -input=false -out=bootstrap.tfplan \
-var='deployment_id=<globally-unique-id>' \
-var='region=<aws-region>'
terraform -chdir=infra/bootstrap apply bootstrap.tfplan
terraform -chdir=infra/bootstrap output state_bucket_name
Restore the backend block with the new bucket and Region, update the central backend to match, then migrate bootstrap state:
terraform -chdir=infra/bootstrap init -migrate-state -input=false
Review the generated backend policy and grant it to the principal that will run Terraform. The architecture baseline defines the state and lockfile permissions.
The bootstrap root also creates the versioned ADR-019 concurrency-test bucket and an apcf_concurrency_test IAM user. It creates no access key. Both are part of the repository's real-S3 promotion test contract.
Keep private values in an untracked file outside the repository. Its operational_sns_subscription_endpoints keys must exactly match the aliases in deployment.yaml.
{
"operational_sns_subscription_endpoints": {
"primary-email": "[email protected]"
},
"delivery_triggers_enabled": false,
"reconciler_trigger_enabled": false
}
Initialize, review a saved plan, and apply those exact bytes:
terraform -chdir=infra/central init -input=false
terraform -chdir=infra/central plan -input=false \
-var-file=/absolute/private/path/central.tfvars.json \
-out=central-foundation.tfplan
terraform -chdir=infra/central apply central-foundation.tfplan
This first apply creates the configuration bucket, DynamoDB tables, queues, roles, notification topic, and Slack credential container. Lambda functions remain absent until exact package inputs are supplied. Confirm the SNS subscription before depending on alarm email.
Create an incoming webhook in Slack for the channel named by the route. Set that route's credential_secret_id in deployment.yaml before the central apply.
After Terraform creates the container, store the whole webhook URL as its value:
secrets_manager, add a value to the named secret with the AWS console or PutSecretValue.ssm_parameter_store, replace Terraform's placeholder with a SecureString value using the AWS console or PutParameter.Keep the webhook out of Git, Terraform variables, shell history, logs, and saved plans.
The deployment schema also supports bot_token. Set workspace_id and bot_token_secret_id, use channel_id on each route, and remove approved_webhook_hosts plus per-route credential_secret_id. Each destination_key must be the lowercase <workspace_id>-<channel_id> pair. Store the whole bot token in the deployment's selected secret store.
Build the package, then publish it under the central root's release-publisher role:
python3 scripts/build_lambda_package.py --output build/slack-worker.zip
python3 scripts/publish_lambda_artifact.py \
--bucket <config-bucket> \
--prefix <application-artifact-prefix> \
--package build/slack-worker.zip
Record the returned digest, S3 VersionId, and checksum. Set the worker, watcher, and dispatcher digest/VersionId pairs to that object, then set worker_artifact_checksum_sha256. Set the reconciler pair and reconciler_artifact_checksum_sha256 from the same publication. Re-plan and apply with both trigger flags still false.
Follow the operations runbook in this order:
status=completed makes the release usable.delivery_triggers_enabled=true. Enable reconciler_trigger_enabled only after completing its separate checks in the same runbook.Preserve each reviewed plan, digest, release ID, package version, preflight result, and trigger readback. The operations runbook owns rollback, recovery, delivery reconciliation, feed changes, and retirement procedures.
delivery_unknown.DynamoDB is the delivery system of record. It keeps candidates, outbox work, dedupe state, retries, and ambiguous outcomes after SQS's deduplication window ends. SQS carries ready work and preserves per-destination ordering. A known posted record suppresses another Slack call; an uncertain call stops at delivery_unknown until an operator checks Slack.
ADR-004 defines Slack outcomes. ADR-007 defines the outbox and queue boundary.
| Path | Contents |
|---|---|
src/aws_public_change_feed/ | Feed acquisition, matching, candidates, releases, delivery, and recovery. |
infra/ | Bootstrap, central service, isolated preflight, and deployment-specific live-control Terraform. |
config/ and corpus/ | Reviewed policy, labeled announcements, and matching thresholds. |
schemas/ and examples/ | Strict contracts and the canonical cross-file example bundle. |
scripts/ and tests/ | Validators, operator commands, regression tests, and service-mock tests. |
docs/ | Product goal, specification, ADRs, runbooks, evidence, and supporting assets. |
site/ | GitHub Pages source, diagrams, generated Slack sample, and walkthrough media. |
Changes to product scope, trust boundaries, identity, state ownership, delivery guarantees, or version policy require an ADR. Run make check before opening a pull request.
Copyright 2026 Lila Brooks.
Licensed under the Apache License 2.0. Redistributed copies and derivative works must preserve the attribution in NOTICE.
References verified: 2026-09-11.