<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.webhuis.nl:443/index.php?action=history&amp;feed=atom&amp;title=Architecture_decision_records</id>
	<title>Architecture decision records - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.webhuis.nl:443/index.php?action=history&amp;feed=atom&amp;title=Architecture_decision_records"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Architecture_decision_records&amp;action=history"/>
	<updated>2026-09-11T14:14:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Architecture_decision_records&amp;diff=4756&amp;oldid=prev</id>
		<title>Martin: Created page with &quot;&lt;span id=&quot;architecture-decision-records&quot;&gt;&lt;/span&gt; = Architecture Decision Records =  {| !width=&quot;23%&quot;| Field !width=&quot;76%&quot;| Value |- | Document ID | PGCBL-ADD-001 |- | Document Type | Architecture Decision Document |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Draft — decisions marked [INFERRED] need developer confirmation |- | Owner | Lead Developer / Architect |- | Author | [reverse-engineered from source artifacts] |- | Creat...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Architecture_decision_records&amp;diff=4756&amp;oldid=prev"/>
		<updated>2026-03-25T15:34:59Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;span id=&amp;quot;architecture-decision-records&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Architecture Decision Records =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-ADD-001 |- | Document Type | Architecture Decision Document |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Draft — decisions marked [INFERRED] need developer confirmation |- | Owner | Lead Developer / Architect |- | Author | [reverse-engineered from source artifacts] |- | Creat...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span id=&amp;quot;architecture-decision-records&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Architecture Decision Records =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;23%&amp;quot;| Field&lt;br /&gt;
!width=&amp;quot;76%&amp;quot;| Value&lt;br /&gt;
|-&lt;br /&gt;
| Document ID&lt;br /&gt;
| PGCBL-ADD-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Architecture Decision Document&lt;br /&gt;
|-&lt;br /&gt;
| System&lt;br /&gt;
| pgcobol — Prime Numbers Application v1.0&lt;br /&gt;
|-&lt;br /&gt;
| Version&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| Draft — decisions marked [INFERRED] need developer confirmation&lt;br /&gt;
|-&lt;br /&gt;
| Owner&lt;br /&gt;
| Lead Developer / Architect&lt;br /&gt;
|-&lt;br /&gt;
| Author&lt;br /&gt;
| [reverse-engineered from source artifacts]&lt;br /&gt;
|-&lt;br /&gt;
| Created&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Last modified&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
|-&lt;br /&gt;
| Classification&lt;br /&gt;
| Internal&lt;br /&gt;
|-&lt;br /&gt;
| Parent document&lt;br /&gt;
| PGCBL-TSD-001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;version-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;16%&amp;quot;| Version&lt;br /&gt;
!width=&amp;quot;22%&amp;quot;| Date&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Author&lt;br /&gt;
!width=&amp;quot;15%&amp;quot;| Status&lt;br /&gt;
!width=&amp;quot;30%&amp;quot;| Change Summary&lt;br /&gt;
|-&lt;br /&gt;
| 0.1&lt;br /&gt;
| 2026-03-17&lt;br /&gt;
| —&lt;br /&gt;
| Draft&lt;br /&gt;
| All ADRs inferred from source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;table-of-contents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Table of Contents ==&lt;br /&gt;
&lt;br /&gt;
# [[#1-purpose-and-format|Purpose and Format]]&lt;br /&gt;
# [[#2-adr-001--three-tier-architecture|ADR-001 — Three-Tier Architecture]]&lt;br /&gt;
# [[#3-adr-002--method-dispatch-pattern|ADR-002 — Method-Dispatch Pattern]]&lt;br /&gt;
# [[#4-adr-003--divisors-stored-in-database|ADR-003 — Divisors Stored in Database]]&lt;br /&gt;
# [[#5-adr-004--gixsql-as-sql-pre-processor|ADR-004 — GixSQL as SQL Pre-Processor]]&lt;br /&gt;
# [[#6-adr-005--copybooks-as-interface-contracts|ADR-005 — Copybooks as Interface Contracts]]&lt;br /&gt;
# [[#7-adr-006--hard-coded-database-credentials|ADR-006 — Hard-Coded Database Credentials]]&lt;br /&gt;
# [[#8-adr-007--no-explicit-commit-on-insert|ADR-007 — No Explicit COMMIT on INSERT]]&lt;br /&gt;
# [[#9-adr-008--odd-only-sieve-starting-at-3|ADR-008 — Odd-Only Sieve Starting at 3]]&lt;br /&gt;
# [[#10-open-issues|Open Issues]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;purpose-and-format&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Purpose and Format ==&lt;br /&gt;
&lt;br /&gt;
An Architecture Decision Record (ADR) captures a single significant design decision: the context that prompted it, the options that were considered, the choice that was made, and the consequences. ADRs are written once and never deleted — if a decision is reversed, a new ADR documents the reversal and links to the original.&lt;br /&gt;
&lt;br /&gt;
This document follows the &amp;#039;&amp;#039;&amp;#039;MADR (Markdown Architectural Decision Records)&amp;#039;&amp;#039;&amp;#039; format, a widely adopted lightweight standard (see &amp;lt;code&amp;gt;https://adr.github.io/madr/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-template&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ADR template ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;markdown&amp;quot;&amp;gt;## N. ADR-NNN — &amp;amp;lt;Short title of the decision&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
**Date:** YYYY-MM-DD  &lt;br /&gt;
**Status:** Proposed | Accepted | Deprecated | Superseded by ADR-NNN  &lt;br /&gt;
**Deciders:** &amp;amp;lt;names or roles&amp;amp;gt;  &lt;br /&gt;
**Source:** [CONFIRMED] | [INFERRED from source] | [ASSUMED]&lt;br /&gt;
&lt;br /&gt;
### Context&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;What situation or problem prompted this decision? What forces are at play?&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Decision Drivers&lt;br /&gt;
&lt;br /&gt;
- &amp;amp;lt;driver 1&amp;amp;gt;&lt;br /&gt;
- &amp;amp;lt;driver 2&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Options Considered&lt;br /&gt;
&lt;br /&gt;
| Option | Description | Pros | Cons |&lt;br /&gt;
|--------|-------------|------|------|&lt;br /&gt;
| A | ... | ... | ... |&lt;br /&gt;
| B | ... | ... | ... |&lt;br /&gt;
&lt;br /&gt;
### Decision&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;The option chosen and a one-line justification.&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Consequences&lt;br /&gt;
&lt;br /&gt;
**Positive:**&lt;br /&gt;
- &amp;amp;lt;benefit 1&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
**Negative / trade-offs:**&lt;br /&gt;
- &amp;amp;lt;drawback 1&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
**Risks:**&lt;br /&gt;
- &amp;amp;lt;risk 1&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
### Compliance check&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;How to verify this decision is being followed in the codebase.&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-001-three-tier-architecture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. ADR-001 — Three-Tier Architecture ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deciders:&amp;#039;&amp;#039;&amp;#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; [INFERRED from source structure]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
A batch COBOL program could be written as a single monolithic program with all logic, SQL, and output in one place. This project chose to separate concerns into distinct compiled units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-drivers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision Drivers ===&lt;br /&gt;
&lt;br /&gt;
* Demonstrate a maintainable, layered COBOL design pattern.&lt;br /&gt;
* Allow each tier to be tested, replaced, or modified independently.&lt;br /&gt;
* Keep SQL in one place so that database changes affect only one program.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;options-considered&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Options Considered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;24%&amp;quot;| Option&lt;br /&gt;
!width=&amp;quot;39%&amp;quot;| Description&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Pros&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Cons&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| Single monolithic program&lt;br /&gt;
| Simple; one file to manage&lt;br /&gt;
| Hard to test; all concerns coupled&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| Three-tier (chosen)&lt;br /&gt;
| Separation of concerns; independently testable tiers&lt;br /&gt;
| More files; inter-program calling overhead&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| Two-tier (no UI layer)&lt;br /&gt;
| Simpler than three&lt;br /&gt;
| Print formatting coupled to business logic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Option B — three-tier (presentation / business logic / data access), each as a separate compiled COBOL program. A fourth orchestrating program (&amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt;) manages the session lifecycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Positive:&amp;#039;&amp;#039;&amp;#039; - SQL is isolated in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;; database changes do not affect other programs. - Print formatting is isolated in &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;; output format changes do not affect logic. - Each program can be called from a test harness independently.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Negative / trade-offs:&amp;#039;&amp;#039;&amp;#039; - Four programs must be compiled and linked instead of one. - Inter-program calls carry a small runtime overhead. - A shared copybook change requires recompiling all programs that use it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;grep -l &amp;amp;quot;EXEC SQL&amp;amp;quot; *.cbl&amp;lt;/code&amp;gt; should return only &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;grep -l &amp;amp;quot;OPEN.*fprinter\|WRITE.*file-buffer&amp;amp;quot; *.cbl&amp;lt;/code&amp;gt; should return only &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-002-method-dispatch-pattern&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. ADR-002 — Method-Dispatch Pattern ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deciders:&amp;#039;&amp;#039;&amp;#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; [INFERRED from copybook design]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
COBOL does not have objects, interfaces, or function pointers in the traditional sense. When a caller invokes a subprogram, it can either call different entry points (ENTRY paragraphs) or pass a discriminator value and let the callee dispatch internally. The design must allow each subprogram to expose multiple operations without multiple entry points.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-drivers-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision Drivers ===&lt;br /&gt;
&lt;br /&gt;
* Keep the inter-tier interface to a single &amp;lt;code&amp;gt;CALL&amp;lt;/code&amp;gt; statement per tier.&lt;br /&gt;
* Allow new operations to be added to a tier without changing the caller’s CALL syntax.&lt;br /&gt;
* Use a pattern that is idiomatic in COBOL and familiar to COBOL programmers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;options-considered-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Options Considered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;24%&amp;quot;| Option&lt;br /&gt;
!width=&amp;quot;39%&amp;quot;| Description&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Pros&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Cons&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| Separate CALL per operation (&amp;lt;code&amp;gt;CALL &amp;amp;quot;primes-connect&amp;amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CALL &amp;amp;quot;primes-fetch&amp;amp;quot;&amp;lt;/code&amp;gt; …)&lt;br /&gt;
| Explicit; no dispatch overhead&lt;br /&gt;
| Many CALL statements; callers must know all entry names&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| ENTRY paragraph per operation (single program, multiple named entries)&lt;br /&gt;
| Standard COBOL; compiler-enforced&lt;br /&gt;
| Callers must still reference entry names; no single interface point&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| Method-dispatch over a control block (chosen)&lt;br /&gt;
| Single CALL; extensible; copybook is the interface contract&lt;br /&gt;
| Verb strings must be kept in sync between copybooks and EVALUATE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Option C — a string verb in a copybook field (&amp;lt;code&amp;gt;dal-methods&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ui-methods&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;methods&amp;lt;/code&amp;gt;) drives an &amp;lt;code&amp;gt;EVALUATE TRUE&amp;lt;/code&amp;gt; inside the called program. The copybook is the published interface; the 88-level conditions make the valid verbs self-documenting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Positive:&amp;#039;&amp;#039;&amp;#039; - Adding a new operation requires only: a new 88-level condition in the copybook and a new &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; clause in the callee. - The caller’s CALL statement never changes. - The copybook 88-levels serve as the API documentation.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Negative / trade-offs:&amp;#039;&amp;#039;&amp;#039; - Verb strings are not type-checked at compile time; a misspelled verb silently falls through to the &amp;lt;code&amp;gt;WHEN OTHER&amp;lt;/code&amp;gt; error branch. - Result codes (0/1/9/99) are numeric constants, not named conditions at the caller site — callers must remember the convention.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Risks:&amp;#039;&amp;#039;&amp;#039; - Verb string drift: if a verb is renamed in the copybook but not in the callee’s EVALUATE, the operation silently does nothing and returns result 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
Every verb listed in a &amp;lt;code&amp;gt;dal-methods&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ui-methods&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;methods&amp;lt;/code&amp;gt; 88-level must have a corresponding &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; clause in the callee’s EVALUATE. Verify with a diff of copybook 88-values against callee WHEN values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-003-divisors-stored-in-database&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. ADR-003 — Divisors Stored in Database ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deciders:&amp;#039;&amp;#039;&amp;#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; [INFERRED from algorithm and SQL design]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
The trial-division sieve needs a list of previously found primes to use as divisors. These could be held in a COBOL working-storage table (an array), in a flat file, or in the database.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-drivers-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision Drivers ===&lt;br /&gt;
&lt;br /&gt;
* Demonstrate database interaction as part of the algorithm (pedagogical goal).&lt;br /&gt;
* Keep the COBOL working-storage footprint small — avoid a large in-memory prime array.&lt;br /&gt;
* Persist divisors so the report can run independently of the generation run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;options-considered-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Options Considered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;24%&amp;quot;| Option&lt;br /&gt;
!width=&amp;quot;39%&amp;quot;| Description&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Pros&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Cons&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| In-memory COBOL table&lt;br /&gt;
| Fastest; no I/O&lt;br /&gt;
| Fixed size; lost between runs; defeats the DB demonstration goal&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| Flat file&lt;br /&gt;
| Persistent; simple&lt;br /&gt;
| Requires file I/O; not the DB demonstration goal&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| Database (chosen)&lt;br /&gt;
| Persistent; demonstrates DB use; divisors and output in same store&lt;br /&gt;
| One SQL query per trial division step — potentially very slow&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Option C — each divisor is fetched from the &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; table by ident using a point SELECT. Generated primes accumulate in the same table as the divisors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Positive:&amp;#039;&amp;#039;&amp;#039; - Demonstrates the full three-tier pattern end-to-end. - All state is in the database; generation can be interrupted and (in principle) resumed.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Negative / trade-offs:&amp;#039;&amp;#039;&amp;#039; - Performance is heavily dependent on the &amp;lt;code&amp;gt;SELECT prime WHERE ident = :n&amp;lt;/code&amp;gt; query. Without an index on &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt;, this becomes a sequential scan that gets slower as the table grows. - The design requires prime 2 to be pre-seeded in the table before the algorithm starts, since the first divider fetch assumes ident=2 exists.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Risks:&amp;#039;&amp;#039;&amp;#039; - No index on &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; is defined in &amp;lt;code&amp;gt;primes_schema.sql&amp;lt;/code&amp;gt; (see NFR-PERF-03). This is the most significant performance risk in the system.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;\d primes.primes&amp;lt;/code&amp;gt; in psql; verify an index on &amp;lt;code&amp;gt;ident&amp;lt;/code&amp;gt; is present. If absent, add: &amp;lt;code&amp;gt;CREATE INDEX idx_primes_ident ON primes.primes (ident);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-004-gixsql-as-sql-pre-processor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. ADR-004 — GixSQL as SQL Pre-Processor ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deciders:&amp;#039;&amp;#039;&amp;#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; [CONFIRMED — explicit in compiler listing header and DATASRC prefix &amp;lt;code&amp;gt;pgsql://&amp;lt;/code&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
GnuCOBOL does not natively support embedded SQL. An external pre-processor is needed to translate &amp;lt;code&amp;gt;EXEC SQL … END-EXEC&amp;lt;/code&amp;gt; blocks into COBOL CALL statements to a SQL runtime library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-drivers-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision Drivers ===&lt;br /&gt;
&lt;br /&gt;
* Open-source toolchain (no licensing cost).&lt;br /&gt;
* PostgreSQL support.&lt;br /&gt;
* Compatible with GnuCOBOL.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;options-considered-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Options Considered ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;38%&amp;quot;| Option&lt;br /&gt;
!width=&amp;quot;61%&amp;quot;| Description&lt;br /&gt;
|-&lt;br /&gt;
| ESQL/C bridge&lt;br /&gt;
| Write SQL in C, call from COBOL — complex&lt;br /&gt;
|-&lt;br /&gt;
| OCESQL&lt;br /&gt;
| Another open-source COBOL SQL pre-processor — less PostgreSQL-specific&lt;br /&gt;
|-&lt;br /&gt;
| GixSQL (chosen)&lt;br /&gt;
| Open-source; PostgreSQL-optimised; active development&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
GixSQL — translates EXEC SQL to &amp;lt;code&amp;gt;GIXSQLExec&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GIXSQLConnect&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GIXSQLConnectReset&amp;lt;/code&amp;gt; calls. Connection string prefix &amp;lt;code&amp;gt;pgsql://&amp;lt;/code&amp;gt; is GixSQL-specific.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Positive:&amp;#039;&amp;#039;&amp;#039; - Standard embedded SQL syntax in COBOL source. - PostgreSQL-native driver.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Negative / trade-offs:&amp;#039;&amp;#039;&amp;#039; - GixSQL-specific connection string prefix (&amp;lt;code&amp;gt;pgsql://&amp;lt;/code&amp;gt;) and runtime library are not portable to other COBOL SQL pre-processors. - GixSQL is not part of the GnuCOBOL distribution; must be installed separately.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
All SQL pre-processing must be done through GixSQL. Verify no raw &amp;lt;code&amp;gt;CALL &amp;amp;quot;GIXSQLExec&amp;amp;quot;&amp;lt;/code&amp;gt; statements appear in handwritten source (only in generated &amp;lt;code&amp;gt;.out&amp;lt;/code&amp;gt; files).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-005-copybooks-as-interface-contracts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. ADR-005 — Copybooks as Interface Contracts ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deciders:&amp;#039;&amp;#039;&amp;#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; [INFERRED from copybook design]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
In a multi-program COBOL system, data shared between programs can be defined redundantly in each program’s WORKING-STORAGE, or defined once in a copybook included by all parties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Define each tier’s control block once in a copybook (&amp;lt;code&amp;gt;primes-session.cpy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primes-dal.cpy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;primes-ui.cpy&amp;lt;/code&amp;gt;) and COPY it into both the caller’s WORKING-STORAGE and the callee’s LINKAGE SECTION. The copybook is the published interface; changing it is a breaking change affecting all users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Positive:&amp;#039;&amp;#039;&amp;#039; - Single source of truth for each interface. - Field layout guaranteed to match between caller and callee.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Negative / trade-offs:&amp;#039;&amp;#039;&amp;#039; - Any field size change in a copybook requires recompiling every program that includes it. - Two nearly-identical host-variable copybooks exist (&amp;lt;code&amp;gt;primes-table.cpy&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;primes_table.cpy&amp;lt;/code&amp;gt;) — the canonical version must be designated and the other retired.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;grep -r &amp;amp;quot;COPY primes-dal&amp;amp;quot; *.cbl&amp;lt;/code&amp;gt; — should list only &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt; (caller) and &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; (callee).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-006-hard-coded-database-credentials&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. ADR-006 — Hard-Coded Database Credentials ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Accepted (as technical debt — see note)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deciders:&amp;#039;&amp;#039;&amp;#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; [CONFIRMED — visible in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; lines 14–17]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
Database credentials must be provided to the GixSQL CONNECT call. Options include hard-coding, environment variables, a configuration file, or a secrets manager.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Credentials are hard-coded in WORKING-STORAGE of &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; as a pragmatic choice for a demonstration application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;⚠ &amp;#039;&amp;#039;&amp;#039;Technical debt note:&amp;#039;&amp;#039;&amp;#039; This decision is explicitly acknowledged as a security defect (NFR-SEC-01). It is documented here so that the decision is visible and the remediation can be tracked. It must not be carried forward to a production deployment.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;recommended-remediation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Recommended remediation ===&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;code&amp;gt;DBUSR&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DBPWD&amp;lt;/code&amp;gt; VALUE clauses with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cobol&amp;quot;&amp;gt;ACCEPT DBUSR FROM ENVIRONMENT &amp;quot;PRIMES_DB_USER&amp;quot;&lt;br /&gt;
ACCEPT DBPWD FROM ENVIRONMENT &amp;quot;PRIMES_DB_PASS&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or read from a protected configuration file at startup.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Negative:&amp;#039;&amp;#039;&amp;#039; - Credential rotation requires recompilation and redeployment. - Credentials are visible in the binary and in any version-control history. - Violates NFR-SEC-01 and OWASP Secure Coding Practice #3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-007-no-explicit-commit-on-insert&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. ADR-007 — No Explicit COMMIT on INSERT ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Accepted (status uncertain — see note)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deciders:&amp;#039;&amp;#039;&amp;#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; [INFERRED — COMMIT statement is commented out in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; r83-write-prime]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-6&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
The INSERT in &amp;lt;code&amp;gt;r83-write-prime&amp;lt;/code&amp;gt; does not issue an explicit COMMIT. The commented-out COMMIT suggests this was a deliberate choice or a deferred decision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-6&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Rely on PostgreSQL’s default auto-commit behaviour for individual INSERT statements outside an explicit transaction. The COMMIT is not needed because each INSERT auto-commits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;⚠ &amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; The report path opens an explicit transaction (&amp;lt;code&amp;gt;START TRANSACTION&amp;lt;/code&amp;gt;) via &amp;lt;code&amp;gt;s01-cursor&amp;lt;/code&amp;gt;. If the generate path is ever run while a transaction is open (e.g. if the session management is changed), the INSERTs will not auto-commit. This is a latent risk.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-6&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Positive:&amp;#039;&amp;#039;&amp;#039; - Simpler code; no COMMIT overhead per row.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Risks:&amp;#039;&amp;#039;&amp;#039; - If a transaction is ever opened on the &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; connection before &amp;lt;code&amp;gt;r83-write-prime&amp;lt;/code&amp;gt;, the INSERTs will not be committed until an explicit COMMIT or ROLLBACK, and data will be lost on failure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adr-008-odd-only-sieve-starting-at-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. ADR-008 — Odd-Only Sieve Starting at 3 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2025 (inferred)&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Accepted&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Deciders:&amp;#039;&amp;#039;&amp;#039; Original developer&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; [CONFIRMED — ADD 2 TO test-number in r82-next-test-number; initial value 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;context-7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Context ===&lt;br /&gt;
&lt;br /&gt;
The sieve must test whether each integer is prime. Testing every integer (2, 3, 4, 5 …) is correct but wasteful: all even numbers greater than 2 are composite and need not be tested.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;decision-7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Decision ===&lt;br /&gt;
&lt;br /&gt;
Start the candidate at 3 and advance by 2 (ADD 2 TO test-number), testing only odd integers. Prime 2 is handled as a manual seed rather than by the algorithm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;consequences-7&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Consequences ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Positive:&amp;#039;&amp;#039;&amp;#039; - Roughly halves the number of candidates that must be tested, improving performance.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Negative / trade-offs:&amp;#039;&amp;#039;&amp;#039; - Prime 2 must be manually seeded in the database before the algorithm runs (see Assumption A-01). This is an external dependency on an operational step, not a code-enforced constraint.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;compliance-check-5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Compliance check ===&lt;br /&gt;
&lt;br /&gt;
Verify &amp;lt;code&amp;gt;test-number&amp;lt;/code&amp;gt; is initialised to 3 (odd) and that only &amp;lt;code&amp;gt;ADD 2 TO test-number&amp;lt;/code&amp;gt; (never ADD 1) advances the candidate in &amp;lt;code&amp;gt;r82-next-test-number&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;open-issues&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 10. Open Issues ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Issue&lt;br /&gt;
!width=&amp;quot;18%&amp;quot;| Owner&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Target&lt;br /&gt;
!width=&amp;quot;21%&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
| OI-01&lt;br /&gt;
| All ADRs marked [INFERRED] need confirmation from original developer&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-02&lt;br /&gt;
| ADR-006 remediation (credentials) has no target date&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-03&lt;br /&gt;
| ADR-007 (no COMMIT) — confirm the intent is auto-commit, not an oversight&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-04&lt;br /&gt;
| Duplicate copybooks (ADR-005) — designate canonical version and retire the other&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
Terug naar: [[Design standards]] | [[Cobol and PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>