Skip to content

fix(public): verify the shared footer copy in the live deploy acceptance - #97

Merged
nish3451 merged 12 commits into
mainfrom
fix/lane1-live-footer-copy-guard
Aug 19, 2026
Merged

fix(public): verify the shared footer copy in the live deploy acceptance#97
nish3451 merged 12 commits into
mainfrom
fix/lane1-live-footer-copy-guard

Conversation

@nish3451

Copy link
Copy Markdown
Collaborator

What

Adds section E to scripts/check-public-live-deploy.mjs (the release-lane live acceptance): every live path carrying the shared footer block must name the actual products (Promptly, Drishti) and must avoid every launch-prep fragment, using the same coverage and markers as the repo-side guard.

Why

The tracked finding "Eleven public pages still end with launch-prep footer copy ('gives each product a clean public foundation before launch')" is real on the live site: tinystudio.in still serves the June-20 bundle, and all eleven shared-footer paths (plus the served 404) carry the old line. The repo-side fix (PR #35) is merged on main, but the deploy-path acceptance never verified the footer copy — so a stale or regressed deploy can serve launch-prep copy without failing the lane. This closes that live-layer blind spot per the "fix the instance AND the detector" rule.

Checks added (44)

For each of the eleven shared-footer paths and the served 404 (same paths as the repo guard):

  • page returns 200 (or 404 for the probe)
  • footer block exists
  • .footer-copy paragraph exists
  • copy names Promptly and Drishti
  • copy and footer avoid: "clean public foundation", "foundation before launch", "gives each product", "before launch"

Runs only in the release lane after a Pages deploy (same contract as sections A–D); not wired into npm test/ci, so CI stays green while the site waits on the Pages token.

Verification

  • node --check scripts/check-public-live-deploy.mjs → OK
  • Live run detects the stale launch-prep copy on all 11 paths (118 failures) — same pre-token stale-bundle state as the existing sections A–D, which also fail against the June-20 bundle today
  • Passes the moment the Pages token is provisioned and the lane deploys the current bundle (the bundle carries the PR fix(public): replace launch-prep footer copy on all public pages #35 copy)

Note

The live site cannot leave the June-20 bundle until a Cloudflare Pages-scoped token is provisioned (one-time dashboard step documented in scripts/publish-public-site.mjs); this PR makes the lane prove the footer copy is gone after that deploy instead of trusting it.

PR #35 replaced the launch-prep footer line ('gives each product a clean
public foundation before launch') with visitor-facing copy on all twelve
shared-footer pages, but the deploy-path acceptance (check-public-live-deploy.mjs)
never verified the footer copy - so a stale or regressed deploy can serve the
old launch-prep copy without failing the lane. The live site still serves the
June-20 bundle, and all eleven shared-footer paths carry the old line.

Add section E: every live path with the shared footer block must name the
actual products (Promptly, Drishti) and must avoid every launch-prep
fragment, using the same coverage and markers as the repo-side guard
(scripts/test-public-footer-copy.mjs). Runs only in the release lane after a
Pages deploy; not wired into npm test/ci.

verify: node --check scripts/check-public-live-deploy.mjs; live run detects
the stale launch-prep copy on all 11 paths (118 failures = stale bundle,
same pre-token state as sections A-D)

@greptile-apps greptile-apps 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.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@nish3451, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 26 minutes

Limit details: You’ve used the included review currently available.

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits within each organization.

For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 7a34b56e-b88c-488b-a710-9661f645908a

📥 Commits

Reviewing files that changed from the base of the PR and between aedcfa7 and 90111bd.

📒 Files selected for processing (1)
  • scripts/check-public-live-deploy.mjs

Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands.

@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: 5c99578c42

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +140 to +141
for (const fragment of LAUNCH_PREP_FRAGMENTS) {
ok(!copy.includes(fragment), `${label} footer copy avoids "${fragment}"`)

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 Compare forbidden footer fragments case-insensitively

If a deployed footer contains a capitalization variant such as Before launch or Gives each product, every negative assertion passes because String.prototype.includes is case-sensitive, even though the launch-prep copy this acceptance check is intended to reject is still live. Normalize the extracted footer copy and fragments to a common case, or use case-insensitive expressions, so capitalization-only edits cannot produce a false-green deployment.

Useful? React with 👍 / 👎.

@greptile-apps greptile-apps 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.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps 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.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps 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.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps 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.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps 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.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@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: e30daceeea

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

const checkFooter = (label, html) => {
const footer = footerBlockOf(html)
ok(footer.length > 0, `${label} has a footer block`)
const copyBlock = footer.match(/<p class="footer-copy"[^>]*>([\s\S]*?)<\/p>/)

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 the footer-copy class independent of serialization

When a shared footer remains semantically unchanged but its attributes are reordered, use single quotes, or add another class (for example, <p style="..." class="footer-copy">), this regex fails to recognize the paragraph and blocks the post-deploy release lane. Match the class attribute regardless of attribute order and quoting, or parse the footer as HTML, so valid markup refactors do not produce a false deployment failure.

Useful? React with 👍 / 👎.

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

…-copy-guard

# Conflicts:
#	scripts/check-public-live-deploy.mjs
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

Comment-block conflict only in check-public-live-deploy.mjs: keep main every
managed-service snooze review disposition alongside this branch new proof note.

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

PR #123 landed its own section E (Cloudflare email obfuscation) in
check-public-live-deploy.mjs. Kept both live checks and relabelled this
branch section from E to F.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@nish3451

Copy link
Copy Markdown
Collaborator Author

Rebased during the backlog sweep, then knocked back into conflict again — this is a structural issue with the cluster, not a problem with this PR.

What happened. Five PRs each append a new lettered proof section to the same function in scripts/check-public-live-deploy.mjs: #123 (Cloudflare email, merged), #127 (JSON-LD coverage, merged), plus #110, #97, #154 and this one. Because they all insert at the same place, each merge re-conflicts every PR still waiting. I resolved this branch once (kept main's sections, relabelled the shared-footer copy check to the next free letter, re-ran the check suite green), and it went conflicting again when #127 landed minutes later.

Effort to land: small but strictly serial. The conflict is one hunk, always the same shape — keep main's sections, bump this branch's section letter, done. It just has to be redone after each sibling merges. Expect one rebase per remaining sibling.

Suggested order so each PR is rebased exactly once: #110, then #97, then #154, then #118. Landing them back to back is much cheaper than landing them days apart.

Nothing here is stale — this branch's check is real, absent from main, and passed the repo check chain when I last resolved it.

check-public-live-deploy.mjs now carries sections A-G on main (E Cloudflare
email #123, F JSON-LD #127, G footer tap-targets #110). Rather than resolve the
overlapping hunks by hand, this takes main file verbatim and grafts this
branch shared-footer copy proof onto it as section H. Repo check chain green.

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@nish3451
nish3451 merged commit 4db2ddb into main Aug 19, 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