Skip to content

Publish the status dashboard on staging only; point public status at status.internetcomputer.org - #194

Merged
aterga merged 2 commits into
mainfrom
claude/connector-marketplace-publish-p4el4n
Sep 22, 2026
Merged

aterga merged 2 commits into
mainfrom
claude/connector-marketplace-publish-p4el4n

Conversation

@aterga

@aterga aterga commented Sep 22, 2026

Copy link
Copy Markdown
Collaborator

Summary

The public status surface for ICP MCP is the ICP MCP component on https://status.internetcomputer.org/, driven by the deployment's status dashboard (monitoring/mcp-status) through its Statuspage pusher. The dashboard itself is not meant to be reachable on the production origin: its edge already answers /status/ with a redirect, and the Caddyfile block that published it there was dead weight that would come back on the next rollout.

This gates that block on SERVE_STATUS, passed by deploy-native.yml for the staging environment only — the same mechanism MCP_SERVE_BETA already uses. deploy.sh renders the Caddyfile keeping the block (minus its marker lines) on staging and deleting it on production.

Deliberately unchanged: imcp-status.service is still installed and started on every host. The Statuspage pusher runs inside it, and the repository cannot tell which host holds /etc/imcp-status/statuspage.env, so removing the service anywhere risks silencing the public component. Only the dashboard's exposure at /status/ becomes staging-only. Once the operators confirm which host carries the credentials, the other host's dashboard instance can be pruned as a follow-up.

