<?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=Non-Functional_Requirements</id>
	<title>Non-Functional 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=Non-Functional_Requirements"/>
	<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Non-Functional_Requirements&amp;action=history"/>
	<updated>2026-09-11T05:42:48Z</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=Non-Functional_Requirements&amp;diff=4753&amp;oldid=prev</id>
		<title>Martin: Created page with &quot;&lt;span id=&quot;non-functional-requirements&quot;&gt;&lt;/span&gt; = Non-Functional Requirements =  {| !width=&quot;23%&quot;| Field !width=&quot;76%&quot;| Value |- | Document ID | PGCBL-NFR-001 |- | Document Type | Non-Functional Requirements |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Draft — performance and security targets require stakeholder input |- | Owner | Lead Developer / Architect |- | Author | [reverse-engineered; targets are best-practice defaults w...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.webhuis.nl:443/index.php?title=Non-Functional_Requirements&amp;diff=4753&amp;oldid=prev"/>
		<updated>2026-03-25T15:30:24Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;span id=&amp;quot;non-functional-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Non-Functional Requirements =  {| !width=&amp;quot;23%&amp;quot;| Field !width=&amp;quot;76%&amp;quot;| Value |- | Document ID | PGCBL-NFR-001 |- | Document Type | Non-Functional Requirements |- | System | pgcobol — Prime Numbers Application v1.0 |- | Version | 1.0 |- | Status | Draft — performance and security targets require stakeholder input |- | Owner | Lead Developer / Architect |- | Author | [reverse-engineered; targets are best-practice defaults w...&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;non-functional-requirements&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Non-Functional Requirements =&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-NFR-001&lt;br /&gt;
|-&lt;br /&gt;
| Document Type&lt;br /&gt;
| Non-Functional Requirements&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 — performance and security targets require stakeholder input&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; targets are best-practice defaults where not specified in source]&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-BRD-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;
| Initial draft from source analysis and best-practice defaults&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-taxonomy|Purpose and Taxonomy]]&lt;br /&gt;
# [[#2-performance|Performance]]&lt;br /&gt;
# [[#3-reliability-and-availability|Reliability and Availability]]&lt;br /&gt;
# [[#4-security|Security]]&lt;br /&gt;
# [[#5-maintainability|Maintainability]]&lt;br /&gt;
# [[#6-portability-and-compatibility|Portability and Compatibility]]&lt;br /&gt;
# [[#7-operability|Operability]]&lt;br /&gt;
# [[#8-auditability-and-compliance|Auditability and Compliance]]&lt;br /&gt;
# [[#9-recoverability|Recoverability]]&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-taxonomy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1. Purpose and Taxonomy ==&lt;br /&gt;
&lt;br /&gt;
Non-functional requirements (NFRs) specify &amp;#039;&amp;#039;&amp;#039;how well&amp;#039;&amp;#039;&amp;#039; the system must do things, as opposed to &amp;#039;&amp;#039;&amp;#039;what&amp;#039;&amp;#039;&amp;#039; it must do (functional requirements). They are the quality attributes of the system.&lt;br /&gt;
&lt;br /&gt;
This document uses the &amp;#039;&amp;#039;&amp;#039;ISO/IEC 25010:2011 (SQuaRE)&amp;#039;&amp;#039;&amp;#039; quality model as its taxonomy. Each NFR is assigned a category from that model:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| ISO 25010 Category&lt;br /&gt;
!width=&amp;quot;50%&amp;quot;| Subcategories&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Performance efficiency&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Time behaviour, resource utilisation, capacity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Reliability&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Maturity, availability, fault tolerance, recoverability&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Security&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Confidentiality, integrity, non-repudiation, accountability, authenticity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Maintainability&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Modularity, reusability, analysability, modifiability, testability&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Portability&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Adaptability, installability, replaceability&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Operability&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Appropriateness recognisability, learnability, user error protection&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Compatibility&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Co-existence, interoperability&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each NFR entry follows this format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;NFR-&amp;amp;lt;category&amp;amp;gt;-&amp;amp;lt;NN&amp;amp;gt;&lt;br /&gt;
  Requirement:   &amp;amp;lt;measurable statement of what is required&amp;amp;gt;&lt;br /&gt;
  Rationale:     &amp;amp;lt;why this matters&amp;amp;gt;&lt;br /&gt;
  Test approach: &amp;amp;lt;how it will be verified&amp;amp;gt;&lt;br /&gt;
  Priority:      Must Have | Should Have | Nice to Have&lt;br /&gt;
  Source:        &amp;amp;lt;observed in code / stakeholder input / best-practice default&amp;amp;gt;&lt;br /&gt;
  Status:        [CONFIRMED] | [UNCONFIRMED — needs stakeholder sign-off]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;performance&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2. Performance ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-perf-01-generation-throughput&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PERF-01 — Generation throughput ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; The system should generate and insert at least 1,000 primes per second under normal operating conditions (single-user, unloaded PostgreSQL on localhost).&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; There are approximately 50 million primes below 10^9. Without a throughput target the system may be functionally correct but practically unusable.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Time a generation run of the first 10,000 primes; divide by elapsed seconds.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Best-practice default [UNCONFIRMED — no target specified in source]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Open — target must be agreed with the system owner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-perf-02-report-generation-time&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PERF-02 — Report generation time ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; A report covering up to 1 million stored primes should complete within 5 minutes.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; A batch report that runs overnight is operationally acceptable; one that runs for days is not.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Seed 1,000,000 rows; time a full report run.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Best-practice default [UNCONFIRMED]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Open.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-perf-03-database-query-response&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PERF-03 — Database query response ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; The &amp;lt;code&amp;gt;SELECT prime WHERE ident = :n&amp;lt;/code&amp;gt; divider lookup should return in under 50 ms at any point in the generation run.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; This query is called once per trial division step; if it is slow, the entire sieve is slow.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Run EXPLAIN ANALYZE on the query with a populated table; check absence of sequential scan on &amp;lt;code&amp;gt;primes.primes&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Algorithm design analysis&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Open — 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;; a sequential scan is likely. This is a defect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;reliability-and-availability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. Reliability and Availability ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rel-01-batch-completion&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REL-01 — Batch completion ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; A generation or report run, once started on a healthy system, should complete without manual intervention.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Batch jobs that require operator interaction to proceed are unreliable.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Run end-to-end generation and report on a healthy environment; observe for any interactive prompts or hangs.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Standard batch computing requirement&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [CONFIRMED by design — no interactive prompts in the code]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rel-02-graceful-failure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REL-02 — Graceful failure ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; On any database error, the system shall log a descriptive message, set an error code, and exit cleanly (closing the database connection and print file) rather than abending.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; An abend may leave the database connection open or the print file in an inconsistent state.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Simulate a database failure mid-run (e.g. kill the PostgreSQL process); verify clean exit and closed resources.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Observed in source; partial — cleanup paragraphs exist but error propagation is incomplete (see PGCBL-IOB-001 D-RPT-01).&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Partially met; D-RPT-01 is an open defect.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rel-03-idempotent-reset&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REL-03 — Idempotent reset ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; Running &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; shall always produce a clean, empty, ready-to-use database state regardless of the prior state of the database.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Developers and operators must be able to reset state reliably between test runs.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Run the reset script three times consecutively; verify the same clean state each time.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; uses &amp;lt;code&amp;gt;DROP … CASCADE&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;CREATE&amp;lt;/code&amp;gt;; this is correct.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [CONFIRMED by SQL analysis]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;security&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 4. Security ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-sec-01-credential-storage&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-SEC-01 — Credential storage ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; Database credentials shall not be stored in plain text within compiled program source code.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Credentials in source code are exposed to anyone who can read the binary, the source, or the version-control history.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Inspect all &amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt; files for hard-coded user names and passwords; verify none are present.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; OWASP Secure Coding Practice #3 — Credential Management&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;NOT MET&amp;#039;&amp;#039;&amp;#039; — &amp;lt;code&amp;gt;DBUSR&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DBPWD&amp;lt;/code&amp;gt; are hard-coded in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; WORKING-STORAGE. Remediation: use environment variables or a secrets manager.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-sec-02-principle-of-least-privilege&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-SEC-02 — Principle of least privilege ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; The database user &amp;lt;code&amp;gt;primes_user&amp;lt;/code&amp;gt; shall have only the minimum privileges required: INSERT and SELECT on &amp;lt;code&amp;gt;primes.primes&amp;lt;/code&amp;gt;, USAGE on &amp;lt;code&amp;gt;primes.asc_ident&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; If the application account is compromised, the attacker cannot drop tables, access other schemas, or escalate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Review PostgreSQL privilege grants; attempt a DROP TABLE as &amp;lt;code&amp;gt;primes_user&amp;lt;/code&amp;gt; and verify it is denied.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; CIS PostgreSQL Benchmark, control 6.1&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [UNCONFIRMED — not specified in &amp;lt;code&amp;gt;primes_schema.sql&amp;lt;/code&amp;gt;; only ownership is set]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-sec-03-output-file-permissions&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-SEC-03 — Output file permissions ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; shall be readable only by the operator user and the intended report consumer; it shall not be world-readable.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Prime numbers are not sensitive, but the file permissions standard is a good habit and should be enforced as a baseline.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Check umask of the running process; verify &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt; permissions after creation.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Nice to Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Best-practice default&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [UNCONFIRMED]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;maintainability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 5. Maintainability ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-main-01-three-tier-separation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-MAIN-01 — Three-tier separation ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; No SQL shall appear outside &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt;. No file I/O (other than console DISPLAY) shall appear outside &amp;lt;code&amp;gt;primesui.cbl&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Tier separation is the principal architectural rule of this system; violating it makes changes to one tier affect others.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Grep all &amp;lt;code&amp;gt;.cbl&amp;lt;/code&amp;gt; files for EXEC SQL and for SELECT/WRITE file statements; verify only the expected programs contain them.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Architecture design principle; observed and partially met (primesgen has an unused FD declaration — minor violation).&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Partially met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-main-02-copybook-as-interface-contract&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-MAIN-02 — Copybook as interface contract ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; Changes to any copybook must be reviewed for impact on all programs that COPY it before the change is applied.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Copybooks are shared; a field-size change in a copybook breaks every program that uses it without any compile-time warning in all cases.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Impact analysis process; verified by recompiling all programs after any copybook change.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Standard COBOL maintenance practice&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [CONFIRMED as a process requirement — no tooling enforcement in place]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-main-03-code-commentary&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-MAIN-03 — Code commentary ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; Every paragraph shall carry a comment line stating its purpose. Every EXEC SQL block shall carry a comment stating what it does and why.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Current source has minimal commentary; future maintainers depend on the specification documents, which is insufficient.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Code review checklist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; COBOL coding best practice&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;NOT MET&amp;#039;&amp;#039;&amp;#039; in current source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-main-04-testability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-MAIN-04 — Testability ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; Each tier (primesgen, primes, primesui) shall be callable in isolation with a synthetic control block, without requiring the full three-tier stack.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Unit testing individual tiers is only possible if they can be called with a test harness.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Write a minimal test driver for each program; verify it compiles and runs independently.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Testability principle; the method-dispatch pattern makes this achievable by design.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [UNCONFIRMED — no test harnesses exist]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;portability-and-compatibility&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 6. Portability and Compatibility ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-port-01-cobol-standard-compliance&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PORT-01 — COBOL standard compliance ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; Source code shall conform to COBOL 2002 (ISO 1989:2002) where GnuCOBOL extensions are not required, so that migration to a standard-compliant compiler is possible.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; GnuCOBOL 4.0-early-dev is a pre-release; the team should not depend on behaviours not in the standard.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Compile with &amp;lt;code&amp;gt;-std=cobol2002&amp;lt;/code&amp;gt; flag; resolve any warnings.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Best-practice default&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [UNCONFIRMED — not tested]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-port-02-postgresql-version-range&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-PORT-02 — PostgreSQL version range ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; The system shall operate correctly against PostgreSQL 11 through 16.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; PostgreSQL 11 is the minimum observed in the schema dump; operators may use a more recent version.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Run integration tests against PostgreSQL 11, 14, and 16.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Best-practice default&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [UNCONFIRMED]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;operability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 7. Operability ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-oper-01-console-log-completeness&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-OPER-01 — Console log completeness ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; Every significant state transition (session start/stop, DB connect/disconnect, first fetch, last fetch, error) shall produce a console log entry identifying the program name, paragraph, and a human-readable message.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Operators diagnosing failures need to reconstruct what happened from the console log alone.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Run both modes; verify all defined state transitions produce a log line.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Observed in source; partially met — direct DISPLAY statements in &amp;lt;code&amp;gt;primes.cbl&amp;lt;/code&amp;gt; bypass the structured log format.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Partially met.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-oper-02-return-code&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-OPER-02 — Return code ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; The process shall exit with return code 0 on success and non-zero on failure.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Job schedulers and shell scripts depend on process exit codes to detect failures.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Run with a bad argument; check &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt; in the shell.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; POSIX convention&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;NOT MET&amp;#039;&amp;#039;&amp;#039; — &amp;lt;code&amp;gt;STOP RUN&amp;lt;/code&amp;gt; in GnuCOBOL returns 0 regardless of the path taken unless &amp;lt;code&amp;gt;MOVE n TO RETURN-CODE&amp;lt;/code&amp;gt; is used; not present in current source.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;auditability-and-compliance&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 8. Auditability and Compliance ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-aud-01-run-log-retention&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-AUD-01 — Run log retention ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; Console output from each run should be captured and retained for at least 30 days.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Enables post-hoc investigation of incorrect results or failures.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Verify a shell wrapper redirects stdout/stderr to a dated log file.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Should Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Best-practice default&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [UNCONFIRMED — no wrapper script exists]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-aud-02-schema-change-control&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-AUD-02 — Schema change control ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; Changes to &amp;lt;code&amp;gt;primes_schema.sql&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; must be version-controlled and reviewed before deployment.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Schema changes can destroy data or break the application silently.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Verify files are under git; verify a change-review process exists.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; Standard DBA practice&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [UNCONFIRMED]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;recoverability&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 9. Recoverability ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rec-01-clean-restart-after-failure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REC-01 — Clean restart after failure ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; After any failure, it shall be possible to restore the system to a known clean state by running &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; and re-running the generation job.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; Without a clean-restart procedure, a failed run leaves the database in an unknown state.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Simulate a mid-run failure; run &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt;; run a full generation; verify correctness.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;reset-primes.sql&amp;lt;/code&amp;gt; provides this; it must be documented as the recovery procedure.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Script exists; recovery procedure not yet documented.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nfr-rec-02-no-partial-page-print-output&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NFR-REC-02 — No partial-page print output ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirement:&amp;#039;&amp;#039;&amp;#039; The report print file shall always end with a complete, flushed page — no partial lines or missing footings.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rationale:&amp;#039;&amp;#039;&amp;#039; A partial last page is confusing to report consumers.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Test approach:&amp;#039;&amp;#039;&amp;#039; Run a report with a number of primes that does not divide evenly by 6; inspect the last page of &amp;lt;code&amp;gt;primes.prt&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Priority:&amp;#039;&amp;#039;&amp;#039; Must Have&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;r99-stop-primesui&amp;lt;/code&amp;gt; flush loop — implemented.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; [CONFIRMED by code analysis]&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;
| NFR-PERF-01, 02, 03 targets not confirmed by stakeholder&lt;br /&gt;
| System owner&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-02&lt;br /&gt;
| NFR-SEC-01 (hard-coded credentials) is a defect; remediation plan needed&lt;br /&gt;
| Lead Dev&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-03&lt;br /&gt;
| NFR-OPER-02 (return code) not implemented; affects job scheduler integration&lt;br /&gt;
| Developer&lt;br /&gt;
| —&lt;br /&gt;
| Open&lt;br /&gt;
|-&lt;br /&gt;
| OI-04&lt;br /&gt;
| NFR-PERF-03: no index on &amp;lt;code&amp;gt;primes.ident&amp;lt;/code&amp;gt;; likely sequential scan — performance defect&lt;br /&gt;
| DBA&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>