Skip to content

Reconcile the current-main CMP adoption ledger before upstream sync #297

Description

@alexeygrigorev

Parent/reference: #145 (closed controlled CMP synchronization)
Consumer/related: #290 (static Datamailer source inventory), #50 (Datamailer retirement and Relay purpose wiring)

Product outcome

Restore one truthful, deterministic adoption ledger for the adopted Course Management Platform before any future CMP source synchronization. The ledger must describe the exact reviewed target tree and its intentional target-owned overlays, while keeping the current CMP pin unchanged. A no-op sync against that pin must be an accepted, repeatable proof rather than a blocked or silently regenerated report.

This is a source/adoption-evidence repair. It does not adopt the current CMP main, copy its campaign changes, or authorize any runtime, provider, migration, or deployment behavior.

Evidence boundary

  • Website authority for this audit: origin/main face8e4808d65afbf0374d1ced7a88079950d663, tree c8496fb2a37529eb7c63e1eeb9e35e29a2aadada.
  • The active shared current-main-derived worktree is redesign-iterations ff30774e9cde310a24abf61229c22cbd5a811186, tree 62e1656881aa7f9de8ab703c14f5a29049c2097d. Its three additional local design edits are identified below; they must not be silently promoted to website main by this issue.
  • Website source pin remains CMP 98a235283904b4ef9ad29e196298540756cf1bcc (source-pin.json SHA-256 71145a6b28ed0ea89e984b9c6bda5151549d3597d37c75d4c6b369ef4fbaf1b3). The copied-files ledger SHA-256 is 31a0ef0439b68477b905d9d084bfe9c0998dd8a7168ee3c99bc98d72542ea6e2; the integration-patched-files ledger SHA-256 is db285bab70aef0035235b68e17e63be55e4c133cfe514e0bd9026e2b76ac6c95.
  • CMP main was independently audited at 6d3cc0e0e0b9a1d28be1a8d53209555269e1d3fe, tree 45f1f8e2548b25e3ef89d44b2370efbb647ff088, parent e49c575ce3f567cc14a8f66a89d3ccaca3bfe2f4. This issue does not move the website pin to it.
  • The current sync dry-run fails closed on the first stale overlay row (accounts/templates/accounts/login.html); it must not be made green by ignoring the ledger or by running --apply.

Exact 15-row mismatch inventory

The current-main-derived audit compared each target overlay byte/size with the recorded integration-patched-files.tsv row. The observed set is exactly these 15 rows. Thirteen rows are already divergent on the authoritative face8e4 tree; the three rows marked redesign-only exist only in the unmerged local ff30774 worktree. The engineer must freeze the final accepted target identity before editing any ledger and preserve that distinction.

destination recorded bytes / SHA-256 observed bytes / SHA-256 source
accounts/templates/accounts/login.html 2923 / 5adbd00244ed6229086681516829697165b1373679a6de95136561e956c81b04 2940 / 531514cb41b8323f743af88201d9ea6b67cbaceb180e2bdce730f9ba9ebe8e07 face8e4
accounts/views/login.py 6194 / 55dfc487be5e9fe00692b1c5b0c081b5d13e577f02b9f9dcce4c6f7ffd162c62 6251 / 23254ef15aefdc971e88379521bebecc932c10ead95080f45b5729ed43a08fba face8e4
courses/registration.py 4988 / 4728a96c0106ef54b1644f16766ea8f4a3b4e9a52057a3ea3e3e000d2b005204 6221 / 60cd215bd6aa67e0cb441cf1a98e074c29ebc1779002d3857965e78bfe8c7517 redesign-only
courses/templates/courses/course_list.html 20395 / 5d08f07d4ab9064aeb906cb9435f0b287cae248b9f5affda7e9eae82fe126854 20428 / c406b4ca288a398f45030fb4032acaed43bbc3f46c03953f7b0673970b69dd72 face8e4
courses/templates/courses/dashboard.html 21030 / 86fbb37b894ed50043d1e57dafeea0ea1a0833c100ea1b323faf8ae31e300122 23080 / 2bf2e39f0387bbba530421174a77ab718bd93c188c52e0d600f58b677c4d3f70 redesign-only
courses/templates/courses/enrollment.html 12012 / d0c11d76e714d789b9aca8921bde550ba7ee3685eb1683090bee17db5d5aa97b 12046 / a63afcf108030c3e0018ffb8a93b824382c1c365991bebd14944352b03084669 face8e4
courses/templates/courses/leaderboard_score_breakdown.html 17594 / f95e13c740a224cb6d793eb2b97e0ab82bdd2cf1d5f03d33da3ad200f636cb6d 17679 / f1b4101fdd1a37a0bcce462453fd2dad220c63f30aec49416f78f98a0b20cd16 face8e4
courses/templates/courses/register.html 20288 / 11e7b6438e3ad00f3dd236ec77ba318869e6e31b1ea9473f078326b66cdf2d5c 20305 / 53f08c7fcb0885aea4bd1e7495ddc06873b6f45a41d6a962cc13c81bf8d7ddcf face8e4
courses/templates/projects/eval.html 6335 / 82b2b541c17aea908d5c329d40de1d3b6be7acb554444f237e18d165cbeb1747 6369 / 26c799672e9b6fe9a81b204514cc051c3be2ce1adcb8697a5c12697278f6af96 face8e4
courses/templates/projects/list.html 12065 / 2ce06f1fcdfa4049d18edd2faf092948bb888c8dac8ec40ed99cc51bc6fbcc25 12184 / de31659cc7b34ffca680e9210d75b6fda3c6eca684fecbd5c4a9a3cfe270b59c face8e4
courses/templates/projects/list_all.html 5004 / 77dc3a8c320a57da2e93a3f82bace8d9700ae031a06053621ae569ccde0d5ac2 5021 / f85cbb0c1afc0ab3c72edd1ecf8406e13d0d15018b5b6dc2054b7a1235222328 face8e4
courses/templates/projects/results.html 7549 / 9335a10a0988b7bd9b21d73439f412aea5afa43ba486d5cd0e8c059bf5b25cc6 7600 / b1203097d353e61f4c24ac28c94164b1623fd42b83e746308a3ebda2ca575f5b face8e4
courses/templates/projects/submissions.html 6763 / ae283afbf471711dcec6332464d99b214f45fe97032ac8854682010b9a69dfb9 6780 / 02d1cc0d2553efdb64fb1fd737d0ca39500fd7ff6b52ea7e3d28a3ff521d762b face8e4
courses/tests/test_dashboard.py 1379 / 563c875b43314b8e6862e7c0f578950e265c91ef014efa52c0135fe8148b91da 2185 / 2785f875ddae8f77172e2deaaf412381bfbdd32d4f7a96e150e96d8737dc6314 redesign-only
courses/tests/test_dashboard_integration.py 7214 / 8a1a98a29bc1192cab48a176363f0b3f80e9319d7b3b03271e989362e094d5e5 7283 / 4f8c907ecacf175a8fe33a5e06180ebb1930799f41443a0cef014bdff1b1c6a4 face8e4

