FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

openspec: plan full Pegasus removal (13 changes) by stephenliang · Pull Request #73702 · code-dot-org/code-dot-org · GitHub

openspec: plan full Pegasus removal (13 changes) - #73702

Draft
stephenliang wants to merge 5 commits into
stagingfrom
stephen/pegasus-removal-plan
Draft

openspec: plan full Pegasus removal (13 changes)#73702
stephenliang wants to merge 5 commits into
stagingfrom
stephen/pegasus-removal-plan

Conversation

Copy link
Copy Markdown
Member

Planning-only PR: OpenSpec artifacts for the full removal of the Pegasus subsystem — the pegasus/ directory, the lib/cdo/pegasus/ library tree, the pegasus MySQL schema, the last Sinatra app in the Rack stack (SharedResources), and the gems/infra wiring that exist only to serve them. No application code changes in this PR.

The master plan and three verified inventories live in specs/pegasus-removal/ (force-added; specs/ and openspec/ are normally git-excluded). Thirteen OpenSpec changes in five dependency tiers, all passing openspec validate:

  • Tier 1 (parallelizable now): pegasus-dead-code-sweep, pegasus-core-ext-extraction, pegasus-cron-detach, pegasus-shared-resources-port, pegasus-poste-dead-links
  • Tier 2 (DB table moves, rename+compat-view pattern): pegasus-db-hoc, pegasus-db-poste, pegasus-db-properties, pegasus-db-forms-drop
  • Tier 3: pegasus-db-retire · Tier 4: pegasus-directory-removal · Tier 5: pegasus-marketing-rename, pegasus-gem-final-sweep

Load-bearing findings baked into the plan: the pegasus "database" is a sibling schema on the same Aurora cluster, so table moves are atomic RENAME TABLE + updatable compatibility views (precedent: the channels move_user_storage_ids_to_dashboard.rb oneoff); Poste is the production ActionMailer delivery method and moves under its per-minute drain cron; String#to_bool and Object#nil_or_empty? are live monkeypatches whose only definitions sit in pegasus files loaded via fragile require chains; SharedResources (the sixth Sinatra app, which the sinatra-port series deliberately keeps) still compiles SCSS at request time with dead Ruby Sass into pegasus/cache/.

Gates already resolved during planning: List-Unsubscribe/X-Unsubscribe-Web headers pointing at the dead /u/ URL will be dropped (product-approved; all Poste mail is transactional); the production-pegasus ELB is verified gone (read-only AWS check — zero classic ELBs remain, so deregister_frontends_internal is dead whole); SassC vs Ruby Sass output was measured on all 19 shared SCSS files (12 identical, 6 whitespace-only, 1 selector-order-only — visual parity proven, no pinning needed).

Remaining gates are written into the task lists as MANUAL TASK hard stops for implementing agents: data-team sign-offs on DMS/Redshift relocation (db-hoc, db-poste, db-forms-drop), the chef-globals sweep before any marketing-rename work, and all ops runbooks (renames, view drops, schema drops). The sequel/mysql2 gems stay (DASHBOARD_DB consumers); pegasus_read_replica is a misnamed Gatekeeper flag gating read-splitting for all pools and is never removed.

Stacked on #73697 (sinatra-port plan) — pegasus-gem-final-sweep depends on that series completing.

Links

Testing story

