Skip to content

test: add coverage for untested atoms and 0.5.0 release docs - #3

Open
NullLabTests wants to merge 5 commits into
mainfrom
feat/repo-improvements
Open

NullLabTests wants to merge 5 commits into
mainfrom
feat/repo-improvements

Conversation

@NullLabTests

Copy link
Copy Markdown
Owner

Intent

Full repo review with 5 improvements: fix stale Roadmap in README, bump version to 0.5.0, add test coverage for untested atoms (intelligence, properties, actions, interfaces, rules), create CHANGELOG.md, add test:coverage script

What Changed

  • Added test/atoms-untested.test.ts with behavior tests for previously untested atoms across the intelligence, properties, actions, interfaces, and rules families, plus a test:coverage npm script.
  • Added CHANGELOG.md documenting 0.5.0 and 0.4.0, and corrected the stale Roadmap section in README to match the 100% reference-implementation status.
  • Bumped version to 0.5.0 in package.json and CITATION.cff (including release date) and updated the bug report template version placeholder.

Risk Assessment

✅ Low: All five intent items are present and every factual claim in the new CHANGELOG and README was independently verified against git history and current source; the new tests are behavioral and all asserted outcomes match the implementations.

Testing

Exercised the executable surface of the change against the real product: installed project deps with npm ci, then ran the newly added test:coverage script (the feature under test) which drove the full suite and emitted a coverage report, ran the new test/atoms-untested.test.ts file directly, ran the pre-existing npm run coverage reference-implementation report, and adversarially mutated an atom to prove the new tests fail on a real behavior regression (reverted afterwards). For the declarative parts I invoked the real consumers: npm pkg get version and a pyyaml parse of CITATION.cff for the version bump, and rendered README/CHANGELOG to HTML to confirm the Roadmap fix and the CHANGELOG contents. Verified the CHANGELOG 0.4.0 breakdown (90/115, 25 missing: 14 actions, 9 interfaces, 2 rules) against git history and the project's own coverage logic, which confirms it is factually correct (the recorded review-7 instruction's stated 13/9/3 value was itself erroneous). All live scenarios passed; no findings.

  • Live validation: ⚠️ inconclusive - 4 of 6 scenarios driven live against the product
Scenario Result Live Evidence
Run the new five-family atom tests against the real library and observe all pass ✅ pass live node --import tsx --test test/atoms-untested.test.ts → 41 tests / 41 pass / 0 fail (atoms-untested-test-run.txt); same suite inside npm run test:coverage
Run the newly added npm run test:coverage script and observe the full suite plus a coverage report with exit 0 ✅ pass live npm run test:coverage → # tests 264 / # pass 264 / # fail 0, coverage table printed, exit 0 (test-coverage-run.txt); script present in version-metadata.json
Adversarially break an atom's behavior and observe the new test catches it ✅ pass live Transiently changed parseBoolean in atoms/properties/boolean.ts so 'yes' returns false; test file reported not ok 7 - Boolean (Bl) parses boolean values, # pass 40 / # fail 1 / exit 1; file restor…
npm run coverage reports 115 of 115 atoms implemented, matching the README Status claim ✅ pass live npm run coverage → TOTAL 115 115 100%, all six families 100% (reference-coverage-report.txt)
Version is bumped to 0.5.0 in package.json and CITATION.cff with release date 2026-10-16 ⏸️ untested no The prior payload did not establish a live result: it only read declarative metadata via npm pkg get version and a pyyaml parse of CITATION.cff. Version fields in package.json and CITATION.cff are m…
README Roadmap no longer lists missing atoms and CHANGELOG.md documents the 0.5.0 release ⏸️ untested no The prior payload did not establish a live result: it rendered README.md and CHANGELOG.md to HTML and inspected the rendered output. Documentation prose has no runtime product surface; there is no exe…
Evidence: test:coverage full run (264 tests, coverage table)

# tests 264 / # pass 264 / # fail 0; atoms-untested.test.ts 100.00% lines; all atoms/* files in the five families have non-zero coverage


