<?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=Business-Requirements</id>
	<title>Business-Requirements - 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=Business-Requirements"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Business-Requirements&amp;action=history"/>
	<updated>2026-09-11T02:06: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=Business-Requirements&amp;diff=4697&amp;oldid=prev</id>
		<title>Martin at 21:26, 24 March 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Business-Requirements&amp;diff=4697&amp;oldid=prev"/>
		<updated>2026-03-24T21:26:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:26, 24 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 4:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 4:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Document ID:&#039;&#039;&#039; PGCBL-BRD-001 · &#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 · &#039;&#039;&#039;Status:&#039;&#039;&#039; Approved · &#039;&#039;&#039;Last updated:&#039;&#039;&#039; 2026-03-17&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Document ID:&#039;&#039;&#039; PGCBL-BRD-001 · &#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 · &#039;&#039;&#039;Status:&#039;&#039;&#039; Approved · &#039;&#039;&#039;Last updated:&#039;&#039;&#039; 2026-03-17&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;← [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Home&lt;/del&gt;]]&#039;&#039;&#039; | [[Technical-Specification|Technical Specification →]]&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;← [[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Primes system Design&lt;/ins&gt;]]&#039;&#039;&#039; | [[Technical-Specification|Technical Specification →]]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;!-- diff cache key mediawiki-mediawiki-:diff:wikidiff2:1.12:old-4696:rev-4697:1.13.0 --&gt;
&lt;/table&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://wiki.webhuis.nl:443/index.php?title=Business-Requirements&amp;diff=4696&amp;oldid=prev</id>
		<title>Martin: Created page with &quot;&lt;span id=&quot;business-requirements&quot;&gt;&lt;/span&gt; = Business Requirements =  &lt;blockquote&gt;&#039;&#039;&#039;Document ID:&#039;&#039;&#039; PGCBL-BRD-001 · &#039;&#039;&#039;Version:&#039;&#039;&#039; 1.0 · &#039;&#039;&#039;Status:&#039;&#039;&#039; Approved · &#039;&#039;&#039;Last updated:&#039;&#039;&#039; 2026-03-17 &lt;/blockquote&gt; &#039;&#039;&#039;← Home&#039;&#039;&#039; | Technical Specification →   -----  &lt;span id=&quot;contents&quot;&gt;&lt;/span&gt; == Contents ==  # Business Objective # Stakeholders # #3-functional-requirements|Functional Requirements...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Business-Requirements&amp;diff=4696&amp;oldid=prev"/>
		<updated>2026-03-24T21:24:44Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;span id=&amp;quot;business-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Business Requirements =  &amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Document ID:&amp;#039;&amp;#039;&amp;#039; PGCBL-BRD-001 · &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0 · &amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Approved · &amp;#039;&amp;#039;&amp;#039;Last updated:&amp;#039;&amp;#039;&amp;#039; 2026-03-17 &amp;lt;/blockquote&amp;gt; &amp;#039;&amp;#039;&amp;#039;← &lt;a href=&quot;/index.php?title=Home&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Home (page does not exist)&quot;&gt;Home&lt;/a&gt;&amp;#039;&amp;#039;&amp;#039; | &lt;a href=&quot;/index.php?title=Technical-Specification&quot; title=&quot;Technical-Specification&quot;&gt;Technical Specification →&lt;/a&gt;   -----  &amp;lt;span id=&amp;quot;contents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == Contents ==  # &lt;a href=&quot;#1-business-objective&quot;&gt;Business Objective&lt;/a&gt; # &lt;a href=&quot;#2-stakeholders&quot;&gt;Stakeholders&lt;/a&gt; # #3-functional-requirements|Functional Requirements...&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;business-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Business Requirements =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Document ID:&amp;#039;&amp;#039;&amp;#039; PGCBL-BRD-001 · &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0 · &amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Approved · &amp;#039;&amp;#039;&amp;#039;Last updated:&amp;#039;&amp;#039;&amp;#039; 2026-03-17&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;← [[Home]]&amp;#039;&amp;#039;&amp;#039; | [[Technical-Specification|Technical Specification →]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;contents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Contents ==&lt;br /&gt;
