• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

source-academy / js-slang / 35596248067
86%

Build:
DEFAULT BRANCH: master
Ran 21 Sep 2026 11:56AM UTC
Jobs 1
Files 179
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

21 Sep 2026 11:50AM UTC coverage: 78.97% (-0.006%) from 78.976%
35596248067

push

github

web-flow
feat(conductor): substitution stepper for Source §1–§2 (#2064)

* feat(conductor): substitution stepper for Source §1-§2

Implements #2063. SourceStepperEvaluator1/2 push the substitution
stepper's steps to the host's Stepper tab.

§1/§2 only: the stepper explains evaluation *as substitution*, which
stops being the right account once §3 introduces mutation. The legacy
tab draws the same line (chapter <= 2), as does py-slang with
PyStepperEvaluator1/2.

No SyntaxProfile. @sourceacademy/common-stepper's host renderer defaults
to the Source/JavaScript one, so js-slang gets correct rendering by
supplying nothing at all — BaseStepperRunnerPlugin.getSyntaxProfile()
returns undefined and that default is exactly right here. py-slang has
to ship a full profile only because Python's surface syntax is not the
default.

As with the CSE slice, the new code is a serialiser: runner-stepper owns
the channel wiring, the host's replay request, error reporting and step
caching, and a language implements one method, getSteps(ast).

Two things do not survive a MessageChannel and are what the serialiser
exists for:

- Methods. The stepper AST is class instances (StepperBinaryExpression
  and friends) whose data lives in own enumerable fields and whose
  behaviour lives on the prototype, so copying own properties keeps
  exactly the data and drops exactly the methods.
- Object identity. A Marker points at its redex by reference; the
  protocol replaces that with redexId, referring to a nodeId assigned
  during the walk. A redex that is not part of its step's own tree
  yields redexId: null rather than a dangling id.

The host's step limit is read per run rather than fixed at construction
(py-slang shipped a hardcoded 1000 and had to fix it — py-slang#427).

Tests compare against js-slang's own getSteps rather than snapshotting
the serialiser's output: step count, per-step node type, marker count
and explanations. Plus three protocol invariants over the same corpus —
every r... (continued)

3358 of 4468 branches covered (75.16%)

Branch coverage included in aggregate %.

61 of 76 new or added lines in 3 files covered. (80.26%)

7378 of 9127 relevant lines covered (80.84%)

249526.56 hits per line

Uncovered Changes

Lines Coverage ∆ File
9
72.41
src/conductor/SourceStepperEvaluator.ts
5
16.67
src/conductor/stepper/SourceStepperRunnerPlugin.ts
1
91.07
src/conductor/stepper/serialize.ts
Jobs
ID Job ID Ran Files Coverage
1 35596248067.1 21 Sep 2026 11:56AM UTC 179
78.97
GitHub Action Run
Source Files on build 35596248067
  • Tree
  • List 179
  • Changed 1
  • Source Changed 0
  • Coverage Changed 1
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 21549434 on github
  • Prev Build on master (#35590600188)
  • Next Build on master (#35599642065)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc