← BBS SG Bank submission · All documents
Target length: 2:30 (hard cap 3:00). Presenter: {PRESENTER_NAME}. Recording: https://bbs-sg-bank-demo.pages.dev/media/bbs-sg-bank-demo.mp4 · Live app: https://bbs-sg-bank-demo.pages.dev.
Rule for this demo: show, don't claim. We show the legacy code, run the modern batch through the actual demo app, run both test suites, and show the measured parity/benchmark transcripts. Every speedup figure is shown only with the disclosure that the workload is synthetic and the legacy design deliberately inefficient (see 02-before-after.md §6).
https://bbs-sg-bank-demo.pages.dev; otherwise run locally: python3 site/backend/app.py --open (defaults to http://127.0.0.1:8765/).
legacy/bank.cob open at the two bottleneck comments (L108, L133) in a side tab.https://hackathon.softwareforge.ai/projects/6de0abcc-6025-4b07-9e5c-2308e8f4fe10 (Assessment complete, ForgeScore 57/100; Intent v1, PRD-Spec v1, Architecture v1 and User Stories v1 approved and exported, Testing v1 generated and exported, to docs/forge/; Delivery pending).GNUBOL_PREFIX=/tmp/gcb-build/install python3 scripts/test_bank.py and python3 tests/test_modern.py.site/tests/, 50 tests) and the operator terminal ready (legacy-ui/run.sh, 20 tests) if showing the real-COBOL job.scripts/evidence/benchmark-1200x400.txt (and -5000x500.txt).03-... §3).cobc is not on PATH, know the fallback line: *"This host lacks GnuCOBOL, so theapp reports the legacy time as unavailable — here are the transcripts from a host that has it."* (Never invent a number.)
"BBS SG Bank runs its overnight batch on this: a COBOL program that, for every single transaction, re-opens the accounts file and scans every account, then rewrites the whole file. Deposit, withdraw, transfer — same cost every time. This is the app we built around the modernized engine; everything you'll see runs live against the real batch code."
legacy/bank.cob, highlight L108 + L133)"Two lines tell the story. Line 108: 'reopen and scan the flat file for every operation.' Line 133: 'rewrite every account for every accepted operation.' The cost is operations times accounts — it gets quadratically worse as the bank grows. The fix isn't faster COBOL; it's not doing that work at all."
"The modern engine loads accounts once into an in-memory index, applies each operation with a constant-time lookup, and writes the file once —O(accounts + operations)instead ofO(operations × accounts). I'll run a 60-operation batch."
Click Run a batch; point at the result panel.
"Notice three things: the ledger total is unchanged — transfers only move value, they don't create it; the rejected rows are broken out by reason; and this 'engine matches simulation' check confirms the UI's expectations agree with what the batch actually did. The site runs the unmodified engine, not a reimplementation."
"We don't ask you to trust that. The core suites pass: 33 tests inscripts/test_bank.pyand 5 intests/test_modern.py— covering deposits, withdrawals, transfers, every rejection case, malformed input, and the duplicate-ID / overflow safety checks. The demo site has 50 more and the operator terminal 20. And here's the parity proof: the harness compiles the real COBOL and the modern batch, runs them on byte-identical fixtures, and confirms identical output and byte-identical account files."
GNUBOL_PREFIX=/tmp/gcb-build/install python3 scripts/test_bank.py # Ran 33 tests … OK
python3 tests/test_modern.py # Ran 5 tests … OK
Open scripts/evidence/benchmark-1200x400.txt.
"Same results on both engines. And because we've now built GnuCOBOL, the harness can time both: the legacy batch takes about a second at 1,200 accounts versus 35 milliseconds for the modern engine — 28.6x — and at 5,000 accounts it's 128.1x. The operator terminal runs that same real COBOL live: a 1,200×400 job did 400 processed, 3 rejected in 1.197 s of actual COBOL execution (1.234 s overall), and the modern engine's total matched. Two honest caveats: this is a synthetic workload, and the legacy design is deliberately inefficient — it rewrites the whole ledger per operation — so this is a fact about that algorithm, not a claim about COBOL in general."
"We drove the planning of this through the Opsera Forge pipeline. We uploaded the legacy folder to Forge and its Assessment is complete: ForgeScore 57 out of 100 — Developing, with 10 findings including 3 high, flagging exactly theO(m×n)scans, the full-file rewrites, and the missing specs. We approved and downloaded Intent v1, PRD-Spec v1, Architecture v1 and User Stories v1 (6 epics / 33 proposed stories), and Forge generated and exported Testing v1 (132 proposed test cases) — that page had no Approve button — all intodocs/forge/with recorded hashes. The stories and test cases are proposals, not implemented features or executed tests; the local suites are separate and total 108 passing. The supplied MCP token still returns 401, so we pulled the documents through the signed-in browser, which works. To be clear: Forge authored the planning documents, and its proposals (safe temp-file replacement, append-only audit, FastAPI, Forge Shipping) are not implemented; the modern Python is our own code — Forge assessed and framed the work; it didn't write or run the engine, and nothing is deployed."
"The impact: a super-linear batch becomes linear — one file write per run instead of one per transaction — no GnuCOBOL toolchain, an audit trail for every posting, and tests that guard every future change. That's BBS SG Bank's batch, modernized, with the proof in the repo."
| Segment | Length | Cumulative |
|---|---|---|
| Hook / problem | 0:20 | 0:20 |
| Before (legacy) | 0:25 | 0:45 |
| After (live batch) | 0:35 | 1:20 |
| Correctness (tests + measured parity) | 0:30 | 1:50 |
| Forge pipeline | 0:25 | 2:15 |
| Impact + close | 0:20 | 2:35 |
| ✅ Do | ❌ Don't |
|---|---|
| Show the two bottleneck lines in real code | Quote a speedup without the synthetic-workload disclosure |
| Run a batch live in the app | Hand-wave the parity check |
| Show the measured transcripts (28.6x / 128.1x) with the disclosure | Present 128.1x as a general COBOL or banking claim |
| State "33 + 5 core tests pass; parity byte-identical" if asked | Claim the prototype has a public hosted URL |
| Credit Forge for the Assessment, Intent v1 and PRD-Spec v1 documents | Claim Forge generated or ran the modern engine |
| Likely question | Answer |
|---|---|
| "Prove the speedup." | "Measured with isolated GnuCOBOL 3.2.0: 1.004s→0.035s (28.6x) at 1200×400 and 4.728s→0.037s (128.1x) at 5000×500, parity byte-identical. Synthetic fixtures against a deliberately inefficient legacy design — not a general COBOL claim." |
| "How do you know it's correct?" | "33 tests in scripts/test_bank.py + 5 in tests/test_modern.py (plus 50 site and 20 terminal tests); the parity runs assert byte-identical account files." |
| "Is the UI a separate reimplementation?" | "No — site/backend/service.py calls the unmodified modern/bank.py engine and cross-checks its counts against a simulation after every batch." |
| "Where did Forge help?" | "The Forge Assessment is complete — 57/100, 10 findings incl. 3 high — and Intent v1, PRD-Spec v1, Architecture v1 and User Stories v1 (33 proposed stories) are approved, while Testing v1 (132 proposed cases) was generated and exported without an approval step; all are downloaded into docs/forge/ (hashes recorded). Those stories/tests are proposals, not code or runs; our local suites are 108 passing. Every stage maps to an artifact under docs/forge/ (doc 04). Forge authored the planning documents; we wrote the engine." |
| "What's unfinished?" | "The raw Assessment export, the Delivery stage, public hosting, demo recording, and per-member posts." |