Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
8258a10
FAQ on BETA 1034: entries for binary compatibility with a VB6 build, …
KubaO Nov 2, 2026
5e8e4a7
Callouts rechecked on BETA 1034 and relabelled from 1010/1005 (contri…
KubaO Nov 2, 2026
0351f58
ArrayListLib 1.6.151.1 and WinReg 1.0.1.1 still do not compile on BET…
KubaO Nov 2, 2026
9d8f19f
Lane tests for two IDE NOTEs that had none, both holding on BETA 1034…
KubaO Nov 2, 2026
e7503e2
Contributed callouts rechecked on BETA 1034 and relabelled from 1010/…
KubaO Nov 3, 2026
e04f8d4
Compiler error codes in the search index: 36 TB5xxx codes and TB65535…
KubaO Nov 3, 2026
1246f5c
xCalendar back under Contributed Packages (owner), its text colours w…
KubaO Nov 3, 2026
5d5c238
Diagnostics: a Common errors section for TB5001, TB5027, TB5079 and T…
KubaO Nov 3, 2026
550e9b4
Experimental.md: its final newline back, lost when xCalendar's line w…
KubaO Nov 3, 2026
bc32539
Help add-in: the find box of the shortcut editors is the IDE's own se…
KubaO Nov 3, 2026
07c2892
Help add-in: a picture of the find box over Manage Keyboard Shortcuts…
KubaO Nov 3, 2026
30988b5
Callout evidence (items 15 and 8): every callout labelled BETA <n> na…
KubaO Nov 3, 2026
14fd1d7
recheck_callouts: --dry-run read by its camel-cased name (it relabell…
KubaO Nov 3, 2026
e235e20
WinReg: the none reason of its BETA NOTE says how to check it, since …
KubaO Nov 3, 2026
7b6cc36
Item 16: the 32-bit 'stall' was the IDE's error panel for -353703419 …
KubaO Nov 3, 2026
7c3b0a8
Item 17: BUGS entries single-division-by-zero-no-error (a division by…
KubaO Nov 3, 2026
aa1d6d3
Item 18, first part: 12 callouts lose test: none. GdiPlus and Generic…
KubaO Nov 3, 2026
ab7cb05
Item 18, second part: 8 more callouts lose test: none. package_tests …
KubaO Nov 3, 2026
3c0b184
Item 18, last part: OpenFile's empty-path NOTE is checked by probe sc…
KubaO Nov 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .github/actions/run-gates/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,13 @@ runs:
- name: Verify the package test markers and projects (check_package_tests.mjs)
shell: bash
run: node scripts/check_package_tests.mjs
# Every callout labelled BETA <n> names what checks it in a marker, which
# scripts/recheck_callouts.mjs runs on a new build, and every marker under
# docs/ names a reproducer, lane, sample, error data file or LLVM probe mode
# that exists. Sources only: no browser, no built tree, no install.
- name: Verify the evidence markers of labelled callouts (check_callout_evidence.mjs)
shell: bash
run: node scripts/check_callout_evidence.mjs
# Every page's Common Errors section is what scripts/errors.mjs write makes of the
# run-time error data under errors/, and the data is in order. Sources
# only: no twinBASIC, no VB6.
Expand Down
318 changes: 228 additions & 90 deletions BUGS-TO-REPORT.md

Large diffs are not rendered by default.

13 changes: 12 additions & 1 deletion WIP.Authoring.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,17 @@ summary line. That is the cue for a third. **Do not add `symbols:` to change how
ranks or to add a keyword a page merely mentions**: the index is what the page documents,
and a keyword such as `ElseIf` belongs on a page only when the page explains it.

### Compiler codes in the site search

**Every `TBnnnn` code a page explains has a search-index entry** (owner): `index` on the
section that says best when the compiler reports it, `index_also` on a strong second page, as
`docs/Documentation/Authoring.md` (*Index entries for the site search*) describes. A warning's
entry is its own heading on Compiler Warnings. TB5001, TB5027, TB5079 and TB5182, which code
of every kind gives, have theirs on the Diagnostics page's *Common errors* section, and a code
that only a contributed package's page mentions gets none (owner). A new page that explains a
code takes its entry, or takes it over from a weaker page; after `build.bat`,
`node eval/site_search.mjs TBnnnn` shows where a search for it lands.

### Cross-section linking

Relative links resolve against the **rendered URL** (the page's `permalink:`), not the file path. Pages that share a URL folder can use bare names (`[Y](Y)`); crossing folders needs `../` to climb out.
Expand Down Expand Up @@ -340,7 +351,7 @@ system remains a genuine consumer of the permalinks.
- tbIDE → flat, one page per CoClass / Class under `docs/Reference/Built-In/tbIDE/<Class>.md`; nested enums fold onto their declaring class's page (no `Enumerations/` sub-folder).
- WinNativeCommonCtls → single-file (`DTPicker`, `MonthView`, `ProgressBar`, `Slider`, `UpDown`) or folder-style (`ImageList/`, `ListView/`, `TreeView/`) when the control has sub-object companions. Module-level enums under `Enumerations/`; per-control nested enums fold onto the declaring control's page.
- Pick `<Mod>` from VBA's grouping (Information, Interaction, Strings, FileSystem, DateTime, Math, Financial, Conversion, ...) and the existing folders under `Reference/<Package>/`.
2. **Flag tB deviations** with a `> [!NOTE]` callout (see next section).
2. **Flag tB deviations** with a `> [!NOTE]` callout (see next section). A callout labelled `BETA <n>` names what checks it in `<!-- test: ... -->` on the line above it: a reproducer, a lane, a sample's `id=` (a `probe` the reader never sees, when the check would mean nothing on the page), error data, an LLVM probe mode, or `none -- <reason>` ([Authoring](docs/Documentation/Authoring.md#a-callout-names-what-checks-it); WIP.md, rule 6).
3. **Update the parent index** — turn an unlinked bullet into a link with a short blurb. Match the existing style of the page. If a new package is being added, also add a bullet to `docs/Reference/Built-In.md` (or `Default.md`) and bump the count on `docs/Reference/Packages.md` and `docs/Reference/index.md`. `Packages.md` itself only links to those two landing pages -- it does not enumerate packages.
4. **Add the page** to `Reference/Statements.md` or `Reference/Procedures and Functions.md` if it's a statement or callable and not already listed there.
5. **Run the [site integrity check](WIP.md#site-integrity-check)** after the batch and before committing.
Expand Down
19 changes: 17 additions & 2 deletions WIP.Errors.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,19 @@ exactly that.

Like WIP.md, this file is not rendered through tbdocs.

## Where things stand (2026-10-22)
## Where things stand (2026-11-02)

**Re-checked on BETA 1034 (2026-11-02):** `errors.mjs run --runtime tb --runtime win64` over
every file, 2,911 cases. 24 disagreed, each a fix in BETA 1034 that brings twinBASIC to VB6:
their rows are now plain rows and their filed reproducers are deleted
(`redim-inverted-bounds-error`, `cdate-string-decimal-out-of-range`,
`val-suffix-overflow-no-error`, `abs-minimum-widens-type`, `round-null-negative-digits`,
`string-null-character`). `trig-above-2-to-63` is fixed for Cos and Sin from 2^63 up only:
from 9,223,372,000,000,000,000 to 2^63 all three still return a value where VB6 raises 5,
and Tan still raises -2147348207 from 2^63 up (rows kept, the Cos and Sin ones split). Every
file's `beta:` is 1034. The changed pages (ReDim, CDate, Val, String, Abs, Cos, Sin, Round)
were run in all four runtimes and agree; VB6 and 64-bit VBA were not re-run for the rest.
The batch narratives below are as each batch left them.

**Batches 0, 1 and 2 are done, reviewed by the owner, and committed on `staging`.** The
tooling, the central page and every page of the VBA `Strings` module are in place: 339 cases
Expand Down Expand Up @@ -500,7 +512,10 @@ What the probes must respect (BETA 1010; `errors.mjs` already does all of it):
- **A case that crashes stops the probe, and every later case reports `none`** (`the probe
stopped before it ended: exception 0xc0000005`), as a hang does. Explore one page per probe
(a data file holding only that page), then one case per probe for a page that stops; a case
that crashes is a WARNING by hand, never a case.
that crashes is a WARNING by hand, never a case. A WARNING by hand names its reproducer in
`<!-- test: bug <slug> -->` on the line above it (and `errors <name>` when it cites the data's
rows too), as every callout labelled `BETA <n>` does (WIP.md, rule 6); the generated callouts
need none.
- **The probe is one module**: a case cannot declare a class, an interface or a `Type`. A
harness can hold a `Type`, an `Enum`, a `Declare` and procedures; a fact that needs a class
(`GetNameFromDispID` on a twinBASIC class) is checked with `tbrun` on a tree of its own and
Expand Down
23 changes: 19 additions & 4 deletions WIP.ExamplesBuild.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ a fence at all.
| `check_build` | compile this sample | --- |
| `check_run` | compile it, build it and run it, and compare what it prints with what the fence says it prints (a trailing comment on a `Debug.Print` line, up to a ` -- ` that starts a note, or the comment lines under `' Output:`, taken whole). Statement samples (`slot=sub`) only; `MsgBox`, `InputBox` and `End` are refused. See the dispatcher design below | --- |
| `hidden` | context for the page's samples, compiled with them and rendered to nothing. Implies `check_build` | --- |
| `probe` | a sample of its own that is rendered to nothing: it checks a statement of the page (named by `<!-- test: sample <id> -->`, which `check_callout_evidence.mjs` requires). Implies `check_build`; with `check_run` it is run. Needs `id=`; refused with `hidden` | --- |
| `arch=` | `win32`, `win64` or `win32,win64`: the architectures a `check_run` sample runs in. The win64 run is a copy, `<id>@win64`, batched apart with its page's hidden fences and built for win64 (`splitArches`). Refused on a sample not run and on a `projname` or `concat_group` member | `win32` |
| `slot=` | `file`, `module`, `sub`, `class` or `method` --- what to generate around it | inferred |
| `inherits=` | the class the sample is code-behind *of*; forces the Class row | --- |
| `project=` | which template project to build into | inferred from the page's path |
Expand Down Expand Up @@ -309,11 +311,13 @@ already consumes. Three whole ones exist:
| `packages` | the above plus all eleven other shipped packages | `Reference/Built-In/` and the package tutorials |
| `form` | `console`, a delta | a `check_run` sample that needs a real form: drawing, `Cls`, `Print`, `Scale`, a form property. Never inferred: a fence says `project=form` |
| `contributed-<Package>` | `console`, a delta: one `Settings` referencing one documented TWINSERV package, embedded | `Reference/Contributed/<Package>/` |
| `wnc-form` | `packages`, a delta: `form`'s Form1 with a ListView, `ListView1`, on it | a `check_run` sample that looks at what a WinNativeCommonCtls control draws. Never inferred |
| `activex-control` | `console`, a delta: an ActiveX Control project with a property page, `ProbePage`, and the designer file of a UserControl, `ProbeControl` | a sample of a UserControl: its `slot=file` fence is the class, naming that designer id, and a `projname=` of its own keeps it the only one in its project. Never inferred |

(The table is the three whole templates. The deltas over them --- `vb-private`, `cc-private`,
`wnc-private`, `cef-private`, `implicit`, `cef`, `webview2` --- are `TEMPLATE_BASE` in
`scripts/lib/example-batches.mjs`, with `form` and the `contributed-<Package>` ones, which
`TEMPLATE_BASE` gets from the directories so named.)
`wnc-private`, `wnc-form`, `activex-control`, `cef-private`, `implicit`, `cef`, `webview2` --- are
`TEMPLATE_BASE` in `scripts/lib/example-batches.mjs`, with `form` and the `contributed-<Package>`
ones, which `TEMPLATE_BASE` gets from the directories so named.)

**`contributed-<Package>`: packages embedded, not committed.** A project uses a TWINSERV
package by embedding its whole exported tree under `Packages/<symbolId>/`, with a reference
Expand All @@ -338,7 +342,7 @@ the repository's to commit: four of the nine ship no licence file, and WinReg em
and the Scripting Runtime itself. The WinReg landing page tells the reader the same.
- **An error inside an embedded package is the package's, and fails nothing**
(`splitPackageFaults`). WinReg 1.0.1.1 and ArrayListLib 1.6.151.1 do not compile on BETA
1010: each passes a pointer to a `ByRef` structure parameter without `ByVal` (TB5001). The
1034: each passes a pointer to a `ByRef` structure parameter without `ByVal` (TB5001). The
template-alone build finds those rows; the run prints them as a note naming the package
rather than as a template FAIL, every other template row still fails, and the samples are
judged by their own rows as before. Their landing pages say so in a NOTE, and both sections
Expand Down Expand Up @@ -554,6 +558,17 @@ not handle (`InStr(0, "abc", "a")` unhandled in a sample's body printed `[tbx-ru
Invalid procedure call or argument`, and the next sample ran), and `Resume tbxNext<n>`
clears it before the next call.

**`arch=` copies a run sample, it does not switch a batch.** A sample that names win64 is
copied by `splitArches` (`lib/example-run.mjs`) into a sample of its own, `<id>@win64`, with
the `hidden` fences and staged files of its page; the copies are batched by themselves, and
`stageBatch` hands each batch's `arch` to `compileProject`, which sets the build box on every
project (`setBuildTarget`), so a lane's IDE can open a win64 project after a win32 one. A copy is
judged under its own id, and the summary counts it with its sample. The check that this is a
64-bit run and not a relabelled 32-bit one: a `Declare` of msvbvm60's `rtcBeep`, which twinBASIC
does not redirect, ran in the win32 copy and raised `-353703418 Unable to load DLL` in the win64
one (BETA 1034). `--json` writes `ids.passed` and `ids.unrun`, which `recheck_callouts.mjs` judges
a `sample` item by.

### `vb6run --docs`

**`node scripts/vb6run.mjs --docs` compares the same fences with VB6.** It reads the
Expand Down
13 changes: 12 additions & 1 deletion WIP.Harness.md
Original file line number Diff line number Diff line change
Expand Up @@ -707,6 +707,15 @@ Rules it follows:
form loaded returns too: the IDE then prints `[DEBUGGER] Waiting for remaining forms to
close...` after the sentinel, which `sentinelIndex` allows and `tbrun` prints (BETA
1010). `check_twin_parsers` has fixtures for both.
- **An unhandled error in plain code stops the run at the IDE's error panel**, which waits
for a person, so `captureRun` ends the wait once the panel is open and `tbrun` names the
error (exit 5). The page holds the panel's text in `activeDebuggingErrorHeader` and
`activeDebuggingError`; `clearDebuggingCallframe` resets `activeDebuggingFrameId` and not
the text, so a set frame is what says the panel is open (BETA 1034). Before this,
`tbrun` reported such a probe that printed nothing first as a build that "did not reach
[BUILD] Executing": the build, the probe's `Debug.Cls` and the stop all fell between two
polls, the console read as empty before and after, and the erased Executing line was
looked for only when the console changed. It is now looked for on every poll of the build.
- **`tbrun --exe` exits 6 when the exe exited with a code other than 0**, when the event
log records that it faulted, when it opened a box, or when it was still running at
`--timeout` and was ended. A run that would exit 5 exits 5 first, since the
Expand Down Expand Up @@ -786,7 +795,9 @@ an `Integer` and `Err.Number` a `Long`. The tests here use `Assert.Strict`.
**A compile-time defect is a compile case**: a line ending `' CASE <Name>: <codes>`,
`: error` or `: none`, judged against the diagnostics of the compile (`judgeCompiles`). `error`
is for a defect whose fix may choose its own diagnostic, so the case does not fail on a code it
cannot predict. A project with compile errors runs none of its `[TestCase]`s.
cannot predict. A project with compile errors runs none of its `[TestCase]`s. A comment
`' CASE <Name>: package <code> <file>:<line>` names a row of an embedded package's sources, since
a package that does not compile has no line of the project's to end in a comment.

### Measuring LLVM

Expand Down
20 changes: 20 additions & 0 deletions WIP.PackageTests.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,26 @@ package embedded and judges with the rest. The published project stays `Sources/
compiles, so the author's Sub Main still runs every run-time case; the compile cases are the
documentation's own re-check on each new build and version.

"This package does not compile" is a claim of the same kind, and it is true of the package's own
source, where no line can carry a comment of ours. So a compile case can name a row instead, with
`package <code> <file>:<line>`, which pins the package's version as well as the build. ArrayListLib
and WinReg stay in `PENDING` (no test project until a version compiles, owner) with `compile/`
alone, which `check_package_tests.mjs` checks both ways: each case named by a marker, each marker
naming a case. The published project, and so `Sources/`, stays out of it.

A case in the IDE runs in the IDE's process, which has already started GDI+ and has no server that
speaks TLS. So `exe/` is a third project, run with `tbrun --exe`: its cases are ordinary
`[TestCase]`s, so a marker and `expect.json` need nothing new, and `recheck_callouts.mjs` reaches
them through `package_tests.mjs`. One process runs them all, which saves a build per case and makes
order matter: GDI+ stays started once a `GdiPlusUser` has started it, so the cases that need it
stopped come first. `TBMANLIB/exe/server.mjs` makes its certificate on every run, with the DER
written by hand, so that no private key is kept in the repository.

A claim that depends on the date goes through a stand-in, not a case that reads the clock:
TBMANLIB_Diagnostic's `TimeZoneStandIn` overwrites the start of `GetTimeZoneInformation` for the
length of a call, in the IDE's process, as DetoursLib's cases do with `MulDiv`, so the defect shows
in every month and on any machine, with a standard-time case as its control.

## Markers, and a gate that only tightens

A callout names its cases in an HTML comment on the line above it. The marker lives with the
Expand Down
2 changes: 1 addition & 1 deletion WIP.Screenshots.md
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ Exit codes: 0 every picture written or unchanged, 1 a picture failed, 2 the tool
(`scripts/lib/shot-change.mjs`), and the sheet shows the `--cleanup` command beside its
`git checkout` one. On the BETA 1033 retake its dry run puts back none of the 329 modified
pictures.
- **Setups**: one IDE each --- `no-project` (menus, dialogs, panels), `help` (the add-in's eight,
- **Setups**: one IDE each --- `no-project` (menus, dialogs, panels), `help` (the add-in's nine,
`test/addin/helpdemo`), `project`, `sample`, the `settings` setups, `glyphs`, `global-search`
(Sample 15 exported from the install, built into the lane's copy as an add-in, its own project
opened; once a search settles, its results list is told through its own `notifyChangedItem`
Expand Down
Loading
Loading