← BBS SG Bank submission · All documents
The current BBS SG Bank batch is a synthetic educational COBOL ledger processor that applies deposits, withdrawals, and transfers from a fixed-width operations file to a fixed-width account ledger. Its current limitation is intentional but material for modernization learning: each operation can trigger a full ledger scan, and each accepted operation rewrites the entire account file. This creates an O(m × n) file-I/O pattern that becomes disproportionately expensive as account and operation fixture sizes grow.
The target state is a one-day working modernization prototype that preserves the existing ledger contract, cent-accurate behavior, rejection semantics, and summary output while replacing repeated ledger scans with indexed in-memory lookups and replacing per-operation rewrites with one deterministic end-of-batch write. The prototype also adds golden-file parity and benchmark evidence so stakeholders can compare the legacy COBOL baseline and modern implementation side by side before any approval.
The primary beneficiaries are modernization engineers, QA/regression testers, and demo stakeholders. The value proposition is risk-controlled modernization: demonstrate measurable performance improvement without changing business behavior, while keeping the solution explicitly scoped to synthetic educational fixtures rather than production banking or real customer records. Transition impact is intentionally narrow: legacy behavior remains the reference, modern output must match exactly, and rollout proceeds offline only through fixture-based side-by-side validation.
| Objective | Current State (Before) | Target State (After) | Success Criteria | Measurement Method |
|---|---|---|---|---|
| Preserve ledger behavior during modernization | Ledger behavior exists only in the COBOL program and comments, with no executable parity suite | Legacy COBOL output is treated as the authoritative baseline for every fixture | 100% of P0 parity fixtures match legacy final account output, processed count, rejected count, and total cents before sign-off | Offline side-by-side run comparing legacy and modern outputs on the same fixtures |
| Reduce batch processing cost caused by repeated file I/O | Each operation can scan the account ledger, and each accepted operation can rewrite the full ledger | Accounts are loaded once into an indexed structure and written once after all operations | [ASSUMPTION] Modern prototype is at least 2x faster than the COBOL baseline on both required benchmark fixture sizes; preliminary local results of 28.6x and 128.1x remain labeled pending independent review | Benchmark harness measuring 1,200 accounts × 400 operations and 5,000 accounts × 500 operations |
| Establish repeatable modernization evidence | No visible automated tests, benchmark fixtures, or CI workflow are present | Golden-file fixtures and benchmark outputs become reviewable evidence | At least 13 fixture categories are covered: deposits, withdrawals, transfers, malformed rows, insufficient funds, missing source, missing destination, self-transfer, invalid type, non-numeric amount, zero amount, fixed-width formatting, and final totals | Test report showing fixture coverage and pass/fail status |
| Improve demo stakeholder visibility without implying production readiness | Current batch prints only three summary lines to standard output | Prototype demo surface shows run status, parity result, benchmark timing, rejection summary, and audit events | 100% of demo screens and generated reports are labeled “synthetic prototype” and expose no real customer or banking-production claims | Demo checklist and review sign-off |
| Reduce mutation-window risk during ledger publication | The ledger is rewritten after every accepted operation | Only one final ledger publication step occurs after all operations are processed | Exactly one final ledger write phase per batch; no per-operation ledger rewrite in the modern path | Run logs and file artifact comparison showing one publish phase per completed batch |
| Name | Type | Role | Goals | Pain Points | How Served |
|---|---|---|---|---|---|
| Modernization Engineer | Persona | Builds the modern batch prototype while preserving legacy behavior | Replace inefficient internals without changing ledger semantics | Business rules are embedded in a single legacy program and comments | Receives explicit record contracts, parity gates, and migration requirements |
| QA / Regression Tester | Persona | Validates behavior and benchmark evidence | Confirm legacy and modern outputs match exactly across normal and edge cases | No existing automated tests or golden fixtures are present | Receives fixture requirements, byte-level comparison criteria, and benchmark targets |
| Demo Operator | Persona | Runs before/after demonstration for technical stakeholders | Show run status, timing, rejection summaries, and parity results clearly | Existing batch output is limited to aggregate counters | Receives a prototype/demo interface requirement with accessible states and non-production labeling |
| Technical Sponsor | Stakeholder | Funds and approves the one-day prototype | Demonstrate modernization ROI without expanding into a production banking program | Performance value may be questioned if evidence is not repeatable | Receives measurable success gates, cost-benefit framing, and side-by-side validation |
| Governance / Security Reviewer | Stakeholder | Reviews prototype-safe handling of financial-style data | Ensure no real customer-data or production-compliance claims are implied | Financial terminology can create incorrect regulatory expectations | Receives data classification, input validation, auditability, and retention requirements scoped to synthetic fixtures |
| Future Maintainer | Stakeholder | Maintains the legacy baseline and modern prototype after the demo | Understand record layouts and batch behavior without re-reading all COBOL logic | Parsing offsets and rejection behavior are not separated into reusable contracts | Receives canonical business rules, fixtures, and documentation requirements |
| ID | As a... | I want to... | So that... | Priority | Acceptance Criteria |
|---|---|---|---|---|---|
| US-001 | Modernization engineer | load the account ledger once into an indexed in-memory structure keyed by 8-digit account ID | operation processing avoids repeated full-ledger scans while preserving account lookup behavior | P0 | Given a valid account ledger, when the modern batch starts, then it reads the ledger once before operation processing; Given operation records are processed, when source or destination accounts are needed, then lookups use the indexed structure; Given the batch completes, then account ordering remains deterministic and compatible with the original ledger order. |
| US-002 | Modernization engineer | process deposits, withdrawals, and transfers sequentially in operation-file order | accepted and rejected outcomes remain consistent with the legacy baseline | P0 | Given operation kind D, W, or T, when the amount and account conditions are valid, then the operation is applied using integer cents; Given an operation is unsupported, non-numeric, zero amount, missing an account, self-transfer, or insufficient funds, when it is encountered, then it is rejected, the rejected count increments, and the batch continues. |
| US-003 | Modernization engineer | accumulate accepted balance mutations in memory and publish the ledger once | the prototype reduces write volume and avoids per-operation mutation windows | P0 | Given operations have been processed, when finalization begins, then exactly one ledger write phase occurs; Given the temporary ledger is incomplete, when publication is evaluated, then the target ledger is not replaced; Given the temporary ledger is complete, then replacement occurs only at the final publish step. |
| US-004 | QA / regression tester | run golden-file parity tests across legacy and modern implementations | behavior drift is detected before sign-off | P0 | Given a fixture set, when both implementations run against the same inputs, then final account output, processed count, rejected count, and total cents are compared; Given any mismatch exists, then the build is blocked and the mismatch is reported; Given all comparisons match, then the fixture passes. |
| US-005 | QA / regression tester | benchmark both required fixture sizes | the sponsor can evaluate performance improvement with transparent evidence | P1 | Given fixture size 1,200 × 400, when the benchmark runs, then runtime is recorded for legacy and modern versions; Given fixture size 5,000 × 500, when the benchmark runs, then runtime is recorded for legacy and modern versions; Given preliminary speedup values are shown, then they are labeled as local prototype results on one host pending independent review. |
| US-006 | Demo operator | view run status, parity result, benchmark timing, rejection summary, and generated artifacts in a prototype/demo interface [ASSUMPTION — no existing UI/API code is evidenced] | non-engineering stakeholders can understand before/after behavior | P1 | Given no run has been selected, when the demo interface loads, then it shows an empty state with instructions; Given a run is in progress, then it shows a loading/progress state; Given a run fails, then it shows a user-safe error without stack traces, secrets, or host paths; Given a run completes, then it labels results as synthetic prototype evidence. |
| US-007 | Governance / security reviewer | receive audit evidence for batch runs and artifact generation | prototype activity is traceable without implying formal compliance certification | P1 | Given a batch run starts, completes, fails, executes parity, generates a ledger, or records a benchmark, then an audit event is captured with actor or process, timestamp, operation, result, and artifact reference; Given logs are displayed, then sensitive values and host paths are not exposed. |
| US-008 | QA / regression tester | validate malformed and empty input conditions | edge cases do not silently produce incorrect outputs | P0 | Given operations.dat is empty, when the batch runs, then processed and rejected counts remain zero and total cents reflects the unchanged ledger; Given a malformed row is present, when it is processed, then it is rejected rather than silently corrected; Given an input file is missing or unreadable [ASSUMPTION — modern harness handles file-level failures explicitly], then the run fails gracefully before publishing a ledger. |
Business purpose: Apply a synthetic nightly operation feed to a flat-file account ledger while producing reconciliation totals. The modernization changes the internal processing pattern, not the business outcome.
Trigger event: A modernization engineer, tester, or demo operator starts a batch run against selected synthetic fixture files.
Step-by-step flow, decisions, inputs, and outputs:
Error/exception paths: Invalid records are rejected and do not abort the batch. Missing file, unreadable file, or failed final publication in the modern flow must stop publication and return a user-safe failure state.
Business outcome achieved: A deterministic final ledger and summary totals that match legacy behavior while reducing repeated file work.
flowchart TD
A[Start batch run] --> B[Read synthetic fixtures]
B --> C{Inputs available?}
C -- No --> D[Fail safely before publish]
C -- Yes --> E[Process operations in order]
E --> F{Operation valid?}
F -- No --> G[Count rejection and continue]
F -- Yes --> H[Apply accepted mutation]
G --> I{More operations?}
H --> I
I -- Yes --> E
I -- No --> J[Publish final ledger and totals]
Business purpose: Prove the modern implementation preserves COBOL behavior before any stakeholder approval. This process is the primary sign-off model and remains offline only.
Trigger event: QA or the regression harness initiates a parity run for a fixture category or benchmark size.
Step-by-step flow, decisions, inputs, and outputs:
Error/exception paths: If either implementation fails to run, the parity result is failed. If outputs differ, the run is blocked and differences are retained for diagnosis. Preliminary speedups must not be presented as independently validated.
Business outcome achieved: Stakeholders receive reviewable evidence that modernization improves internals without changing behavior.
flowchart TD
A[Select parity fixture] --> B[Run legacy baseline]
A --> C[Run modern prototype]
B --> D[Collect legacy outputs]
C --> E[Collect modern outputs]
D --> F{Outputs match exactly?}
E --> F
F -- No --> G[Block sign-off and report differences]
F -- Yes --> H[Record parity pass]
H --> I[Measure and label benchmark]
Business purpose: Help non-engineering stakeholders understand the before/after modernization value without implying production banking readiness. This process is [ASSUMPTION] because no existing UI/API implementation is present in the current repository.
Trigger event: A demo operator selects a fixture run or benchmark report for stakeholder review.
Step-by-step flow, decisions, inputs, and outputs:
Error/exception paths: Empty states guide the operator when no run exists. Failed runs show safe messages without stack traces, secrets, or host paths. Accessibility failures block demo acceptance.
Business outcome achieved: Sponsors can review prototype value, limitations, and evidence in a controlled, accessible, non-production experience.
flowchart TD
A[Open prototype demo] --> B{Run selected?}
B -- No --> C[Show empty state and instructions]
B -- Yes --> D[Show before and after summary]
D --> E{Parity passed?}
E -- No --> F[Show mismatch and block approval]
E -- Yes --> G[Show benchmark and audit evidence]
G --> H[Stakeholder sign-off decision]
| Rule | When It Applies | User Experience | Example |
|---|---|---|---|
| Fixed-width account format must be preserved | Whenever account ledger data is read, displayed, compared, or written | Users see account outputs that remain compatible with the legacy contract; invalid ledger rows are surfaced as fixture/data issues rather than silently reformatted | Account records remain 8-digit account ID, pipe delimiter, and 12-digit integer-cent balance; a malformed account fixture blocks or flags the run depending on test design |
| Fixed-width operation format must be preserved | Whenever operation input is parsed or validated | Invalid operation rows are rejected or reported according to the legacy-compatible validation path | Operation kind, source ID, destination ID, and amount are read from the established fixed positions; a short or malformed row is rejected rather than corrected |
| Monetary values use integer cents only | Whenever balances or operation amounts are calculated | Stakeholders receive cent-accurate outputs with no floating-point rounding differences | A transfer of 000000001250 subtracts exactly 1,250 cents from source and adds exactly 1,250 cents to destination |
| Unsupported or unsafe operations are rejected and the batch continues | Whenever an operation has an invalid type, non-numeric amount, zero amount, self-transfer, missing account, or insufficient funds | The run continues and rejected count increases; the invalid operation does not mutate balances | A transfer from an account to itself increments rejected count and does not change either balance |
| Accepted operations increment processed count | Whenever a deposit, withdrawal, or transfer passes all validation | The run summary reports accepted work separately from rejected work | A valid withdrawal with sufficient funds increments processed count by 1 |
| Final summary contract must be preserved | At the end of every successful batch run | Users receive the same three business totals as the legacy baseline | Summary includes processed count, rejected count, and total cents in fixed-width-compatible format |
| Prototype data must remain synthetic | Across fixtures, reports, audit events, demos, and documentation | The interface and reports clearly state that no real bank or customer records are used | A benchmark report is labeled “synthetic prototype evidence” rather than “production banking result” |
| User-supplied fixture inputs must use allow-list validation | When fixtures are uploaded, selected, or executed through any demo/tooling surface | Invalid files produce actionable user-safe errors without stack traces or host paths | A fixture containing an unsupported operation type is rejected by business validation; a fixture with a disallowed filename or path is rejected before execution |
| Audit evidence must be retained for prototype review | Whenever a run starts, completes, fails, generates output, or records a benchmark | Reviewers can trace what was run, when, by whom or what process, and what result occurred | A completed benchmark stores event time, fixture size, parity status, duration, and artifact references; [ASSUMPTION] retained for at least 1 year if audit logging is implemented |
| Demo UI must meet accessibility requirements | Whenever a user-facing demo surface is implemented | Keyboard users, screen-reader users, and users needing sufficient contrast can operate the prototype | Run status, errors, tables, and downloads meet WCAG 2.1 AA expectations |
| Internationalization is not required for MVP, but numeric formatting is fixed | For the one-day prototype demo | Users see legacy-compatible numeric formats rather than locale-specific currency formatting | Total cents remains a numeric cents field, not $1,234.56 or localized currency text |
| Metric | Target | Measurement Method | Timeline | Business Impact |
|---|---|---|---|---|
| Primary: Parity pass rate | 100% of P0 fixtures pass with exact final ledger and summary match | Golden-file comparison report | By end of 2026-09-23 prototype day | Confirms modernization preserves business behavior |
| Primary: Required fixture coverage | At least 13 fixture categories implemented and executed | Test inventory and run report | By end of 2026-09-23 prototype day | Converts legacy behavior into executable specifications |
| Primary: Performance improvement threshold | [ASSUMPTION] Modern run is at least 2x faster than legacy baseline for both required benchmark sizes | Benchmark harness comparing legacy and modern durations | By end of 2026-09-23 prototype day | Demonstrates measurable ROI beyond parity |
| Secondary: Ledger write reduction | Exactly 1 final ledger write phase per completed modern batch | Run instrumentation or artifact log | By end of 2026-09-23 prototype day | Reduces mutation windows and file-I/O volume |
| Secondary: Benchmark transparency | 100% of reports label 28.6x and 128.1x values as local prototype results pending independent review | Report content review | By demo review | Prevents overstatement of preliminary speedup claims |
| Secondary: Demo accessibility | 100% of implemented demo screens pass WCAG 2.1 AA checklist for keyboard navigation, screen-reader labels, and contrast | Accessibility checklist/manual test | Before stakeholder demo | Makes prototype review inclusive and policy-aligned |
| Secondary: Audit completeness | 100% of batch start, batch completion, batch failure, parity execution, ledger generation, and benchmark measurement events are recorded [ASSUMPTION if audit module is implemented] | Audit event review | Before stakeholder demo | Improves traceability and review confidence |
| Guardrail: Behavior drift | 0 unmatched final ledgers or summary counters in sign-off fixtures | Parity diff report | Continuous during prototype validation | Prevents performance improvements from changing ledger outcomes |
| Guardrail: Real-data exposure | 0 real customer or production bank records used | Fixture source review | Continuous | Maintains educational prototype boundary |
| Guardrail: User-safe error handling | 0 user-facing errors expose stack traces, secrets, or host paths | Error-state review and negative tests | Before demo | Reduces security and credibility risk |
| Risk | Probability | Business Impact | Trigger Conditions | Mitigation | Owner |
|---|---|---|---|---|---|
| Feature parity gap between legacy and modern runs | High | Incorrect balances or rejection counts would invalidate the prototype | Any fixture mismatch in final ledger, processed count, rejected count, or total cents | Block sign-off until exact parity is restored; expand fixtures around the failing case | QA / Regression Tester |
| Fixed-width formatting drift | Medium | Output may be numerically correct but incompatible with legacy consumers | Differences in padding, field width, delimiter placement, newline handling, or ordering | Use byte-level golden comparisons and canonical record-contract documentation | Modernization Engineer |
| Business continuity during cutover | Low | Offline demo evidence may be misunderstood as production cutover readiness | Stakeholders ask to use prototype against real customer or production data | Maintain offline-only side-by-side approval; explicitly label non-production scope | Technical Sponsor |
| Data migration integrity and rollback failure | Medium | A failed final write could overwrite or obscure baseline outputs | Temporary output is incomplete, comparison fails, or generated ledger is published early | Retain original inputs, publish only after complete temp output, and document discard/rerun rollback | Modernization Engineer |
| Performance claims overstated | Medium | Sponsor trust may be harmed if preliminary speedups are treated as independent benchmarks | Reports display 28.6x or 128.1x without qualification | Label all preliminary speedups as local single-host prototype results pending independent review | Demo Operator |
| Prototype UI/API scope creep [ASSUMPTION] | Medium | One-day delivery could expand into production-platform work | Requests for authentication, real-time processing, payment networks, or live banking workflows | Keep demo surface limited to fixture execution, run status, parity, audit, and benchmark review | Product Owner |
| Dependency upgrade cascade [ASSUMPTION] | Low | Tooling choices could require additional package or runtime setup beyond the one-day prototype | Adding a modern API/UI/test stack introduces incompatible dependency requirements | Pin minimal tooling, prefer local scripts, and defer production platform concerns | Modernization Engineer |
| Accessibility or security policy gap in demo surface | Medium | Demo cannot be approved for stakeholder use | UI lacks keyboard support, exposes stack traces, or accepts unsafe fixture inputs | Apply WCAG 2.1 AA checklist, allow-list validation, and user-safe error messages | Governance / Security Reviewer |
| Assumption | Impact if Wrong | Validation Plan |
|---|---|---|
| [ASSUMPTION] The modern implementation language/runtime can be chosen for rapid prototype delivery while keeping COBOL as the baseline | Delivery plan may need to change if the target runtime must remain COBOL-only | Sponsor confirms target runtime before implementation starts |
| [ASSUMPTION] A minimum 2x speedup is an acceptable explicit prototype threshold | Success metric may be too low or too high for sponsor expectations | Review threshold with technical sponsor before demo sign-off |
| [ASSUMPTION] Operator/demo interface can be lightweight and prototype-only | If stakeholders require production-grade UX/API, one-day scope is not feasible | Confirm demo expectations and label all surfaces as synthetic prototype |
| [ASSUMPTION] Audit events can be stored as prototype artifacts rather than a production audit platform | If formal compliance storage is required, scope and timeline expand | Governance reviewer confirms educational-prototype audit posture |
| [ASSUMPTION] Fixture data remains synthetic and can be versioned in the repository or test artifacts | If real data is introduced, privacy, retention, and compliance obligations change materially | Fixture source review before any benchmark or demo |
| System/Team | Dependency | Timeline | Impact if Delayed |
|---|---|---|---|
| Modernization engineering | Modern batch engine and record contract implementation | 2026-09-23 | Blocks parity testing and demo evidence |
| QA / regression testing | Golden fixture creation and comparison harness | 2026-09-23 | Blocks sign-off and risks behavior drift |
| Baseline COBOL environment | Ability to run the legacy baseline consistently | 2026-09-23 | Prevents side-by-side parity validation |
| Demo/operator tooling | Prototype run review surface or generated report | 2026-09-23 | Reduces stakeholder visibility but does not block core engine validation |
| Governance/security review | Approval of synthetic data handling, audit posture, and error messaging | 2026-09-23 | Blocks stakeholder demo if unresolved |
| Constraint | Type | Impact |
|---|---|---|
| Must preserve account and operation fixed-width flat-file contracts | technical | Limits changes to external record formats and requires byte-level comparisons |
| Must use integer cents and avoid floating-point monetary arithmetic | technical | Prevents rounding drift and preserves cent accuracy |
| Must run offline side by side only | business | No live cutover, canary traffic, or production transaction processing in this phase |
| Must remain a one-day working prototype | resource | Forces prioritization of engine, parity, benchmark, and lightweight demo/reporting only |
| Must not claim production banking compliance or handle real records | regulatory | Keeps scope educational and avoids inappropriate compliance assertions |
| Must include secure coding, input validation, auditability, and accessibility requirements | regulatory | Adds mandatory quality gates for any demo or tooling surface |
1,200 accounts × 400 operations and 5,000 accounts × 500 operations.1,200 × 400 and 5,000 × 500; prototype demo/report with parity status, rejection summary, timings, and audit trail [ASSUMPTION if demo surface is implemented].gantt
title One-Day Offline Modernization Rollout
dateFormat YYYY-MM-DD HH:mm
section Prototype Day
Baseline capture and fixtures :a1, 2026-09-23 09:00, 90m
Modern engine prototype :a2, after a1, 150m
Single final write controls :a3, after a2, 90m
Side-by-side parity gate :a4, after a3, 120m
Benchmark and demo evidence :a5, after a4, 90m
Stakeholder go-no-go :a6, after a5, 60m