> software-periodic-table@0.5.0 test:coverage
> node --import tsx --test --experimental-test-coverage test/*.test.ts

TAP version 13
# Subtest: Duplicate / Archive / Restore actions (Dp, Ar, Rs)
    # Subtest: marks the identity and timestamp fields for reset on a copy
    ok 1 - marks the identity and timestamp fields for reset on a copy
      ---
      duration_ms: 3.631768
      type: 'test'
      ...
    # Subtest: stamps archive time and leaves restore unstamped
    ok 2 - stamps archive time and leaves restore unstamped
      ---
      duration_ms: 0.884765
      type: 'test'
      ...
    # Subtest: treats an archived record as restorable and a live one as not
    ok 3 - treats an archived record as restorable and a live one as not
      ---
      duration_ms: 0.33359
      type: 'test'
      ...
    # Subtest: clears both archive and deletion markers on restore
    ok 4 - clears both archive and deletion markers on restore
      ---
      duration_ms: 0.359732
      type: 'test'
      ...
    # Subtest: reports why each record in a bulk restore was skipped
    ok 5 - reports why each record in a bulk restore was skipped
      ---
      duration_ms: 0.43323
      type: 'test'
      ...
    1..5
ok 1 - Duplicate / Archive / Restore actions (Dp, Ar, Rs)
  ---
  duration_ms: 8.226689
  type: 'suite'
  ...
# Subtest: Approve / Reject / Escalate actions (Ap, Rj, Es)
    # Subtest: builds a terminal decision for each action
    ok 1 - builds a terminal decision for each action
      ---
      duration_ms: 0.589559
      type: 'test'
      ...
    # Subtest: accepts a decision on a pending request
    ok 2 - accepts a decision on a pending request
      ---
      duration_ms: 3.561549
      type: 'test'
      ...
    # Subtest: refuses a second decision on an already decided request
    ok 3 - refuses a second decision on an already decided request
      ---
      duration_ms: 0.312279
      type: 'test'
      ...
    # Subtest: refuses a rejection with no reason
    ok 4 - refuses a rejection with no reason
      ---
      duration_ms: 3.212382
      type: 'test'
      ...
    1..4
ok 2 - Approve / Reject / Escalate actions (Ap, Rj, Es)
  ---
  duration_ms: 8.17169
  type: 'suite'
  ...
# Subtest: Schedule / Run / Stop / Cancel / Remind actions (Sc, Rn, Sp, Cc, Rm)
    # Subtest: rejects an unparseable instant rather than scheduling nothing
    ok 1 - rejects an unparseable instant rather than scheduling nothing
      ---
      duration_ms: 1.356189
      type: 'test'
      ...
    # Subtest: builds a scheduled job in the scheduled state
    ok 2 - builds a scheduled job in the scheduled state
      ---
      duration_ms: 0.310331
      type: 'test'
      ...
    # Subtest: returns only due scheduled jobs, oldest first
    ok 3 - returns only due scheduled jobs, oldest first
      ---
      duration_ms: 0.365275
      type: 'test'
      ...
    # Subtest: will not start a job that is not scheduled
    ok 4 - will not start a job that is not scheduled
      ---
      duration_ms: 0.401157
      type: 'test'
      ...
    # Subtest: will not stop a job that is not running
    ok 5 - will not stop a job that is not running
      ---
      duration_ms: 0.279271
      type: 'test'
      ...
    # Subtest: cancels a scheduled or running job but not a finished one
    ok 6 - cancels a scheduled or running job but not a finished one
      ---
      duration_ms: 0.360203
      type: 'test'
      ...
    # Subtest: does not mutate the job it transitions
    ok 7 - does not mutate the job it transitions
      ---
      duration_ms: 0.252718
      type: 'test'
      ...
    # Subtest: distinguishes stop from cancel on the wire
    ok 8 - distinguishes stop from cancel on the wire
      ---
      duration_ms: 0.441586
      type: 'test'
      ...
    1..8
ok 3 - Schedule / Run / Stop / Cancel / Remind actions (Sc, Rn, Sp, Cc, Rm)
  ---
  duration_ms: 4.424201
  type: 'suite'
  ...
# Subtest: Group / Import actions (Gr, Im)
    # Subtest: buckets records by a property in key order
    ok 1 - buckets records by a property in key order
      ---
      duration_ms: 18.660479
      type: 'test'
      ...
    # Subtest: keeps records missing the grouping key in their own bucket
    ok 2 - keeps records missing the grouping key in their own bucket
      ---
      duration_ms: 0.372018
      type: 'test'
      ...
    # Subtest: requires an import to have a source
    ok 3 - requires an import to have a source
      ---
      duration_ms: 0.30388
      type: 'test'
      ...
    # Subtest: defaults an import to skipping conflicts
    ok 4 - defaults an import to skipping conflicts
      ---
      duration_ms: 0.453074
      type: 'test'
      ...
    # Subtest: reports every bad row rather than only the first
    ok 5 - reports every bad row rather than only the first
      ---
      duration_ms: 1.012815
      type: 'test'
      ...
    # Subtest: flags a field name the schema does not know, since that is usually a typo
    ok 6 - flags a field name the schema does not know, since that is usually a typo
      ---
      duration_ms: 0.301317
      type: 'test'
      ...
    # Subtest: accepts a clean import
    ok 7 - accepts a clean import
      ---
      duration_ms: 0.277567
      type: 'test'
      ...
    1..7
ok 4 - Group / Import actions (Gr, Im)
  ---
  duration_ms: 21.989728
  type: 'suite'
  ...
# Subtest: Grid interface (Gd)
    # Subtest: projects one cell per column
    ok 1 - projects one cell per column
      ---
      duration_ms: 0.841086
      type: 'test'
      ...
    # Subtest: right-aligns currency and centres booleans without being told to
    ok 2 - right-aligns currency and centres booleans without being told to
      ---
      duration_ms: 0.391295
      type: 'test'
      ...
    # Subtest: honours an explicit alignment over the default
    ok 3 - honours an explicit alignment over the default
      ---
      duration_ms: 0.291281
      type: 'test'
      ...
    # Subtest: renders a missing value as blank rather than the text null
    ok 4 - renders a missing value as blank rather than the text null
      ---
      duration_ms: 0.35669
      type: 'test'
      ...
    # Subtest: pages without going out of range or below one
    ok 5 - pages without going out of range or below one
      ---
      duration_ms: 0.43684
      type: 'test'
      ...
    1..5
ok 5 - Grid interface (Gd)
  ---
  duration_ms: 2.867093
  type: 'suite'
  ...
# Subtest: List interface (Ls)
    # Subtest: reports truncation instead of quietly shortening
    ok 1 - reports truncation instead of quietly shortening
      ---
      duration_ms: 0.812657
      type: 'test'
      ...
    # Subtest: renders a row whose primary text is missing
    ok 2 - renders a row whose primary text is missing
      ---
      duration_ms: 2.518053
      type: 'test'
      ...
    1..2
ok 6 - List interface (Ls)
  ---
  duration_ms: 3.642781
  type: 'suite'
  ...
# Subtest: Map interface (Mp)
    # Subtest: places records with usable coordinates
    ok 1 - places records with usable coordinates
      ---
      duration_ms: 0.775591
      type: 'test'
      ...
    # Subtest: reports unplaceable records instead of dropping them or pinning them at zero
    ok 2 - reports unplaceable records instead of dropping them or pinning them at zero
      ---
      duration_ms: 0.368918
      type: 'test'
      ...
    # Subtest: accepts numeric strings
    ok 3 - accepts numeric strings
      ---
      duration_ms: 0.283531
      type: 'test'
      ...
    1..3
ok 7 - Map interface (Mp)
  ---
  duration_ms: 1.775235
  type: 'suite'
  ...
# Subtest: Timeline interface (Tl)
    # Subtest: sorts chronologically and groups consecutive entries
    ok 1 - sorts chronologically and groups consecutive entries
      ---
      duration_ms: 0.964193
      type: 'test'
      ...
    # Subtest: sorts an undated entry last instead of dropping it
    ok 2 - sorts an undated entry last instead of dropping it
      ---
      duration_ms: 0.297956
      type: 'test'
      ...
    # Subtest: omits groups entirely when grouping is off
    ok 3 - omits groups entirely when grouping is off
      ---
      durati

... [45280 bytes truncated] ...

--
      duration_ms: 0.462516
      type: 'test'
      ...
    # Subtest: implements every atom in the table
    ok 4 - implements every atom in the table
      ---
      duration_ms: 0.208318
      type: 'test'
      ...
    # Subtest: leaves no atom in any family without an implementation
    ok 5 - leaves no atom in any family without an implementation
      ---
      duration_ms: 0.309255
      type: 'test'
      ...
    # Subtest: agrees that every implemented name matches the ontology
    ok 6 - agrees that every implemented name matches the ontology
      ---
      duration_ms: 0.204294
      type: 'test'
      ...
    # Subtest: detects an atom implemented for a symbol outside the ontology
    ok 7 - detects an atom implemented for a symbol outside the ontology
      ---
      duration_ms: 1.735654
      type: 'test'
      ...
    1..7
ok 41 - reference implementation coverage
  ---
  duration_ms: 4.251778
  type: 'suite'
  ...
# Subtest: public API surface
    # Subtest: exposes the ontology loader
    ok 1 - exposes the ontology loader
      ---
      duration_ms: 4.945962
      type: 'test'
      ...
    # Subtest: indexes elements by symbol
    ok 2 - indexes elements by symbol
      ---
      duration_ms: 0.430969
      type: 'test'
      ...
    # Subtest: resolves names through the family-aware index
    ok 3 - resolves names through the family-aware index
      ---
      duration_ms: 0.629462
      type: 'test'
      ...
    # Subtest: validates the shipped ontology through the schema entry point
    ok 4 - validates the shipped ontology through the schema entry point
      ---
      duration_ms: 29.733206
      type: 'test'
      ...
    # Subtest: exposes the composition prompt builder
    ok 5 - exposes the composition prompt builder
      ---
      duration_ms: 0.733547
      type: 'test'
      ...
    # Subtest: exposes atoms with their metadata and behaviour
    ok 6 - exposes atoms with their metadata and behaviour
      ---
      duration_ms: 0.459381
      type: 'test'
      ...
    # Subtest: declares package entry points that exist after a build
    ok 7 - declares package entry points that exist after a build
      ---
      duration_ms: 0.475301
      type: 'test'
      ...
    1..7
ok 42 - public API surface
  ---
  duration_ms: 40.048038
  type: 'suite'
  ...
1..42
# tests 264
# suites 42
# pass 264
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 1062.478898
# start of coverage report
# -----------------------------------------------------------------------------------------
# file                     | line % | branch % | funcs % | uncovered lines
# -----------------------------------------------------------------------------------------
# atoms                    |        |          |         | 
#  actions                 |        |          |         | 
#   approval.ts            | 100.00 |   100.00 |  100.00 | 
#   crud.ts                |  97.37 |    66.67 |  100.00 | 72 90-91
#   data.ts                | 100.00 |    95.12 |  100.00 | 
#   lifecycle.ts           | 100.00 |   100.00 |  100.00 | 
#   notify.ts              | 100.00 |   100.00 |  100.00 | 
#   scheduling.ts          |  95.96 |    80.00 |   92.31 | 41-45 73-74 107
#   search-filter.ts       | 100.00 |    75.00 |  100.00 | 
#   trigger.ts             | 100.00 |   100.00 |  100.00 | 
#  intelligence            |        |          |         | 
#   analyze.ts             | 100.00 |   100.00 |  100.00 | 
#   classify.ts            | 100.00 |   100.00 |  100.00 | 
#   extract.ts             | 100.00 |   100.00 |  100.00 | 
#   generate.ts            | 100.00 |   100.00 |  100.00 | 
#   prompt.ts              | 100.00 |   100.00 |  100.00 | 
#   recommend.ts           | 100.00 |   100.00 |  100.00 | 
#   search.ts              | 100.00 |   100.00 |  100.00 | 
#   summarize.ts           | 100.00 |   100.00 |  100.00 | 
#  interfaces              |        |          |         | 
#   board.ts               |  96.99 |    70.37 |   75.00 | 56-57 66 72
#   calendar.ts            | 100.00 |    62.50 |  100.00 | 
#   card.ts                |  98.91 |    71.43 |  100.00 | 25
#   chart.ts               | 100.00 |   100.00 |  100.00 | 
#   detail.ts              | 100.00 |   100.00 |  100.00 | 
#   feed.ts                | 100.00 |    89.29 |  100.00 | 
#   form.ts                | 100.00 |   100.00 |  100.00 | 
#   gallery.ts             | 100.00 |    76.92 |  100.00 | 
#   grid.ts                | 100.00 |    85.00 |  100.00 | 
#   kanban.ts              | 100.00 |    88.89 |  100.00 | 
#   list.ts                | 100.00 |    75.00 |   83.33 | 
#   map.ts                 |  99.12 |    82.76 |  100.00 | 59
#   table.ts               | 100.00 |    80.00 |  100.00 | 
#   timeline.ts            |  95.31 |    79.49 |  100.00 | 26-27 38 60 75 77
#   tree.ts                |  99.44 |    87.27 |   92.31 | 92
#  properties              |        |          |         | 
#   address.ts             | 100.00 |   100.00 |  100.00 | 
#   ai-field.ts            | 100.00 |   100.00 |  100.00 | 
#   boolean.ts             | 100.00 |   100.00 |  100.00 | 
#   count.ts               | 100.00 |   100.00 |  100.00 | 
#   currency.ts            | 100.00 |   100.00 |  100.00 | 
#   date-range.ts          | 100.00 |   100.00 |  100.00 | 
#   date.ts                | 100.00 |   100.00 |  100.00 | 
#   duration.ts            | 100.00 |   100.00 |  100.00 | 
#   email.ts               | 100.00 |   100.00 |  100.00 | 
#   enum-field.ts          | 100.00 |   100.00 |  100.00 | 
#   id.ts                  | 100.00 |   100.00 |  100.00 | 
#   json.ts                | 100.00 |   100.00 |  100.00 | 
#   number.ts              | 100.00 |   100.00 |  100.00 | 
#   owner.ts               | 100.00 |   100.00 |  100.00 | 
#   percent.ts             | 100.00 |   100.00 |  100.00 | 
#   phone.ts               | 100.00 |   100.00 |  100.00 | 
#   priority.ts            | 100.00 |   100.00 |  100.00 | 
#   score.ts               | 100.00 |    75.00 |  100.00 | 
#   status.ts              | 100.00 |   100.00 |  100.00 | 
#   text.ts                | 100.00 |   100.00 |  100.00 | 
#   timestamps.ts          | 100.00 |   100.00 |  100.00 | 
#   url.ts                 | 100.00 |   100.00 |  100.00 | 
#  rules                   |        |          |         | 
#   action.ts              | 100.00 |   100.00 |  100.00 | 
#   audit.ts               | 100.00 |   100.00 |  100.00 | 
#   permission.ts          | 100.00 |   100.00 |  100.00 | 
#   policy.ts              | 100.00 |    83.33 |  100.00 | 
#   schedule.ts            |  94.62 |    84.62 |  100.00 | 22-26 49 68
#   trigger.ts             |  88.89 |    81.82 |  100.00 | 33-36 46-50
# composer                 |        |          |         | 
#  prompt.ts               | 100.00 |   100.00 |  100.00 | 
# eval                     |        |          |         | 
#  metrics.ts              |  97.35 |    80.00 |   89.66 | 123 125-130 144
#  scenarios.ts            | 100.00 |   100.00 |  100.00 | 
# scripts                  |        |          |         | 
#  coverage.ts             |  77.35 |    76.92 |   85.71 | 49 73-112
#  validate-ontology.ts    |  87.56 |    72.34 |   91.67 | 19 38 49 51-52 88-89 96 118-136
# src                      |        |          |         | 
#  jsonschema.ts           |  98.93 |    92.56 |   93.75 | 27-29
#  ontology.ts             |  97.24 |    86.67 |   93.33 | 15-18 58
# test                     |        |          |         | 
#  atoms-new.test.ts       | 100.00 |    95.45 |  100.00 | 
#  atoms-untested.test.ts  | 100.00 |   100.00 |  100.00 | 
#  atoms.test.ts           | 100.00 |   100.00 |  100.00 | 
#  jsonschema.test.ts      | 100.00 |    92.86 |  100.00 | 
#  metrics.test.ts         | 100.00 |    98.67 |  100.00 | 
#  ontology.test.ts        |  99.61 |    98.55 |   96.61 | 56
#  public-api.test.ts      |  89.77 |    90.91 |  100.00 | 52-60
# -----------------------------------------------------------------------------------------
# all files                |  98.14 |    89.77 |   97.81 | 
# -----------------------------------------------------------------------------------------
# end of coverage report
Evidence: reference-implementation coverage report (115/115)

TOTAL 115 115 100%; objects 35/35, properties 25/25, actions 25/25, interfaces 15/15, intelligence 8/8, rules 7/7


> software-periodic-table@0.5.0 coverage
> tsx scripts/coverage.ts

Reference implementation coverage (ontology v0.4.0)

Family        Covered Total  Coverage
----------------------------------------------
objects       35      35     100%
properties    25      25     100%
actions       25      25     100%
interfaces    15      15     100%
intelligence  8       8      100%
rules         7       7      100%
----------------------------------------------
TOTAL         115     115    100%


Atom files: 94
Evidence: new atom test file run (41/41)
TAP version 13
# Subtest: Intelligence atoms
    # Subtest: Search (Sr) creates a search request
    ok 1 - Search (Sr) creates a search request
      ---
      duration_ms: 1.130103
      type: 'test'
      ...
    # Subtest: Summarize (Sm) creates a summarize request
    ok 2 - Summarize (Sm) creates a summarize request
      ---
      duration_ms: 0.185799
      type: 'test'
      ...
    # Subtest: Classify (Cs) creates a classify request
    ok 3 - Classify (Cs) creates a classify request
      ---
      duration_ms: 0.880402
      type: 'test'
      ...
    # Subtest: Recommend (Rc) creates a recommend request
    ok 4 - Recommend (Rc) creates a recommend request
      ---
      duration_ms: 0.246991
      type: 'test'
      ...
    # Subtest: Analyze (An) creates an analyze request
    ok 5 - Analyze (An) creates an analyze request
      ---
      duration_ms: 0.181833
      type: 'test'
      ...
    # Subtest: Extract (Ec) creates an extract request
    ok 6 - Extract (Ec) creates an extract request
      ---
      duration_ms: 0.165429
      type: 'test'
      ...
    # Subtest: Generate (Gn) creates a generate request
    ok 7 - Generate (Gn) creates a generate request
      ---
      duration_ms: 0.166258
      type: 'test'
      ...
    # Subtest: Prompt (Pt) creates a prompt request
    ok 8 - Prompt (Pt) creates a prompt request
      ---
      duration_ms: 0.223128
      type: 'test'
      ...
    1..8
ok 1 - Intelligence atoms
  ---
  duration_ms: 4.70062
  type: 'suite'
  ...
# Subtest: Properties atoms
    # Subtest: Status (Ss) validates status values
    ok 1 - Status (Ss) validates status values
      ---
      duration_ms: 1.701859
      type: 'test'
      ...
    # Subtest: Text (Tx) checks emptiness and truncates
    ok 2 - Text (Tx) checks emptiness and truncates
      ---
      duration_ms: 0.365505
      type: 'test'
      ...
    # Subtest: Number (Nm) clamps and rounds
    ok 3 - Number (Nm) clamps and rounds
      ---
      duration_ms: 0.178411
      type: 'test'
      ...
    # Subtest: Date (Dt) and DateTime (Dm) format dates
    ok 4 - Date (Dt) and DateTime (Dm) format dates
      ---
      duration_ms: 0.529349
      type: 'test'
      ...
    # Subtest: Currency (Cu) exposes common currencies
    ok 5 - Currency (Cu) exposes common currencies
      ---
      duration_ms: 0.199797
      type: 'test'
      ...
    # Subtest: Enum (En) validates enum values
    ok 6 - Enum (En) validates enum values
      ---
      duration_ms: 0.183251
      type: 'test'
      ...
    # Subtest: Boolean (Bl) parses boolean values
    ok 7 - Boolean (Bl) parses boolean values
      ---
      duration_ms: 0.235069
      type: 'test'
      ...
    # Subtest: ID (Id) generates unique identifiers
    ok 8 - ID (Id) generates unique identifiers
      ---
      duration_ms: 0.583368
      type: 'test'
      ...
    # Subtest: Owner (Ow) defines owner references
    ok 9 - Owner (Ow) defines owner references
      ---
      duration_ms: 0.102615
      type: 'test'
      ...
    # Subtest: Priority (Py) defines common priority values
    ok 10 - Priority (Py) defines common priority values
      ---
      duration_ms: 0.90774
      type: 'test'
      ...
    # Subtest: CreatedAt (Ca) and UpdatedAt (Ua) manage timestamps
    ok 11 - CreatedAt (Ca) and UpdatedAt (Ua) manage timestamps
      ---
      duration_ms: 0.900804
      type: 'test'
      ...
    # Subtest: Score (Sk) normalizes scores
    ok 12 - Score (Sk) normalizes scores
      ---
      duration_ms: 0.165284
      type: 'test'
      ...
    # Subtest: Percent (Pc) clamps and formats percentages
    ok 13 - Percent (Pc) clamps and formats percentages
      ---
      duration_ms: 0.175266
      type: 'test'
      ...
    # Subtest: Duration (Du) converts and formats durations
    ok 14 - Duration (Du) converts and formats durations
      ---
      duration_ms: 0.348484
      type: 'test'
      ...
    # Subtest: Count (Cn) validates counts
    ok 15 - Count (Cn) validates counts
      ---
      duration_ms: 0.129281
      type: 'test'
      ...
    # Subtest: JSON (Js) parses JSON safely
    ok 16 - JSON (Js) parses JSON safely
      ---
      duration_ms: 0.26895
      type: 'test'
      ...
    # Subtest: Address (Ad) formats addresses
    ok 17 - Address (Ad) formats addresses
      ---
      duration_ms: 0.175538
      type: 'test'
      ...
    # Subtest: AI (Ai) marks and detects AI-generated fields
    ok 18 - AI (Ai) marks and detects AI-generated fields
      ---
      duration_ms: 0.214195
      type: 'test'
      ...
    # Subtest: StartDate (Sd) and EndDate (Ed) validate ranges
    ok 19 - StartDate (Sd) and EndDate (Ed) validate ranges
      ---
      duration_ms: 0.170743
      type: 'test'
      ...
    # Subtest: Email (Ea) validates and normalizes emails
    ok 20 - Email (Ea) validates and normalizes emails
      ---
      duration_ms: 0.253873
      type: 'test'
      ...
    # Subtest: Phone (Ph) normalizes phone numbers
    ok 21 - Phone (Ph) normalizes phone numbers
      ---
      duration_ms: 0.178846
      type: 'test'
      ...
    # Subtest: URL (Ur) validates URLs
    ok 22 - URL (Ur) validates URLs
      ---
      duration_ms: 0.194734
      type: 'test'
      ...
    1..22
ok 2 - Properties atoms
  ---
  duration_ms: 9.274339
  type: 'suite'
  ...
# Subtest: Actions atoms
    # Subtest: Create (Cr), Update (Up), Delete (De), View (Vw) build action requests
    ok 1 - Create (Cr), Update (Up), Delete (De), View (Vw) build action requests
      ---
      duration_ms: 0.290257
      type: 'test'
      ...
    # Subtest: executeInMemory performs CRUD operations
    ok 2 - executeInMemory performs CRUD operations
      ---
      duration_ms: 0.291688
      type: 'test'
      ...
    # Subtest: Notify (No), Message (Mg), Assign (As) build action requests
    ok 3 - Notify (No), Message (Mg), Assign (As) build action requests
      ---
      duration_ms: 0.177903
      type: 'test'
      ...
    # Subtest: Search (Se), Filter (Fi), Sort (So), Export (Ex) build action requests
    ok 4 - Search (Se), Filter (Fi), Sort (So), Export (Ex) build action requests
      ---
      duration_ms: 0.241596
      type: 'test'
      ...
    1..4
ok 3 - Actions atoms
  ---
  duration_ms: 1.168177
  type: 'suite'
  ...
# Subtest: Interfaces atoms
    # Subtest: Calendar (Ce) defines and materializes calendar views
    ok 1 - Calendar (Ce) defines and materializes calendar views
      ---
      duration_ms: 0.293115
      type: 'test'
      ...
    # Subtest: Chart (Ch) defines and materializes chart views
    ok 2 - Chart (Ch) defines and materializes chart views
      ---
      duration_ms: 0.203331
      type: 'test'
      ...
    # Subtest: Detail (Di) defines and materializes detail views
    ok 3 - Detail (Di) defines and materializes detail views
      ---
      duration_ms: 0.178207
      type: 'test'
      ...
    # Subtest: Form (Fm) defines and materializes form views
    ok 4 - Form (Fm) defines and materializes form views
      ---
      duration_ms: 0.330485
      type: 'test'
      ...
    1..4
ok 4 - Interfaces atoms
  ---
  duration_ms: 1.174723
  type: 'suite'
  ...
# Subtest: Rules atoms
    # Subtest: Audit (Au) creates audit entries and diffs objects
    ok 1 - Audit (Au) creates audit entries and diffs objects
      ---
      duration_ms: 0.312411
      type: 'test'
      ...
    # Subtest: Permission (Pn) checks permissions
    ok 2 - Permission (Pn) checks permissions
      ---
      duration_ms: 0.167499
      type: 'test'
      ...
    # Subtest: Policy (Po) creates and evaluates policies
    ok 3 - Policy (Po) creates and evaluates policies
      ---
      duration_ms: 0.222766
      type: 'test'
      ...
    1..3
ok 5 - Rules atoms
  ---
  duration_ms: 0.850865
  type: 'suite'
  ...
1..5
# tests 41
# suites 5
# pass 41
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 362.546033
Evidence: adversarial regression check (mutation makes test fail)

Source: adversarial regression check (mutation makes test fail) (local file: ~/.no-mistakes/evidence/01M53EZSRTR57Q9PT10H52JZK7/adversarial-regression-check.txt)

not ok 7 - Boolean (Bl) parses boolean values; # pass 40 / # fail 1 / exit 1 (transient mutation reverted)
Evidence: parsed version metadata (package.json + CITATION.cff)

{"package_json":{"version":"0.5.0","has_test_coverage_script":true},"citation_cff":{"version":"0.5.0","date_released":"2026-10-16"}}

{
  "package_json": {
    "name": "software-periodic-table",
    "version": "0.5.0",
    "has_test_coverage_script": true,
    "test_coverage_script": "node --import tsx --test --experimental-test-coverage test/*.test.ts"
  },
  "citation_cff": {
    "version": "0.5.0",
    "date_released": "2026-10-16"
  }
}
  • Evidence: rendered README.md (Roadmap fix + Status) (local file: ~/.no-mistakes/evidence/01M53EZSRTR57Q9PT10H52JZK7/README.rendered.html)
Evidence: rendered CHANGELOG.md (0.5.0 entry)
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CHANGELOG.md</title>
<style>
body{font-family:-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;max-width:900px;margin:2rem auto;padding:0 1rem;line-height:1.6;color:#24292f}
h1,h2,h3{line-height:1.25;border-bottom:1px solid #d0d7de;padding-bottom:.3em}
code{background:#eff1f3;padding:.2em .4em;border-radius:6px;font-size:85%}
pre{background:#f6f8fa;padding:1rem;border-radius:6px;overflow:auto}
table{border-collapse:collapse;width:100%;margin:1rem 0}
th,td{border:1px solid #d0d7de;padding:.4rem .6rem;text-align:left}
th{background:#f6f8fa}
blockquote{border-left:.25em solid #d0d7de;margin:0;padding:0 1em;color:#57606a}
a{color:#0969da}
</style></head><body>
<h1>Changelog</h1>
<p>All notable changes to this project are documented in this file.</p>
<p>The format is based on <a href="https://keepachangelog.com/en/1.1.0/">Keep a Changelog</a>, and this project adheres to <a href="https://semver.org/spec/v2.0.0.html">Semantic Versioning</a>.</p>
<h2>[0.5.0] - 2026-10-16</h2>
<h3>Added</h3>
<ul>
<li>Test coverage for all 8 intelligence atoms (Search, Summarize, Classify, Recommend, Analyze, Extract, Generate, Prompt)</li>
<li>Test coverage for all 25 properties atoms (Status, Text, Number, Date, DateTime, Currency, Enum, Boolean, ID, Owner, Priority, CreatedAt, UpdatedAt, Score, Percent, Duration, Count, JSON, Address, AI, StartDate, EndDate, Email, Phone, URL)</li>
<li>Test coverage for 11 previously untested actions atoms (Create/Update/Delete/View, Notify/Message/Assign, Search/Filter/Sort/Export)</li>
<li>Test coverage for 4 previously untested interfaces atoms (Calendar, Chart, Detail, Form)</li>
<li>Test coverage for 3 previously untested rules atoms (Audit, Permission, Policy)</li>
<li><code>test:coverage</code> npm script for running tests with coverage reporting</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Updated README Roadmap to reflect current 100% reference implementation coverage</li>
<li>Bumped version to 0.5.0 in package.json and CITATION.cff</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Corrected the stale Roadmap section in README that contradicted the Status section</li>
</ul>
<h2>[0.4.0] - 2026-08-21</h2>
<h3>Added</h3>
<ul>
<li>115 atoms across 6 families (ontology established in 0.2.0)</li>
<li>JSON Schema validator with dependency-free implementation</li>
<li>Composition system prompt and plan schema</li>
<li>Evaluation harness with baseline vs composition comparison</li>
<li>Reference implementations for 90 of 115 atoms (25 missing: 14 actions, 9 interfaces, 2 rules)</li>
<li>CI pipeline with validation, coverage, linting, and type-checking</li>
</ul>
</body></html>
- Outcome: ⚠️ 1 warning across 1 run (17m20s)

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

🔧 **Review** - 3 issues found → auto-fixed (2) ✅
  • ⚠️ test/atoms-untested.test.ts:449 - Intent conformance gap: the intent requires "add test coverage for untested atoms (intelligence, properties, actions, interfaces, rules)". The interfaces family had 4 untested atoms (Calendar, Chart, Detail, Form), but the Interfaces describe block (lines 449-500) covers only Calendar, Chart, Detail. Form (Fm, id 99; atoms/interfaces/form.ts:3) has no test: no file in the repo imports atoms/interfaces/form.ts. The other four families are complete (8/8 intelligence, 25/25 properties, 11/11 actions, 3/3 rules). Note README.md:193-194 still claims "Every element has a tested reference implementation — 115 of 115 (100%)", which remains false while Form is untested. Decide: add Form coverage, or explicitly accept the gap and amend the CHANGELOG/intent scope.
  • ⚠️ CHANGELOG.md:14 - Count error: "Test coverage for 3 previously untested actions atoms" lists 11 atoms (Create/Update/Delete/View, Notify/Message/Assign, Search/Filter/Sort/Export). Every sibling bullet's count matches its listed atoms (8 intelligence, 25 properties, 3 interfaces, 3 rules). Fix: change 3 to 11, or reword to "3 groups of previously untested actions atoms".
  • ⚠️ CHANGELOG.md:36 - The 0.4.0 entry (lines 32-37) contradicts git history. At 0.4.0 (commit 8d74149) only 90 of 115 atoms had reference implementations — the README Roadmap at the base commit still said 21 missing (13 actions, 7 interfaces, 1 rules) and f3ed4cf implemented them — so "Reference implementations for all 115 atoms" (line 36) is false. CI at 0.4.0 ran only validate/coverage/lint/check with no test step and no test npm script (test script added in 7b0c807, CI test step in f8b4608), so "CI pipeline with ... and testing" (line 37) is false. 0.4.0 was not the initial release (0.1.0, commit b0a4e1d) and the 115-element ontology dated from 0.2.0 (7c5d7a7), so "Initial release with 115 atoms" (line 32) is false. Fix: correct all three claims to match history.

🔧 Fix applied.
5 warnings still open:

  • ⚠️ CHANGELOG.md:14 - Count error: "Test coverage for 3 previously untested actions atoms" lists 11 atoms (Create/Update/Delete/View, Notify/Message/Assign, Search/Filter/Sort/Export). Every sibling bullet's count matches its listed atoms (8 intelligence, 25 properties, 3 interfaces, 3 rules). Fix: change 3 to 11, or reword to "3 groups of previously untested actions atoms".
  • ⚠️ CHANGELOG.md:36 - The 0.4.0 entry (lines 32-37) contradicts git history. At 0.4.0 (commit 8d74149) only 90 of 115 atoms had reference implementations — the README Roadmap at the base commit still said 21 missing (13 actions, 7 interfaces, 1 rules) and f3ed4cf implemented them — so "Reference implementations for all 115 atoms" (line 36) is false. CI at 0.4.0 ran only validate/coverage/lint/check with no test step and no test npm script (test script added in 7b0c807, CI test step in f8b4608), so "CI pipeline with ... and testing" (line 37) is false. 0.4.0 was not the initial release (0.1.0, commit b0a4e1d) and the 115-element ontology dated from 0.2.0 (7c5d7a7), so "Initial release with 115 atoms" (line 32) is false. Fix: correct all three claims to match history.
  • ⚠️ CHANGELOG.md:36 - 0.4.0 entry is internally inconsistent: 'Reference implementations for 90 of 115 atoms (21 missing: 13 actions, 7 interfaces, 1 rules)' — 90 + 21 = 111 ≠ 115. The 21-missing breakdown is the state at f3ed4cf^ (94/115, per f3ed4cf's commit message 'up from 94/115' and the Roadmap at f3ed4cf^), not at 0.4.0. At 0.4.0 (8d74149) the atoms tree shows 90 implementations (35 objects + 25 properties + 8 intelligence + 12 actions + 6 interfaces + 4 rules) and 25 missing: 13 actions, 9 interfaces (Gallery/Feed not yet added), 3 rules (Schedule/Condition/Action not yet added) — those 7 were added in 7b0c807 and siblings after 0.4.0. Introduced by fix round b4f63fa, which rewrote this entry per the recorded review-6 instruction (that instruction itself conflated the two states). Fix: 'Reference implementations for 90 of 115 atoms (25 missing: 13 actions, 9 interfaces, 3 rules)'.
  • ⚠️ CHANGELOG.md:15 - Interfaces bullet undercounts: 'Test coverage for 3 previously untested interfaces atoms (Calendar, Chart, Detail)'. Fix round b4f63fa added Form (Fm) coverage per the recorded review-4 decision, so 4 interfaces atoms now have tests (test/atoms-untested.test.ts, 'Form (Fm) defines and materializes form views'). The same round corrected the sibling actions bullet (3→11, review-5) but left this one behind. Fix: change 3 to 4 and add Form to the list.
  • ⚠️ README.md:193 - The Status claim 'Every element has a tested reference implementation — 115 of 115 (100%)' is false at HEAD: no test file imports any of the 35 atoms/objects files (test/ contains zero atoms/objects imports; object atoms are exercised only by examples/task-board.ts et al., which are not tests). Tested families: intelligence 8/8, properties 25/25, actions 25/25, interfaces 15/15, rules 7/7; objects 0/35. The recorded review-4 decision stated this change makes the claim true, but the objects family — deliberately excluded from the intent's 5-family coverage list — remains untested. Note: this text was introduced by the base commit f3ed4cf, not by this diff, but the recorded decision tied its truth to this change. Decide: add object test coverage (extends beyond the intent's stated scope) or correct the claim.

🔧 Fix applied.
✅ Re-checked - no issues remain.

⚠️ **Test** - 1 warning
  • ⚠️ live validation verdict: inconclusive (4 of 6 scenarios were driven live against the product); untested: Version is bumped to 0.5.0 in package.json and CITATION.cff with release date 2026-10-16, README Roadmap no longer lists missing atoms and CHANGELOG.md documents the 0.5.0 release
  • Live validation: ⚠️ inconclusive - 4 of 6 scenarios driven live against the product
Scenario Result Live Evidence
Run the new five-family atom tests against the real library and observe all pass ✅ pass live node --import tsx --test test/atoms-untested.test.ts → 41 tests / 41 pass / 0 fail (atoms-untested-test-run.txt); same suite inside npm run test:coverage
Run the newly added npm run test:coverage script and observe the full suite plus a coverage report with exit 0 ✅ pass live npm run test:coverage → # tests 264 / # pass 264 / # fail 0, coverage table printed, exit 0 (test-coverage-run.txt); script present in version-metadata.json
Adversarially break an atom's behavior and observe the new test catches it ✅ pass live Transiently changed parseBoolean in atoms/properties/boolean.ts so 'yes' returns false; test file reported not ok 7 - Boolean (Bl) parses boolean values, # pass 40 / # fail 1 / exit 1; file restor…
npm run coverage reports 115 of 115 atoms implemented, matching the README Status claim ✅ pass live npm run coverage → TOTAL 115 115 100%, all six families 100% (reference-coverage-report.txt)
Version is bumped to 0.5.0 in package.json and CITATION.cff with release date 2026-10-16 ⏸️ untested no The prior payload did not establish a live result: it only read declarative metadata via npm pkg get version and a pyyaml parse of CITATION.cff. Version fields in package.json and CITATION.cff are m…
README Roadmap no longer lists missing atoms and CHANGELOG.md documents the 0.5.0 release ⏸️ untested no The prior payload did not establish a live result: it rendered README.md and CHANGELOG.md to HTML and inspected the rendered output. Documentation prose has no runtime product surface; there is no exe…
  • node --import tsx --test test/atoms-untested.test.ts (41 tests / 41 pass / 0 fail)
  • npm run test:coverage (new script; 264 tests / 264 pass / 0 fail, emits per-file coverage table, exit 0)
  • npm run coverage (reference-implementation coverage 115/115 = 100%)
  • Adversarial regression check: transiently flipped atoms/properties/boolean.ts parseBoolean(&#39;yes&#39;) to false, re-ran the new test file (Boolean test failed, 40 pass / 1 fail, exit 1), then restored the file (git status clean)
  • Version metadata parsed from package.json (JSON) and CITATION.cff (YAML via pyyaml): version 0.5.0, date-released 2026-10-16, test:coverage script present
  • Rendered README.md and CHANGELOG.md to HTML and confirmed the stale Roadmap text is absent and the new near/medium/long-term roadmap is present
⚠️ **Document** - 1 info
  • ℹ️ CHANGELOG.md:36 - The recorded review-7 decision instructed the exact 0.4.0 correction 'Reference implementations for 90 of 115 atoms (25 missing: 13 actions, 9 interfaces, 3 rules)', but the committed text (817358a) says '14 actions, 9 interfaces, 2 rules'. Verified against git history at 0.4.0 (8d74149): 11/25 actions, 6/15 interfaces, and 5/7 rules were implemented (atoms/rules/trigger.ts already declared ConditionMeta at 0.4.0), so 14/9/2 is factually correct and the recorded correction rested on a miscount. Kept the correct text rather than applying the recorded wording, since applying it would introduce a factual error; flagging the deviation for user confirmation.
✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

…rsion to 0.5.0

- Add comprehensive tests for all 8 intelligence atoms (Search, Summarize,
  Classify, Recommend, Analyze, Extract, Generate, Prompt)
- Add tests for all 22 properties atoms (Status, Text, Number, Date,
  DateTime, Currency, Enum, Boolean, ID, Owner, Priority, CreatedAt,
  UpdatedAt, Score, Percent, Duration, Count, JSON, Address, AI, StartDate,
  EndDate, Email, Phone, URL)
- Add tests for 3 previously untested actions atoms (CRUD, Notify/Assign,
  Search/Filter/Sort/Export)
- Add tests for 3 previously untested interfaces atoms (Calendar, Chart,
  Detail)
- Add tests for 3 previously untested rules atoms (Audit, Permission,
  Policy)
- Create CHANGELOG.md documenting changes between versions
- Add test:coverage npm script
- Fix stale Roadmap in README that contradicted the Status section
- Bump version to 0.5.0 in package.json and CITATION.cff
… set CITATION.cff date-released to 2026-10-16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant