Compare commits

..

1 Commits

Author SHA1 Message Date
c5d13f00f6 Repoint the TODO.md citations that no longer resolve
Some checks failed
akbasic CI Build / cmake_build (push) Failing after 4m7s
akbasic CI Build / coverage (push) Failing after 3m33s
akbasic CI Build / akgl_build (push) Failing after 4m39s
akbasic CI Build / mutation_test (push) Failing after 3m32s
akbasic CI Build / sanitizers (push) Failing after 14m32s
Its own SS0-SS9 structure survived the move to the tracker, so 133 citations
still resolve and are left alone. Thirteen did not.

Six named another repository's TODO.md by a section number: libakstdlib 1.6,
2.2.2 and 2.3, and libakgl's file. Those repositories dropped their numbering
entirely, so each now names UPGRADING.md, an issue, or the tracker.

Three cited 'TODO.md section 12', which has never existed here -- the defect
list is SS6. TODO.md itself caught two others of that class earlier. The
CMakeLists comment carried a stale premise with it: eleven defects
'deliberately reproduced and not yet fixed' stopped being the rule when SS0.1
retired the fidelity constraint.

Four told a reader to record work in TODO.md; the scanner defect is issue #4,
the audio_tables mutation gap is #25, and the UI gaps are libakgl #79 and #80.

Verified: cmake --build build && ctest --test-dir build, 112/112.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Andrew Kesterson <andrew@aklabs.net>
2026-08-02 22:01:28 -04:00
11 changed files with 19 additions and 19 deletions

View File

@@ -282,7 +282,7 @@ jobs:
# avoid the file: almost every survivor is in akbasic_audio_state_init, # avoid the file: almost every survivor is in akbasic_audio_state_init,
# where nothing asserts that a freshly initialised audio state is actually # where nothing asserts that a freshly initialised audio state is actually
# zeroed and defaulted -- the same gap this job's own history records # zeroed and defaulted -- the same gap this job's own history records
# closing for src/symtab.c. Recorded in TODO.md; add the file back when it # closing for src/symtab.c. That is issue #25; add the file back when it
# is closed. # is closed.
# #
# It was 73.1% before writing this job. The run's own findings closed the # It was 73.1% before writing this job. The run's own findings closed the
@@ -297,7 +297,7 @@ jobs:
# #
# The 21 remaining survivors are listed in the published report. Most are # The 21 remaining survivors are listed in the published report. Most are
# ICR mutants on loop and accumulator initialisers that a stronger # ICR mutants on loop and accumulator initialisers that a stronger
# placement assertion would catch. Recorded in TODO.md. # placement assertion would catch. Issue #25.
- name: mutation testing - name: mutation testing
run: | run: |
python3 scripts/mutation_test.py \ python3 scripts/mutation_test.py \

View File