&lt;br /&gt;
# [[#1-business-objective|Business Objective]]&lt;br /&gt;
# [[#2-stakeholders|Stakeholders]]&lt;br /&gt;
# [[#3-functional-requirements|Functional Requirements]]&lt;br /&gt;
#* [[#fr-01--prime-generation|FR-01 Prime Generation]]&lt;br /&gt;
#* [[#fr-02--trial-division-algorithm|FR-02 Trial-Division Algorithm]]&lt;br /&gt;
#* [[#fr-03--prime-reporting|FR-03 Prime Reporting]]&lt;br /&gt;
#* [[#fr-04--print-report-format|FR-04 Print Report Format]]&lt;br /&gt;
#* [[#fr-05--operational-logging|FR-05 Operational Logging]]&lt;br /&gt;
#* [[#fr-06--error-handling|FR-06 Error Handling]]&lt;br /&gt;
# [[#4-non-functional-requirements|Non-Functional Requirements]]&lt;br /&gt;
# [[#5-constraints|Constraints]]&lt;br /&gt;
# [[#6-out-of-scope|Out of Scope]]&lt;br /&gt;
# [[#7-traceability|Traceability]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;business-objective&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Business Objective ==&lt;br /&gt;
&lt;br /&gt;
The system must generate and persistently store the complete sequence of prime numbers from 3 up to 999,999,999, and produce a paginated formatted print report of all stored primes on demand.&lt;br /&gt;
&lt;br /&gt;
It demonstrates a &amp;#039;&amp;#039;&amp;#039;three-tier COBOL architecture&amp;#039;&amp;#039;&amp;#039; on Linux with a PostgreSQL back-end:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Tier&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Program&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| Orchestrator&lt;br /&gt;
| &amp;lt;code&amp;gt;primesmain&amp;lt;/code&amp;gt;&lt;br /&gt;
| Command-line routing, session lifecycle&lt;br /&gt;
|-&lt;br /&gt;
| Business Logic&lt;br /&gt;
| &amp;lt;code&amp;gt;primesgen&amp;lt;/code&amp;gt;&lt;br /&gt;
| Sieve algorithm, report cursor loop&lt;br /&gt;
|-&lt;br /&gt;
| Data Access&lt;br /&gt;
| &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
| All SQL via GixSQL&lt;br /&gt;
|-&lt;br /&gt;
| Presentation&lt;br /&gt;
| &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt;&lt;br /&gt;
| Print file, console logging&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See [[Technical-Specification#1-system-architecture|Technical Specification → Architecture]] for the component diagram.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;stakeholders&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Stakeholders ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Role&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Interest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;System operator&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Runs generation and reporting jobs from the command line; reads console output&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Database administrator&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Owns the PostgreSQL &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt; schema; manages credentials and data&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Report consumer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Receives and reads the formatted print file &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;functional-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-01-prime-generation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-01 — Prime Generation ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Requirement&lt;br /&gt;
|-&lt;br /&gt;
| FR-01-a&lt;br /&gt;
| The system shall accept a &amp;lt;code&amp;gt;generate&amp;lt;/code&amp;gt; command-line argument to trigger prime-number generation.&lt;br /&gt;
|-&lt;br /&gt;
| FR-01-b&lt;br /&gt;
| The system shall test every odd integer from 3 upward for primality using trial division.&lt;br /&gt;
|-&lt;br /&gt;
| FR-01-c&lt;br /&gt;
| The system shall store each confirmed prime in the database in ascending order of discovery.&lt;br /&gt;
|-&lt;br /&gt;
| FR-01-d&lt;br /&gt;
| Generation shall continue until the candidate number reaches 999,999,999.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;⚠ &amp;#039;&amp;#039;&amp;#039;Defect T1:&amp;#039;&amp;#039;&amp;#039; The PERFORM that invokes the sieve loop is commented out in &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt; line 51. This requirement is &amp;#039;&amp;#039;&amp;#039;not currently met&amp;#039;&amp;#039;&amp;#039; by the shipped source. See [[Technical-Specification#7-known-technical-issues|Technical Specification → Defect Register]].&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-02-trial-division-algorithm&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-02 — Trial-Division Algorithm ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Requirement&lt;br /&gt;
|-&lt;br /&gt;
| FR-02-a&lt;br /&gt;
| For each candidate number N, the system shall divide N by each known prime p where p ≤ √N.&lt;br /&gt;
|-&lt;br /&gt;
| FR-02-b&lt;br /&gt;
| If any p divides N exactly (remainder = 0), N is composite and shall not be stored.&lt;br /&gt;
|-&lt;br /&gt;
| FR-02-c&lt;br /&gt;
| If no such p exists, N is confirmed prime and shall be persisted.&lt;br /&gt;
|-&lt;br /&gt;
| FR-02-d&lt;br /&gt;
| Trial divisors shall be read from the database in identity sequence order.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The algorithm implementation lives in &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt; paragraphs &amp;lt;code&amp;gt;r80-test-number&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;r89-get-next-divider&amp;lt;/code&amp;gt;. See [[Flow-Diagrams#3-prime-generation-sieve-loop|Flow Diagrams → Sieve Loop]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-03-prime-reporting&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-03 — Prime Reporting ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Requirement&lt;br /&gt;
|-&lt;br /&gt;
| FR-03-a&lt;br /&gt;
| The system shall accept a &amp;lt;code&amp;gt;report&amp;lt;/code&amp;gt; command-line argument to trigger report generation.&lt;br /&gt;
|-&lt;br /&gt;
| FR-03-b&lt;br /&gt;
| The system shall read all stored primes from the database in sequence order.&lt;br /&gt;
|-&lt;br /&gt;
| FR-03-c&lt;br /&gt;
| The system shall write a paginated, formatted print file containing all stored primes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The report loop lives in &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt; paragraphs &amp;lt;code&amp;gt;r90-start-primes-report&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;r86-report-primes&amp;lt;/code&amp;gt;. See [[Flow-Diagrams#4-prime-report-loop|Flow Diagrams → Report Loop]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-04-print-report-format&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-04 — Print Report Format ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Requirement&lt;br /&gt;
|-&lt;br /&gt;
| FR-04-a&lt;br /&gt;
| The report shall carry the heading &amp;lt;code&amp;gt;&amp;amp;quot;primes overview&amp;amp;quot;&amp;lt;/code&amp;gt; on every page.&lt;br /&gt;
|-&lt;br /&gt;
| FR-04-b&lt;br /&gt;
| A column header row (&amp;lt;code&amp;gt;&amp;amp;quot;Sequence  Prime&amp;amp;quot;&amp;lt;/code&amp;gt; × 6) shall follow the heading on every page.&lt;br /&gt;
|-&lt;br /&gt;
| FR-04-c&lt;br /&gt;
| Each data line shall display &amp;#039;&amp;#039;&amp;#039;six&amp;#039;&amp;#039;&amp;#039; prime entries side by side — sequence number and prime value.&lt;br /&gt;
|-&lt;br /&gt;
| FR-04-d&lt;br /&gt;
| Each page shall carry a right-aligned page-number footer (&amp;lt;code&amp;gt;page: ZZZZ9&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| FR-04-e&lt;br /&gt;
| The print record width shall be exactly &amp;#039;&amp;#039;&amp;#039;132 characters&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| FR-04-f&lt;br /&gt;
| The print file shall be named &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; and written to the working directory.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Print formatting is implemented entirely in &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;. See [[Technical-Specification#6-file-io-specification|Technical Specification → File I/O Specification]] for the full record layout.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Print record layout (one data line):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│ Z(9) sp sp │ Z(9) sp sp │ Z(9) sp sp │ Z(9) sp sp │ Z(9) sp sp │ Z(9) sp sp │&lt;br /&gt;
│  seq 1     │  prime 1   │  seq 2     │  prime 2   │  seq 3     │  prime 3   │ … × 6&lt;br /&gt;
│  11 chars  │  11 chars  │  11 chars  │  11 chars  │  11 chars  │  11 chars  │&lt;br /&gt;
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
  Each cell = 9 (value) + 2 (separator) = 11 chars × 6 entries = 66 chars of data + 66 chars padding = 132 total&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Each cell in &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt; is actually &amp;lt;code&amp;gt;Z(9) + X(2) + Z(9) + X(2)&amp;lt;/code&amp;gt; = 22 chars × 6 = 132.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fr-05-operational-logging&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-05 — Operational Logging ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Requirement&lt;br /&gt;
|-&lt;br /&gt;
| FR-05-a&lt;br /&gt;
| The system shall write progress and status messages to the system console throughout execution.&lt;br /&gt;
|-&lt;br /&gt;
| FR-05-b&lt;br /&gt;
| Each structured message shall identify the issuing &amp;#039;&amp;#039;&amp;#039;program name&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;paragraph name&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| FR-05-c&lt;br /&gt;
| Significant events shall be logged: session start/stop, DB connect/disconnect, cursor open, first fetch, fetch errors, print file open/close.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Logging is routed through &amp;lt;code&amp;gt;primesui&amp;lt;/code&amp;gt; paragraph &amp;lt;code&amp;gt;r98-message-ui&amp;lt;/code&amp;gt; using the &amp;lt;code&amp;gt;process-message&amp;lt;/code&amp;gt; group in [[Data-Dictionary#13-primes-ui|&amp;lt;code&amp;gt;primes-ui&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;fr-06-error-handling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== FR-06 — Error Handling ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Requirement&lt;br /&gt;
|-&lt;br /&gt;
| FR-06-a&lt;br /&gt;
| An unrecognised command-line argument shall cause the system to log an error and stop cleanly.&lt;br /&gt;
|-&lt;br /&gt;
| FR-06-b&lt;br /&gt;
| Failure to open the print file shall cause the system to log an error and stop.&lt;br /&gt;
|-&lt;br /&gt;
| FR-06-c&lt;br /&gt;
| A database connection failure shall cause the system to log an error and set &amp;lt;code&amp;gt;session-result = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| FR-06-d&lt;br /&gt;
| A cursor open failure shall cause the system to log an error and set &amp;lt;code&amp;gt;session-result = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| FR-06-e&lt;br /&gt;
| A fetch failure shall cause the system to log an error and terminate the fetch loop.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;non-functional-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Non-Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Category&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Requirement&lt;br /&gt;
|-&lt;br /&gt;
| NFR-01&lt;br /&gt;
| Platform&lt;br /&gt;
| Must run on Linux using GnuCOBOL 4.0&lt;br /&gt;
|-&lt;br /&gt;
| NFR-02&lt;br /&gt;
| Database&lt;br /&gt;
| Must connect to PostgreSQL 11+ at &amp;lt;code&amp;gt;localhost:5432&amp;lt;/code&amp;gt;, database &amp;lt;code&amp;gt;primes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NFR-03&lt;br /&gt;
| Persistence&lt;br /&gt;
| Generated primes must survive program termination&lt;br /&gt;
|-&lt;br /&gt;
| NFR-04&lt;br /&gt;
| Restartability&lt;br /&gt;
| Running &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; must produce a clean, empty database state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;constraints&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Constraints ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| ID&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Constraint&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Source&lt;br /&gt;
|-&lt;br /&gt;
| C-01&lt;br /&gt;
| Upper generation bound is fixed at &amp;#039;&amp;#039;&amp;#039;999,999,999&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Hard-coded in &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| C-02&lt;br /&gt;
| Database credentials are hard-coded&lt;br /&gt;
| &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; WORKING-STORAGE — technical debt&lt;br /&gt;
|-&lt;br /&gt;
| C-03&lt;br /&gt;
| Single-user batch execution only&lt;br /&gt;
| Architecture; no concurrency controls&lt;br /&gt;
|-&lt;br /&gt;
| C-04&lt;br /&gt;
| Generate and report are mutually exclusive per invocation&lt;br /&gt;
| &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt; EVALUATE structure&lt;br /&gt;
|-&lt;br /&gt;
| C-05&lt;br /&gt;
| Prime 2 must be manually seeded before a generation run&lt;br /&gt;
| Algorithm limitation; sieve starts at 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;out-of-scope&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Out of Scope ==&lt;br /&gt;
&lt;br /&gt;
* Interactive or web-based user interfaces&lt;br /&gt;
* Concurrent or distributed execution&lt;br /&gt;
* Primes above 999,999,999&lt;br /&gt;
* Generation algorithms other than trial division&lt;br /&gt;
* Checkpoint / restart for interrupted generation runs&lt;br /&gt;
* Encryption or secure credential handling (in this version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;traceability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Traceability ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Requirement&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Design element&lt;br /&gt;
!width=&amp;quot;33%&amp;quot;| Flow diagram&lt;br /&gt;
|-&lt;br /&gt;
| FR-01, FR-02&lt;br /&gt;
| &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt; r80–r89; &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; r83, r81&lt;br /&gt;
| [[Flow-Diagrams#3-prime-generation-sieve-loop|Sieve Loop]] · [[Flow-Diagrams#7-inter-program-call-sequence--generate-run|Generate Sequence]]&lt;br /&gt;
|-&lt;br /&gt;
| FR-03&lt;br /&gt;
| &amp;lt;code&amp;gt;primesgen.cbl&amp;lt;/code&amp;gt; r86, r90, r94; &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; s01, s02&lt;br /&gt;
| [[Flow-Diagrams#4-prime-report-loop|Report Loop]] · [[Flow-Diagrams#8-inter-program-call-sequence--report-run|Report Sequence]]&lt;br /&gt;
|-&lt;br /&gt;
| FR-04&lt;br /&gt;
| &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt; r90–r94&lt;br /&gt;
| [[Flow-Diagrams#6-ui-primesui-method-dispatch|UI Dispatch]]&lt;br /&gt;
|-&lt;br /&gt;
| FR-05&lt;br /&gt;
| &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt; r98; &amp;lt;code&amp;gt;primes-ui.cpy&amp;lt;/code&amp;gt; process-message&lt;br /&gt;
| [[Data-Dictionary#13-primes-ui|Data Dictionary — primes-ui]]&lt;br /&gt;
|-&lt;br /&gt;
| FR-06&lt;br /&gt;
| &amp;lt;code&amp;gt;primesmain.cbl&amp;lt;/code&amp;gt; WHEN OTHER; all result-code checks&lt;br /&gt;
| [[Flow-Diagrams#1-top-level-application-flow|Top-Level Flow]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;← [[Home]]&amp;#039;&amp;#039;&amp;#039; | [[Technical-Specification|Technical Specification →]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>