Files
uupl-smart-contract/.superpowers/sdd/2026-08-17-uups-bank-demo/task-6-report.md
T
golemandClaude Opus 5 fa36215def docs: track superpowers working documents in git
The uups-bank-demo wave's SDD records (ledger, six task briefs and reports,
review diffs) and the brainstorm design mockups were git-ignored, so they
existed only on one sandbox VM and reached no remote — this repo had no remote
at all until now.

Removes `.superpowers/` from .gitignore and the `*` .gitignore the superpowers
plugin writes inside .superpowers/sdd/; the second blocks the directory even
with the first removed.

Excluded as ephemeral local-server state, and now ignored by name:
.last-port, .last-token (a 64-char session token for a brainstorm server on a
port that is long gone), and the per-session state/ directories.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fnwzj6McD6kSkXwjUKFKxe
2026-08-20 14:38:00 -06:00

3.0 KiB

Task 6 report: deterministic V1 deployment state

Implemented

  • Preserved the pre-reboot Solidity work: DemoScript, DeployV1, SeedV1Demo, CheckState, and its 14-test preflight harness.
  • Added the Node manifest control plane. finalize-manifest.mjs validates public manifests, blocks canonical overwrite before deploy, confirms the exact CREATE proxy transaction, receipt/block/chain/code/ERC-1967 slot, and atomically writes only the selected canonical manifest. select-manifest.mjs validates and atomically selects one canonical manifest without altering the other.
  • Added fixture-driven Node tests, local Make targets, and deployments/.gitkeep.
  • Completed a live Anvil deployment/seed/check smoke: confirmed and active manifests were byte-identical, their deployment block was receipt block 2, and neither contained secret markers. Act 1 ended at Alice 900e6, Bob 500e6, liabilities/reserves 1_400e6, surplus 0.

Verification

  • node tools/test-finalize-manifest.mjs — 5/5 pass.
  • forge fmt --check — pass.
  • forge test --match-path test/ScriptPreflight.t.sol -vvv --force — 14/14 pass.
  • npm_config_offline=true forge test --force — 57/57 pass (fresh final run).
  • Live smoke (Anvil 31337): make deploy-v1, make seed-v1, DEMO_EXPECTED_STAGE=v1 make check-state — all exit 0; receipt/manifest inspection passed. Anvil was stopped afterward.
  • git diff --check — pass.

TDD evidence

  • Preserved pre-reboot Solidity RED/GREEN history honestly: it predates this resumed session; I only re-ran its green 14-test preflight suite.
  • Node initial RED: node --test tools/test-finalize-manifest.mjs failed with ERR_MODULE_NOT_FOUND for tools/finalize-manifest.mjs, as expected before implementation. GREEN: the new test suite passed after implementing finalizer/selector.
  • Atomic rename RED: the new atomic-writer test failed with ENOENT because the writer did not accept the injected I/O boundary; GREEN: it passed after staging a same-directory temporary path and renaming it.
  • Proxy provenance RED: a CALL record bearing the proxy address was incorrectly accepted; GREEN: the finalizer now requires transactionType === "CREATE", and all five Node tests pass.

Changed files

Makefile; deployments/.gitkeep; script/lib/DemoScript.sol; script/DeployV1.s.sol; script/SeedV1Demo.s.sol; script/CheckState.s.sol; test/ScriptPreflight.t.sol; tools/finalize-manifest.mjs; tools/select-manifest.mjs; tools/test-finalize-manifest.mjs.

Self-review and concerns

  • Reviewed the scoped diff and real Foundry broadcast shape. The only finding was missing explicit CREATE filtering; fixed with a RED/GREEN regression test.
  • Code-level Task 6 concerns: none. Base actor/RPC/keystore configuration was intentionally not added; it remains Task 12 per the stated ruling.
  • Handoff blocker: staging/committing requires writing the Git worktree index outside the sandbox. The elevated git add request was rejected because the approval service reported a usage-limit failure. No files were staged or committed.