Also re-points the two remaining public references to the retired origin URL: the health workflow's Slack alert link, and the Anthropic submission doc's status/health row (which had flagged the origin's /status/ as cut off — it now cites the Statuspage as the one public surface).

Related issues

Companion to dfinity/internetcomputer-org's removal of the copied dashboard under /icp-mcp/status/. Follows #165 (landing pages moved to internetcomputer.org/icp-mcp) and #188 (dashboard stopped grading /version).

Changes

  • deploy/native/Caddyfile: the /status redir + handle_path /status/* block is wrapped in __STATUS_BEGIN__ / __STATUS_END__ marker comments; comment explains the staging-only exposure.
  • deploy/native/deploy.sh: renders the Caddyfile keeping the marked block (markers stripped) when SERVE_STATUS is set, deleting the whole block otherwise.
  • .github/workflows/deploy-native.yml: passes SERVE_STATUS: ${{ inputs.environment == 'staging' && '1' || '' }} alongside MCP_SERVE_BETA.
  • deploy/native/README.md: documents the staging-only publication and the public Statuspage in the three places that described /status/.
  • .github/workflows/health.yml: Slack alert "Status page" link → https://status.internetcomputer.org/.
  • docs/anthropic-directory-submission.md: status/health row → the Statuspage component; drops the "cut off" warning.

Testing

  • bash -n deploy/native/deploy.sh
  • Caddyfile rendered both ways with the exact sed pipeline from deploy.sh: staging keeps redir /status + handle_path /status/* with no marker lines left; production has neither directive and no marker lines; the comment block is intact in both (17 source comment lines → 15 rendered, exactly the two markers)
  • Both edited workflow files parse as YAML
  • .github/scripts/scan-internal-identifiers.sh origin/main...HEAD — clean
  • cargo build --locked --all-targets — n/a, no Rust changed
  • cargo test --locked --all-targets — n/a, no Rust changed
  • cargo fmt --all / cargo clippy --all-targets — n/a, no Rust changed
  • npm test --prefix monitoring/mcp-status — n/a, dashboard code unchanged

Checklist

  • I have read the Contributing guidelines.
  • Docs (README / comments) updated for any user-visible change.
  • No secrets, credentials, or internal-only information are included.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TGhwpdTbUqQbR5AiiN8Ljw


Generated by Claude Code

…status.internetcomputer.org

The public status surface for ICP MCP is the "ICP MCP" component on
status.internetcomputer.org, driven by the deployment's status dashboard
(monitoring/mcp-status) through its Statuspage pusher. The dashboard itself
is not meant to be reachable on the production origin: its edge already
answers /status/ with a redirect, and the Caddyfile block that published it
there was dead weight that would come back on the next rollout.

Gate that block on SERVE_STATUS, passed by deploy-native.yml for the staging
environment only, exactly as MCP_SERVE_BETA already is. deploy.sh renders the
Caddyfile keeping the block (minus its marker lines) on staging and deleting
it on production. The imcp-status service is still installed and started on
every host: the Statuspage pusher runs inside it, and the repository cannot
tell which host holds /etc/imcp-status/statuspage.env, so removing the
service anywhere risks silencing the public component.

Re-point the two remaining public references to the retired origin URL: the
health workflow's Slack alert link and the Anthropic submission doc's
status/health row, which had flagged the origin's /status/ as cut off.

Verified: bash -n on deploy.sh; the Caddyfile rendered both ways with the
exact sed pipeline (staging keeps redir + handle_path /status/* with no
marker lines left, production has neither and no marker lines, the comment
block is intact in both); both workflow files parse as YAML.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TGhwpdTbUqQbR5AiiN8Ljw
@aterga
aterga requested a balanced review from Copilot September 22, 2026 10:02
@aterga
aterga marked this pull request as ready for review September 22, 2026 10:03
@aterga
aterga requested a review from a team September 22, 2026 10:03

Copilot AI 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.

Copilot review overview

🟡 Changes recommended

Several authoritative deployment references still incorrectly state that every host publishes the dashboard.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 1 Low severity

Open (1)
What changed in this PR

Restricts the native status dashboard to staging while directing users to the public ICP Statuspage.

Changes:

  • Conditionally renders the Caddy /status/ route via SERVE_STATUS.
  • Enables dashboard exposure only in staging deployments.
  • Updates documentation and public status links.
File Description
.github/​workflows/​deploy-native.yml Enables SERVE_STATUS for staging.
.github/​workflows/​health.yml Updates the Slack status link.
deploy/​native/​Caddyfile Marks the staging-only status route.
deploy/​native/​deploy.sh Conditionally renders that route.
deploy/​native/​README.md Documents status publication behavior.
docs/​anthropic-directory-submission.md References the public Statuspage component.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread deploy/native/Caddyfile Resolved
…found stale

The parent change made the dashboard's /status/ exposure staging-only but
left three authoritative statements saying every host publishes it: the
monitoring README's deploy paragraph, the imcp-status unit's header comment,
and the LANDING_SITE doc comment in main.rs, which said /status/ was
"published by the fronting proxy" as if that held on production. Each now
says the same thing as the Caddyfile and deploy README: staging publishes
the dashboard at /status/ (SERVE_STATUS); production runs the unit too,
because its Statuspage pusher feeds status.internetcomputer.org, but does
not publish the dashboard at its origin.

A tree sweep found no other stale statement: the remaining /status/ mentions
are the robots.txt Disallow, a test's list of machine paths, and factual
notes about production's edge answering /status/ with a redirect, all of
which stay true.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TGhwpdTbUqQbR5AiiN8Ljw
Copilot AI review requested due to automatic review settings September 22, 2026 10:06

Copilot AI 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.

Copilot review overview

🟢 Approval recommended

The staging and production configurations render correctly, and the related documentation and links are consistent.

Review effort: Balanced
Findings: None

Resolved since last review (1)

aterga commented Sep 22, 2026

Copy link
Copy Markdown
Collaborator Author

CI note: the plan check (Release workflow, run 35714155322) failed on e2d07b3 — but not because of this PR.

The job died at its Install dist step, before dist plan ran: curl … https://github.com/axodotdev/cargo-dist/releases/download/v0.31.0/cargo-dist-installer.sh was answered HTTP 500 by GitHub's release-download endpoint (curl: (22), exit 22). Checkout had succeeded. The diff between the passing head f4f93cf and e2d07b3 is three comment/doc edits and touches nothing dist or cargo reads; the same step passed on f4f93cf eight minutes earlier and on every recent run of this workflow (#215–#217).

There is no fix to port — the failure is upstream of the repository. I've re-run the failed job once. If the download 500s again, that's GitHub's release CDN and I'll keep the PR watched until it recovers rather than retry further.


Generated by Claude Code

@aterga
aterga merged commit 6a67958 into main Sep 22, 2026
19 of 20 checks passed
aterga pushed a commit that referenced this pull request Sep 22, 2026
The staging deploy for #194's merge (Deploy main run 35719911932) failed in
build.sh's Docker stage at apt-get install, before any compilation: thirteen
packages apt chose from bullseye-security -- perl, libcurl4, libexpat1,
libicu67, libxml2, dpkg-dev and friends -- answered 404 from the pool. The
suite's index still advertises those versions (perl 5.32.1-4+deb11u5), but
bullseye left LTS on 2026-08-31 and its security pool has since been pruned
underneath the index, so every apt-get that consults it fails the same way.
It is not this change's doing: the same stage passed on 2026-09-03 and the
merge touched no Dockerfile, Cargo or apt input.

Staying on bullseye is deliberate and documented (glibc 2.31 so the binary
runs on Amazon Linux 2023's 2.34; bookworm's 2.36 would not), so the fix is
to stop consulting the dead suite: the stage now writes a sources.list with
the bullseye main suite alone before apt-get update. main is intact and
carries every package this stage installs (verified against its current
arm64 index and pool: perl 5.32.1-4+deb11u3, libcurl4 7.74.0-1.3+deb11u13,
cmake 3.18.4-2+deb11u1, clang 1:11.0-51+nmu5, ...). The comment records the
next step for when deb.debian.org drops bullseye entirely: archive.debian.org
already mirrors the main suite.

The Docker daemon is not available where this was prepared, so the stage was
not rebuilt locally; the next push to main exercises it end to end in the
staging deploy, which is exactly the run that failed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TGhwpdTbUqQbR5AiiN8Ljw

aterga commented Sep 22, 2026

Copy link
Copy Markdown
Collaborator Author

Post-merge note: the staging deploy this merge triggered (Deploy main run 35719911932) failed — but not because of anything in this PR.

deploy / build died at Cross-build arm64 binary, in build.sh's Docker stage at apt-get install, before any compilation: thirteen packages apt chose from bullseye-security (perl, libcurl4, libexpat1, libicu67, libxml2, dpkg-dev, …) answered 404 from the pool. bullseye left LTS on 2026-08-31 and its security pool has since been pruned underneath an index that still advertises those versions. The same stage passed on 2026-09-03, this merge touched no Dockerfile/Cargo/apt input, and the ship job — the only place the deploy.sh change here would run — was skipped, so it never executed.

Fix is in #195: keep the deliberate bullseye base (glibc 2.31 for AL2023) but resolve apt from the intact bullseye/main suite alone. A re-run of the failed run would fail identically, so I haven't triggered one; merging #195 re-runs the staging deploy on a fixed stage.


Generated by Claude Code

aterga added a commit that referenced this pull request Sep 22, 2026
…#195)

* Cross-build from bullseye main only: the -security pool is gone

The staging deploy for #194's merge (Deploy main run 35719911932) failed in
build.sh's Docker stage at apt-get install, before any compilation: thirteen
packages apt chose from bullseye-security -- perl, libcurl4, libexpat1,
libicu67, libxml2, dpkg-dev and friends -- answered 404 from the pool. The
suite's index still advertises those versions (perl 5.32.1-4+deb11u5), but
bullseye left LTS on 2026-08-31 and its security pool has since been pruned
underneath the index, so every apt-get that consults it fails the same way.
It is not this change's doing: the same stage passed on 2026-09-03 and the
merge touched no Dockerfile, Cargo or apt input.

Staying on bullseye is deliberate and documented (glibc 2.31 so the binary
runs on Amazon Linux 2023's 2.34; bookworm's 2.36 would not), so the fix is
to stop consulting the dead suite: the stage now writes a sources.list with
the bullseye main suite alone before apt-get update. main is intact and
carries every package this stage installs (verified against its current
arm64 index and pool: perl 5.32.1-4+deb11u3, libcurl4 7.74.0-1.3+deb11u13,
cmake 3.18.4-2+deb11u1, clang 1:11.0-51+nmu5, ...). The comment records the
next step for when deb.debian.org drops bullseye entirely: archive.debian.org
already mirrors the main suite.

The Docker daemon is not available where this was prepared, so the stage was
not rebuilt locally; the next push to main exercises it end to end in the
staging deploy, which is exactly the run that failed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TGhwpdTbUqQbR5AiiN8Ljw

* Install the cross-build's packages from a bullseye snapshot, not main alone

Copilot's review of the previous commit was right: restricting apt to
bullseye main is unsatisfiable against this image. rust:1-slim-bullseye
(built 2026-08-25) has its base packages at the final security versions --
perl-base 5.32.1-4+deb11u5, libc6 2.31-13+deb11u14, dpkg 1.20.14 and 25
more -- while main carries perl 5.32.1-4+deb11u3, which depends on
perl-base (= 5.32.1-4+deb11u3), and libc6-dev 2.31-13+deb11u11, which
depends on libc6 (= 2.31-13+deb11u11). apt will not downgrade the
installed perl-base or libc6 to satisfy those, so the install fails.
Verified by reading /var/lib/dpkg/status out of the image's base layer
from the registry and comparing it with main's arm64 index.

Install from snapshot.debian.org at 2026-08-30 instead, for both suites:
the last state in which bullseye and bullseye-security were complete, after
the image was built. Its security index carries exactly the versions the
image has (perl-base +deb11u5, libc6 and libc6-dev +deb11u14, dpkg and
dpkg-dev 1.20.14) and all thirteen packages that 404 on deb.debian.org
(perl, libcurl4 7.74.0-1.3+deb11u16, libexpat1, libicu67, libxml2,
libglib2.0-0, ...), and its pool serves them. Both suites are frozen, so
the pin is the permanent final state, reproducible, with nothing to
downgrade. check-valid-until=no because the snapshot's Release files
expired on 2026-09-05; Acquire::Retries=3 for snapshot's throttling.

Still not rebuilt locally (no Docker daemon here); the staging deploy on
merge remains the end-to-end proof.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TGhwpdTbUqQbR5AiiN8Ljw

* Narrow the reproducibility claim in build.sh's apt comment

The previous commit's comment said the snapshot made "the build
reproducible". It does not: rust:1-slim-bullseye is a mutable tag and
BUILD_TIME is stamped at build time, so the binary and its metadata still
vary from build to build. What the dated snapshot fixes is apt's inputs,
so the comment now says that package resolution is reproducible and names
the two things that are not. Review nit from Copilot on 829622b.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TGhwpdTbUqQbR5AiiN8Ljw

* Fetch the bullseye snapshots over https

With check-valid-until=no, apt no longer rejects an index past its
Valid-Until, so its remaining defence against a network attacker replaying
an older, still validly signed snapshot index -- and thereby an older
package set than the timestamp names -- is the transport. Fetch both
snapshot lines over https so the dated path is authenticated in transit.
The rust:1-slim-bullseye image installs ca-certificates in its own layer
(alongside gcc, libc6-dev and wget), so https works before this stage
installs anything; snapshot.debian.org serves https end to end, redirecting
to same-origin content-hash paths. Review finding from Copilot on 69506cb.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TGhwpdTbUqQbR5AiiN8Ljw

---------

Co-authored-by: Claude <noreply@anthropic.com>
aterga pushed a commit that referenced this pull request Sep 22, 2026
Resolves the conflict in deploy/native/deploy.sh between this branch's
OAUTH_CIMD_ENABLED substitution on the unit_mcp line and #194's
SERVE_STATUS block around the caddyfile line: both are kept, the CIMD
comment and substitution first, then the status block as main has it.
The other files main touched (#172, #194, #195) merged cleanly.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd7VT72Qt16qiAJynu9EKj
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.

4 participants