Scope

  • Freeze one exact website base/tree accepted by the orchestrator; do not infer that the local redesign worktree is main.
  • Reconcile only the listed adoption/overlay rows, with a row-level reason and source/target ownership for each.
  • Keep the CMP source pin at 98a235283904b4ef9ad29e196298540756cf1bcc and preserve the existing #145 mapping, deletion, migration, and overlay guards.
  • Refresh only the necessary versioned adoption evidence and the deterministic report/manifest values required by the chosen target identity.
  • Record the exact final target commit/tree, source pin, copied-files digest, patched-files digest, row inventory, and no-op report digest in the engineer/tester handoffs.

Explicit non-goals

  • No source-pin update to CMP 6d3cc0e or any other moving ref.
  • No sync_course_platform.py --apply, source copy, migration rewrite/squash, runtime behavior, template behavior, API/Studio change, Datamailer/Relay operation, provider/network call, protected-data access, CI rerun, commit, push, merge, or deployment in this issue.
  • Do not absorb the three unmerged redesign-only rows into origin/main or overwrite user work.
  • Do not use this issue to decide or implement EmailCampaign/campaign queue/from_email behavior; that is the separate decision issue linked from Wire approved messages through Relay and retire Datamailer #50.

Dependencies and ownership

Acceptance criteria

  • PM records and freezes one exact target commit/tree; the 15-row inventory is reclassified against that identity, with every row accounted for exactly once and no local-only edit silently promoted.
  • The adoption manifests record the actual target-owned overlay bytes for every intentional row, retain the pinned CMP source bytes/provenance, and contain no unreviewed path, duplicate, omission, or migration replacement.
  • uv run --frozen python scripts/verify_course_platform_adoption.py passes against a clean checkout at CMP 98a235283904b4ef9ad29e196298540756cf1bcc.
  • A fresh no-op uv run --frozen python scripts/sync_course_platform.py --source-ref 98a235283904b4ef9ad29e196298540756cf1bcc --source-checkout <clean-checkout> --report <redacted-report> --dry-run returns status=no_change, records the exact pinned/requested SHA, and reports zero changed, copy, conflict, and fatal paths without mutating tracked files.
  • make migrations-check, adoption-focused tests, format/lint/type checks, and the verification plan selected for the changed evidence pass; the report classifies every component exactly once and documents screenshots as not applicable only if the graph proves no render inputs changed.
  • Independent tester recomputes the plan from the frozen target identity, verifies the manifest/no-op report and every acceptance criterion, and posts a tester-final report before PM acceptance.
  • PM posts ACCEPT only after the independent tester pass; the eventual focused commit uses Refs #297 and the orchestrator performs the normal local no-ff merge/push lifecycle.

Browser/test scenarios

This is non-rendering evidence work, so product screenshots are not applicable when the recomputed plan proves render inputs unchanged. The tester still runs the graph-selected repository-local tier and checks that the no-op sync/verifier cannot alter a rendered route. No provider, external CMP operation, or production browser session is permitted.

  1. Run the no-op sync twice against a clean checkout of the pinned CMP commit; both reports and all tracked target bytes are identical.
  2. Introduce a synthetic stale row, missing row, duplicate, wrong hash/size, source-pin drift, or dirty source checkout in an isolated fixture; the verifier fails closed with a bounded reason and no target mutation.
  3. Confirm the final adopted course and account route manifests remain navigable/read-only under the existing target identity; no campaign or Relay behavior is exercised.

Required lifecycle

The candidate remains uncommitted after engineering. The independent tester must capture exact base/head/tree and report/artifact digests, then PM accepts or returns it. No source sync, deployment, or upstream CMP adoption is implied by a green no-op.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Must-have or release-blockingbugSomething isn't workingdocumentationImprovements or additions to documentationintegrationArea: integrationoperationsArea: operationstestingArea: testing

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions