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

source-academy / frontend / 35598234767
46%

Build:
DEFAULT BRANCH: master
Ran 21 Sep 2026 12:15PM UTC
Jobs 1
Files 475
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 12:12PM UTC coverage: 45.875% (+0.01%) from 45.864%
35598234767

push

github

web-flow
fix(cse): render Source's empty list and global frame correctly (#4396)

The CSE snapshot adapter was written against py-slang's shape. js-slang's
Conductor CSE evaluators (source-academy/js-slang#2061) expose two places
where that shape does not fit Source.

1. The empty list. The adapter maps the labels nonetype/none/null to a
   `{ toReplString: () => 'None' }` stand-in, deliberately avoiding the
   ArrayNullUnit visual — right for Python, wrong for Source, where the
   empty list *is* that visual and terminates every box-and-pointer
   diagram. js-slang therefore labels Source's null 'empty_list', which
   this maps to a real JS null.

2. The global frame. py-slang's global frame is genuinely empty (its
   builtins live in nativeStorage), so the adapter injects a
   ':::pre-declared names::' sentinel to stand in for them. js-slang puts
   every builtin in the global environment's own head, so that frame
   arrives full and the sentinel is just a spurious extra row. It is now
   injected only when the frame has no bindings of its own.

Dropping the sentinel exposed a latent bug in Frame: it moves the
sentinel to the front of the global frame's bindings, but when the
sentinel is absent findIndex returns -1 and `splice(-1, 1)` reads that as
"the last entry" — silently promoting an unrelated binding to the front.
Demonstrated by mutation: without the guard, a global frame bound
first/middle/last renders as last/first/middle. This is not specific to
Conductor; js-slang's global frame has never carried the sentinel, so the
legacy Source CSE tab hits it too.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

3174 of 7890 branches covered (40.23%)

Branch coverage included in aggregate %.

5 of 6 new or added lines in 2 files covered. (83.33%)

3 existing lines in 1 file now uncovered.

7179 of 14678 relevant lines covered (48.91%)

31.6 hits per line

Uncovered Changes

Lines Coverage ∆ File
1
87.56
0.64% src/features/cseMachine/components/Frame.tsx

Coverage Regressions

Lines Coverage ∆ File
3
34.38
-1.44% src/commons/sideContent/content/SideContentCseMachine.tsx
Jobs
ID Job ID Ran Files Coverage
1 35598234767.1 21 Sep 2026 12:15PM UTC 475
45.87
GitHub Action Run
Source Files on build 35598234767
  • Tree
  • List 475
  • Changed 3
  • Source Changed 0
  • Coverage Changed 3
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 7c7a993c on github
  • Prev Build on master (#35524551118)
  • Next Build on master (#35599462978)
  • Delete
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