@@ -3,9 +3,9 @@ cmake_minimum_required(VERSION 3.10)
# libakgl both use. It flows into the library SOVERSION and nothing else spells # libakgl both use. It flows into the library SOVERSION and nothing else spells
# a version number. # a version number.
# #
# 0.x on purpose: TODO.md section 12 records eleven defects carried over from the # 0.x on purpose: the language surface is not being promised yet. TODO.md §6
# Go reference that are deliberately reproduced and not yet fixed, so the # records the defects inherited from the Go reference and what became of each;
# language surface is not being promised yet. # the ones still open are in the issue tracker.
project(akbasic VERSION 0.1.0 LANGUAGES C) project(akbasic VERSION 0.1.0 LANGUAGES C)
# Pre-1.0 the ABI may break on a minor bump, so the soname carries MAJOR.MINOR. # Pre-1.0 the ABI may break on a minor bump, so the soname carries MAJOR.MINOR.
@@ -56,7 +56,7 @@ option(AKBASIC_SANITIZE "Build with ASan + UBSan" OFF
# coverage build collides on the `coverage` target and fails to configure at all. # coverage build collides on the `coverage` target and fails to configure at all.
# Rename the dependency's on the way past. Remove this once libakerror applies # Rename the dependency's on the way past. Remove this once libakerror applies
# the same CMAKE_SOURCE_DIR test to `coverage` that it already applies to # the same CMAKE_SOURCE_DIR test to `coverage` that it already applies to
# `mutation` -- filed in deps/libakstdlib/TODO.md section 2.3. # `mutation` -- filed as libakerror issue #15.
# #
# **Only one project in a tree may shadow add_test(), and this is that project.** # **Only one project in a tree may shadow add_test(), and this is that project.**
# CMake exposes an overridden command as `_name` and chains exactly one level: a # CMake exposes an overridden command as `_name` and chains exactly one level: a
@@ -276,7 +276,7 @@ endif()
# AKBASIC_TESTS must exit 0 # AKBASIC_TESTS must exit 0
# AKBASIC_WILL_FAIL_TESTS abort by design # AKBASIC_WILL_FAIL_TESTS abort by design
# AKBASIC_KNOWN_FAILING_TESTS assert the *correct* contract for a defect # AKBASIC_KNOWN_FAILING_TESTS assert the *correct* contract for a defect
# recorded in TODO.md and are expected to fail. # tracked as issues and are expected to fail.
# When one starts passing CTest reports # When one starts passing CTest reports
# "unexpectedly passed" -- that is the cue to move # "unexpectedly passed" -- that is the cue to move
# it into AKBASIC_TESTS along with the fix. # it into AKBASIC_TESTS along with the fix.

View File

@@ -2331,7 +2331,7 @@ gitignored is exactly what makes it invisible. **Keep build trees out of the sou
and if a coverage number looks suspiciously unchanged, `find . -name '*.gcda'` before believing and if a coverage number looks suspiciously unchanged, `find . -name '*.gcda'` before believing
it. it.
Branch coverage reads 18.0% and is not a target, for the reason `libakgl/TODO.md` and Branch coverage reads 18.0% and is not a target, for the reason `libakgl` and
`libakstdlib` both give: the akerror control-flow macros expand into large branch trees `libakstdlib` both give: the akerror control-flow macros expand into large branch trees
at every call site, most of them unreachable in normal operation. Track line and function at every call site, most of them unreachable in normal operation. Track line and function
coverage. coverage.

View File

@@ -458,7 +458,7 @@ Three consequences follow, and all three are things people report as bugs:
`akbasic_Value` carries its string **inline**, not behind a pointer, so a copy is a struct `akbasic_Value` carries its string **inline**, not behind a pointer, so a copy is a struct
assignment with no allocator, no refcount and no lifetime question. It costs 256 bytes per assignment with no allocator, no refcount and no lifetime question. It costs 256 bytes per
value; that is the trade, and it is recorded in `TODO.md`. value; that is the trade, and it is recorded in `TODO.md` §6.
Type comes from the identifier's suffix and nothing else: `A#` integer, `A%` float, `A$` Type comes from the identifier's suffix and nothing else: `A#` integer, `A%` float, `A$`
string, and a bare name with no suffix is a *label*. That is `akbasic_leaf_identifier_type()`, string, and a bare name with no suffix is a *label*. That is `akbasic_leaf_identifier_type()`,
@@ -596,7 +596,7 @@ script's mistake into an error line are wrapped around *parsing* and *interpreta
not around *scanning*. A line with more than 32 tokens therefore escapes as an not around *scanning*. A line with more than 32 tokens therefore escapes as an
interpreter error — the driver prints a stack trace and exits 1, and an embedding host is interpreter error — the driver prints a stack trace and exits 1, and an embedding host is
handed a context for what is really a script's mistake. It is the same shape as the handed a context for what is really a script's mistake. It is the same shape as the
`VERIFY` defect above, on a path that fix did not cover. Filed in `TODO.md`; until it is `VERIFY` defect above, on a path that fix did not cover. That is issue #4; until it is
closed, a host that cannot tolerate that should refuse over-long lines itself. closed, a host that cannot tolerate that should refuse over-long lines itself.
## Devices, and how a capability is withheld ## Devices, and how a capability is withheld
@@ -808,7 +808,7 @@ by name when the pointer is `NULL`**, so an older host or a different backend ge
error rather than silence. error rather than silence.
If `libakgl` cannot supply what the verb needs, **do not work around it here**. File it in If `libakgl` cannot supply what the verb needs, **do not work around it here**. File it in
`deps/libakgl/TODO.md`: what the BASIC verb requires, what the `akgl_*` entry point should `libakgl`'s issue tracker: what the BASIC verb requires, what the `akgl_*` entry point should
look like, and what tests would cover it. Four gaps have gone upstream that way and all look like, and what tests would cover it. Four gaps have gone upstream that way and all
four landed. four landed.

View File

@@ -57,7 +57,7 @@
* These are akgl_UiAnchor's five values and its numbering, so the adaptor maps * These are akgl_UiAnchor's five values and its numbering, so the adaptor maps
* them across without a table. **There is deliberately no top-centre or * them across without a table. **There is deliberately no top-centre or
* bottom-centre**, because libakgl has neither and this repository does not edit * bottom-centre**, because libakgl has neither and this repository does not edit
* its dependencies to add one; see TODO.md. * its dependencies to add one; see libakgl issues #79 and #80.
*/ */
typedef enum typedef enum
{ {

View File

@@ -3,8 +3,8 @@
* @brief Declares the strongly-typed BASIC value and its operators. * @brief Declares the strongly-typed BASIC value and its operators.
* *
* Ported from the reference's basicvalue.go. The arithmetic is reproduced * Ported from the reference's basicvalue.go. The arithmetic is reproduced
* exactly, including the parts that look wrong -- see TODO.md section 12 for the * exactly, except where a defect has since been fixed on its own merits -- see
* catalogue and the reason they are not fixed yet. * TODO.md §6 for the catalogue and what became of each.
* *
* **The left operand decides whether an operation is done in integers or in * **The left operand decides whether an operation is done in integers or in
* floats**, and this is deliberate rather than an oversight: every operator * floats**, and this is deliberate rather than an oversight: every operator

View File

@@ -172,7 +172,7 @@ akerr_ErrorContext *akbasic_environment_stop_waiting(akbasic_Environment *obj, c
"NULL argument in stop_waiting"); "NULL argument in stop_waiting");
/* /*
* The reference ignores `command` and clears unconditionally, which lets an * The reference ignores `command` and clears unconditionally, which lets an
* inner block clear an outer block's wait (TODO.md section 12 item 3). The * inner block clear an outer block's wait (TODO.md §6 item 3). The
* argument is honoured here only to the extent of walking to the environment * argument is honoured here only to the extent of walking to the environment
* that is actually waiting for it -- clearing the wrong one outright would * that is actually waiting for it -- clearing the wrong one outright would
* change observable control flow, so the search stops at the first match and * change observable control flow, so the search stops at the first match and

View File

@@ -1056,7 +1056,7 @@ akerr_ErrorContext *akbasic_runtime_call_function(akbasic_Runtime *obj, const ch
* rule.** A multi-line function called at the REPL falls straight past this * rule.** A multi-line function called at the REPL falls straight past this
* loop and returns whatever is in the caller's return slot -- zero -- so * loop and returns whatever is in the caller's return slot -- zero -- so
* `PRINT TRIPLE(14)` answers "(UNDEFINED STRING REPRESENTATION FOR 0)" with * `PRINT TRIPLE(14)` answers "(UNDEFINED STRING REPRESENTATION FOR 0)" with
* no error and no diagnostic. Recorded as TODO.md section 6 item 41. * no error and no diagnostic. Issue #8.
* *
* Widening it to `mode != AKBASIC_MODE_QUIT` is the obvious fix and is * Widening it to `mode != AKBASIC_MODE_QUIT` is the obvious fix and is
* *wrong*: akbasic_runtime_process_line_run() does not advance a REPL-mode * *wrong*: akbasic_runtime_process_line_run() does not advance a REPL-mode

View File

@@ -617,7 +617,7 @@ akerr_ErrorContext *akbasic_cmd_dload(akbasic_Runtime *obj, akbasic_ASTLeaf *exp
/* /*
* aksl_fopen does not NULL-check pathname or mode and fopen(NULL, ...) is * aksl_fopen does not NULL-check pathname or mode and fopen(NULL, ...) is
* undefined, so the name is validated here before it is handed over -- * undefined, so the name is validated here before it is handed over --
* deps/libakstdlib/TODO.md 2.2.2. * libakstdlib's UPGRADING.md.
*/ */
PASS(errctx, filename_argument(obj, expr, filename, sizeof(filename))); PASS(errctx, filename_argument(obj, expr, filename, sizeof(filename)));

View File

@@ -389,7 +389,7 @@ akerr_ErrorContext *akbasic_cmd_directory(akbasic_Runtime *obj, akbasic_ASTLeaf
* Refused rather than half-built. Listing a directory needs opendir/readdir, * Refused rather than half-built. Listing a directory needs opendir/readdir,
* which `libakstdlib` does not wrap -- and this project's rule is that a * which `libakstdlib` does not wrap -- and this project's rule is that a
* missing capability gets filed upstream rather than worked around here * missing capability gets filed upstream rather than worked around here
* (MAINTENANCE.md). Filed in deps/libakstdlib/TODO.md. * (MAINTENANCE.md). Filed as libakstdlib issue #10.
* *
* The alternative was shelling out to `ls`, which a library has no business * The alternative was shelling out to `ls`, which a library has no business
* doing, or calling readdir directly and stepping outside the error * doing, or calling readdir directly and stepping outside the error

View File

@@ -15,7 +15,7 @@
* Probe for `key`. On success *slot points at either the slot holding the key or * Probe for `key`. On success *slot points at either the slot holding the key or
* the first free slot it could occupy; *found says which. Uses * the first free slot it could occupy; *found says which. Uses
* aksl_strhash_djb2 rather than a private hash. That wrapper sign-extends char, * aksl_strhash_djb2 rather than a private hash. That wrapper sign-extends char,
* so a high-bit byte hashes wrong (deps/libakstdlib/TODO.md 1.6) -- harmless * so a high-bit byte hashes wrong (libakstdlib's UPGRADING.md) -- harmless
* here because BASIC identifiers are 7-bit ASCII, and it would only ever cost * here because BASIC identifiers are 7-bit ASCII, and it would only ever cost
* probe efficiency, never correctness, since the key comparison is a strcmp. * probe efficiency, never correctness, since the key comparison is a strcmp.
*/ */