Planning documents only. All 13 changes pass openspec validate. Two claims were verified empirically during planning: read-only AWS ELB check and a Ruby Sass/SassC compile diff across all 19 shared/css/*.scss files.

🤖 Generated with Claude Code

stephenliang and others added 4 commits August 20, 2026 06:51
Master plan + verified inventories in specs/pegasus-removal/;
13 OpenSpec changes in 5 dependency tiers:

tier 1: dead-code-sweep, core-ext-extraction, cron-detach,
        shared-resources-port, poste-dead-links
tier 2: db-hoc, db-poste, db-properties, db-forms-drop
tier 3: db-retire
tier 4: directory-removal
tier 5: marketing-rename, gem-final-sweep (needs sinatra-port series)

Also archives remove-pegasus-dead-data (landed upstream as #73597).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… measured, manual-task stops)

- dead-code-sweep: production-pegasus ELB verified absent (read-only
  AWS check; zero classic ELBs remain) — deregister_frontends_internal
  deletes whole if caller-free
- shared-resources-port: SassC vs Ruby Sass measured on all 19 scss:
  12 identical, 6 whitespace-only, hamburger.scss selector-order only
  (semantically equal) — visual parity proven, task becomes regression
  check
- poste-dead-links: List-Unsubscribe header drop explicitly approved
- db-hoc/db-poste/db-forms-drop/db-retire/marketing-rename: data-team
  and chef-globals gates reworded as MANUAL TASK hard stops for
  implementing agents

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Manual-task stop semantics, cross-series conflict ordering, local
environment prerequisites, line-drift handling.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Close the gaps a weaker implementing model would fall into:

- test_helper.rb globally disables forgery protection, so CSRF-rejection
  tests silently test nothing; foundation now ships a with-forgery-
  protection block helper and every phase's tasks require it.
- assert_lms_landing_policy rides the same before_action as
  handle_cap_lockout and is another redirect-on-API hazard; skip it on
  the shared base (same preserve-the-bypass rationale as CAP).
- sources-public/files-public 'no Set-Cookie' scenarios contradicted
  strict parity: legacy get_file resolves get_storage_id which writes
  the storage-id cookie for cookieless anonymous requesters; scenarios
  now scoped to the Rails session cookie.
- Routing gotchas spelled out per phase: format: false on filename
  segments (Rails eats .json/.png as formats), glob segments for
  slash-bearing curated-library names, literal '*' delete-all handling,
  netsim @min_id parsing, codeprojects Sinatra-pass semantics via
  routes constraints lambdas.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
All 31 tasks are done and shipped as a six-PR stack on staging (#74753-#74758, stack #74759; supersedes draft #74751). The implementation notes record the scope extensions found during verification: two k8s suppliers of pegasus_honeybadger_api_key, the dockerignore generated from aws/.gitignore, one co-deleted orphan, and the finding that the whole ServerTools class is dead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
stephenliang added a commit that referenced this pull request Aug 20, 2026
…C template

Two files with a deploy surface still reference pegasus.

cookbooks/cdo-apps/templates/default/crontab.erb defines a pegasus_dir helper that no cron entry in the template calls. Delete the definition. The template renders on chef converge; a local render under seven node/env combinations produces identical cron entries with no pegasus reference.

aws/cloudformation/vpc.yml.erb carries three "Pegasus Puma" ingress/egress rules for port 9001. Nothing listens on 9001; no nginx or puma config binds it, and pegasus_port has no configured value. Delete the three rules. This edit is inert until the next VPC stack update; the rendered template still parses, and all three security groups keep their remaining rules (ports 22, 80, 443, 9000).

Part 6/6 of the pegasus dead-code sweep (openspec change pegasus-dead-code-sweep, plan in #73702).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
stephenliang added a commit that referenced this pull request Aug 21, 2026
…4754)

Four library files and one Rails view survived the pegasus server removal with zero callers. lib/cdo/languages.rb defines an abstract class with no subclass and no callsite; every method raises on call. lib/cdo/pegasus/actionview_sinatra.rb is referenced only by its own test. lib/cdo/pegasus/screencap.rb and screencap.js have no callers and no build-pipeline reference. The view api/terms_interstitial_for_pegasus.html.haml has no route, no action, and no render site; its consumer was removed in 300a327.

Delete the five files, the actionview_sinatra test, and the two require sites: the stale require 'cdo/languages' in dashboard/app/helpers/levels_helper.rb and the screencap require in lib/cdo/pegasus.rb. The other requires in lib/cdo/pegasus.rb stay; live cron scripts load them.

Verified: rails boots, the lib/ suite passes (736 tests), and levels_helper_test passes (82 tests).

Part 2/6 of the pegasus dead-code sweep (openspec change pegasus-dead-code-sweep, plan in #73702).

Co-authored-by: Stephen Liang <538214+stephenliang@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
stephenliang added a commit that referenced this pull request Aug 21, 2026
…C template

Two files with a deploy surface still reference pegasus.

cookbooks/cdo-apps/templates/default/crontab.erb defines a pegasus_dir helper that no cron entry in the template calls. Delete the definition. The template renders on chef converge; a local render under seven node/env combinations produces identical cron entries with no pegasus reference.

aws/cloudformation/vpc.yml.erb carries three "Pegasus Puma" ingress/egress rules for port 9001. Nothing listens on 9001; no nginx or puma config binds it, and pegasus_port has no configured value. Delete the three rules. This edit is inert until the next VPC stack update; the rendered template still parses, and all three security groups keep their remaining rules (ports 22, 80, 443, 9000).

Part 6/6 of the pegasus dead-code sweep (openspec change pegasus-dead-code-sweep, plan in #73702).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
stephenliang added a commit that referenced this pull request Aug 21, 2026
…C template

Two files with a deploy surface still reference pegasus.

cookbooks/cdo-apps/templates/default/crontab.erb defines a pegasus_dir helper that no cron entry in the template calls. Delete the definition. The template renders on chef converge; a local render under seven node/env combinations produces identical cron entries with no pegasus reference.

aws/cloudformation/vpc.yml.erb carries three "Pegasus Puma" ingress/egress rules for port 9001. Nothing listens on 9001; no nginx or puma config binds it, and pegasus_port has no configured value. Delete the three rules. This edit is inert until the next VPC stack update; the rendered template still parses, and all three security groups keep their remaining rules (ports 22, 80, 443, 9000).

Part 6/6 of the pegasus dead-code sweep (openspec change pegasus-dead-code-sweep, plan in #73702).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
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


Back | FazBrowse Home | New Git URL