Skip to content

Report the real port status, and fix the desktop-port defects it was hiding - #5501

Open
shai-almog wants to merge 86 commits into
masterfrom
fix-port-status-parity
Open

Report the real port status, and fix the desktop-port defects it was hiding#5501
shai-almog wants to merge 86 commits into
masterfrom
fix-port-status-parity

Conversation

@shai-almog

@shai-almog shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

Why

The Port Status page reported almost every port as partial, skipped or stale. Most of that was the reporting pipeline lying about healthy ports; the rest was real defects in the desktop ports that nothing was failing on.

Before / after, from a local build of the page:

before now
green port cards 3 of 11 9 of 11
columns rendered entirely stale 7 0
ports with a report inside the staleness window 4 of 11 11 of 11

Every port now publishes a current report, so no column falls back to a
checked-in copy and none renders stale. Nine are green on this branch. The two
Windows cards are the remaining gap and are being worked in this PR, not
deferred: windows-x64 reports pass=166 fail=4, against master's pass=160
fail=7 — and master ships those seven under a green workflow, because
Windows was the only producer that never set CN1SS_FAIL_ON_TEST_PROBLEMS.
The four that remain are AudioMixerApiTest, VideoIORoundTripTest,
KotlinUiTest and SwitchThemeScreenshotTest.

Reporting pipeline

Every fresh Apple report was being thrown away. sync_port_status_reports.sh re-implemented the publish rule as a jq expression demanding a measured duration for all ten performance workloads. iOS, tvOS and watchOS legitimately skip the three GC-footprint workloads on the simulator (performance.skipped, which the normalizer supports and has a unit test for), so each night's report was rejected, the site fell back to the checked-in copy, and after fourteen days those four columns went stale.

The rule now lives once, in port_status.py (publishable_report_problems + an accept subcommand the shell calls), beside the normalizer whose tests already covered skipped workloads. Contract drift — a report produced before a newly registered test — keeps the fallback with a warning; a malformed report now fails the website build instead of degrading quietly. Six new tests cover it, including one asserting every checked-in report is itself publishable.

Linux and Windows have never published a report. port-status-publish.yml reacts to workflow_run, and those events are not delivered for those two producers — Android/iOS/macOS/JavaScript get a publish run about three seconds after their run completes, Linux and Windows get none, and the data branch has no linux-* or windows-x64 file in its entire history. Rather than keep guessing at that, the nightly now runs backfill_port_status.sh: it publishes from the newest completed master run of every producing workflow and then fails if any port lacks a report inside the contract's staleness window, so a silent producer is a red workflow instead of a grey column.

Nothing failed when a compliance test failed. Only the Android pipeline set CN1SS_FAIL_ON_TEST_PROBLEMS. iOS (4 legs), macOS and JavaScript now set it too — all three are at zero failures and zero never-run tests today, so it is a ratchet, not a new red.

Presentation. A skip the errata account for by name now renders as a pass with a marked note (✓*) and its own legend entry, and the page validator refuses a noted cell whose test the errata do not cover. A run that stopped early no longer withdraws the result of a feature whose every mapped test reported back — the unreached tests still show as not-run and the port card still says the run was incomplete.

Desktop port defects

Each of these was reproduced against the ParparVM clean target before and after the fix.

  • Fixed offsets were resolved through the host time zone database. java.time converted a ZoneOffset to "GMT-05:00" and handed it to the platform. POSIX inverts the sign of a TZ offset, and the Windows CRT cannot parse the form at all, so every OffsetDateTime formatted through a pattern came out shifted by twice its offset — 2020-03-08T01:30-05:00 printed as 11:30-05:00. Custom GMT/UTC/UT IDs are now resolved in Java, and a ZoneOffset never reaches the host database. All of TimeApiTest's zone assertions pass locally now, including both DST transitions.
  • Offsets came from Calendar, which rebuilds local time from a raw offset plus a flat one-hour daylight guess. They now come from TimeZone.getOffset, which consults the platform's real rules.
  • Character.getType threw UnsupportedOperationException, so isLetter, isLetterOrDigit, isJavaIdentifierStart and isJavaIdentifierPart threw for every input on these ports. ASCII now has a category table; above it the answer comes from the primitives this runtime actually implements.
  • openInputStream returned a stream over a null file handle for a missing path, so a caller could not distinguish a missing file from an empty one — issue on iOS openInputStream for non-existent file do not throw FileNotFoundException #1502's exact defect, on both desktop ports. openOutputStream and the storage streams discarded writes the same way.
  • The Linux port carried the Windows port's backslash path join, so its staged-resource fallback never resolved.
  • CameraApiTest assumed the native Linux port had a headless camera. It drives real V4L2 devices through GStreamer, which a hosted runner does not have, so it now skips with a stated reason like the other native ports; the existing camera erratum covers it.
  • The Linux capture harness accepts CN1_REQUIRE_SUITE, so it can demand the suite's own completion marker instead of stopping once screenshots go quiet — which it did while DesktopMode, the VideoIO grid, the VR scene and the 360 panorama were still queued, leaving every trailing test reported as never run.

Crypto (added after the first review round)

Both desktop ports now answer the whole com.codename1.security surface, which CryptoApiTest was failing at its first call:

  • Linux goes through OpenSSL's EVP layer — secure random, AES in GCM/CBC/ECB, RSA with OAEP or PKCS#1, SHA-2 signatures, RSA key generation. libcrypto comes with the libcurl the port already links. The implementation was exercised against real libcrypto off-device before landing: GCM round trip, tamper and wrong-AAD rejection, CBC with padding, OAEP round trip, and sign/verify including tampered-data and wrong-key rejection.
  • Windows goes through CNG, with crypt32 doing the ASN.1 between the documented DER encodings and BCRYPT_RSAKEY_BLOB.
  • Keys cross the boundary as X.509 SubjectPublicKeyInfo and PKCS#8 PrivateKeyInfo, so no DER is parsed by hand. A failed operation raises rather than returning an empty array — an authentication failure that answered "no bytes" would read as a successful decryption of nothing.

The shared UTF-8 buffer

stringToUTF8 returns one buffer per thread and overwrites it on every call, so a native that converted a second String silently repointed the first result at the second string. Five natives in the Linux port did exactly that:

  • fileRename renamed a file onto itself — which is why WAVWriter's rename step left AudioMixerApiTest with no output;
  • httpSetHeader sent every request header as "value: value";
  • printDocument, showNotification and shareText each collapsed their arguments onto the last one.

They now copy through cn1LinuxJStrDup, documented in the header as mandatory for any native converting more than one String. The Windows port was already safe — its wide-string helper allocates.

Still red after this change

Stated plainly rather than hidden:

  • Two tests block the event dispatch threadMedia360PanoramaScreenshotTest on Linux and CalendarApiTest on Windows. The runner's per-test deadline is enforced by an EDT callback, so a test that blocks the thread outright could never be timed out: the suite just stopped, mid-log-line, and every later test was published as "never run" with nothing naming the cause. A watchdog thread now reports the responsible test and exits, so the report attributes the failure instead of silently truncating. Fixing the two tests themselves needs profiling on those platforms — the Linux one is most likely the software Mesa rasterizer taking minutes over a stereo 360 sphere.
  • java.util.Calendar still mishandles daylight saving on these ports. java.time no longer depends on it; the legacy class is a separate fix.

Verification

  • port_status.py validate and the 16 normalizer tests pass.
  • The website builds locally and validate_port_status.mjs passes against the generated page.
  • backfill_port_status.sh was dry-run against the live GitHub API: it selects the newest master run for all seven producing workflows and would publish the seven stale or missing reports.
  • The Linux and Windows port modules compile; the java.time, TimeZone and Character fixes were each verified by building and running a probe through the ParparVM clean target.

🤖 Generated with Claude Code

…hiding

The Port Status table showed almost every column as partial, skipped or
stale. Most of that was the reporting pipeline, not the ports.

Reporting
- scripts/website/sync_port_status_reports.sh re-implemented the publish
  rule as a jq expression that demanded a measured duration for all ten
  performance workloads. iOS, tvOS and watchOS legitimately skip the three
  GC-footprint workloads on the simulator, so every fresh Apple report was
  rejected, the site served the checked-in fallback, and after fourteen days
  those four columns rendered as stale. The rule now lives once in
  port_status.py (publishable_report_problems + the "accept" subcommand)
  next to the normalizer whose own tests already covered skipped workloads.
  Contract drift keeps the fallback with a warning; a malformed report fails
  the website build instead of quietly degrading.
- port-status-publish.yml only publishes when a workflow_run event reaches
  it, and those events never arrive for the Linux and Windows suites: the
  data branch has never held a linux or windows-x64 report. The nightly now
  runs backfill_port_status.sh, which publishes from the newest master run
  of every producing workflow and fails when a port has no report inside
  the contract's staleness window.
- Only the Android pipeline failed on a failing compliance test. iOS,
  macOS and JavaScript now do too; all three are at zero failures, so this
  is a ratchet rather than a new red.
- A skip the errata account for by name renders as a pass with a marked
  note instead of a partial, and the page validator refuses a noted cell
  whose test the errata do not cover. A run that stopped early no longer
  withdraws the result of a feature whose every mapped test reported back.
- The checked-in reports are refreshed, including the real (failing) Linux
  and Windows results, so the fallback states what those ports actually do.

Desktop ports
- java.time asked the host for the rules of a fixed offset by handing
  "GMT-05:00" to the platform time zone database. POSIX inverts the sign of
  a TZ offset and the Windows CRT cannot parse the form at all, so every
  OffsetDateTime formatted through a pattern came out shifted by twice its
  offset. Custom GMT/UTC IDs are now resolved in Java, and a ZoneOffset
  never reaches the host database.
- Offsets now come from TimeZone.getOffset rather than from Calendar, which
  reconstructs local time from a raw offset plus a flat one-hour daylight
  guess.
- Character.getType threw UnsupportedOperationException, which meant
  isLetter, isLetterOrDigit and isJavaIdentifierStart/Part threw for every
  input on these ports. ASCII now has a category table and the rest answers
  from the primitives this runtime implements.
- openInputStream returned a stream wrapping a null file handle for a
  missing path, so callers could not tell a missing file from an empty one
  (issue #1502 on both desktop ports); openOutputStream and the storage
  streams silently discarded writes the same way.
- The Linux port carried the Windows port's backslash path join, so its
  staged-resource fallback never resolved.
- CameraApiTest treated the native Linux port as having a headless camera.
  It drives real V4L2 devices through GStreamer, which a hosted runner does
  not have, so it now skips with a stated reason like the other native
  ports.
- The Linux capture harness accepts CN1_REQUIRE_SUITE, so it can demand the
  suite's own completion marker rather than stopping when screenshots go
  quiet while trailing tests are still queued.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: aad27d0718

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/hellocodenameone/conformance/backfill_port_status.sh Outdated
Comment thread vm/JavaAPI/src/java/time/DateTimeSupport.java
Comment thread vm/JavaAPI/src/java/lang/Character.java
@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ByteCodeTranslator: 0 findings (no issues)
    • android: 0 findings (no issues)
    • codenameone-maven-plugin: 0 findings (no issues)
    • core-unittests: 0 findings (no issues)
    • ios: 0 findings (no issues)
  • PMD: 0 findings (no issues) [Report archive]
  • Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

  • Tests: 423 total, 0 failed, 14 skipped

Benchmark Results

  • Execution Time: 15826 ms

  • Hotspots (Top 20 sampled methods):

    • 23.45% com.codename1.tools.translator.Parser.addToConstantPool (337 samples)
    • 6.33% java.util.ArrayList.indexOf (91 samples)
    • 3.90% com.codename1.tools.translator.ByteCodeClass.fillVirtualMethodTable (56 samples)
    • 3.76% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (54 samples)
    • 3.34% java.lang.StringBuilder.append (48 samples)
    • 2.57% com.codename1.tools.translator.Parser.cn1EnsureSubclassIndex (37 samples)
    • 2.51% com.codename1.tools.translator.BytecodeMethod.optimize (36 samples)
    • 2.23% com.codename1.tools.translator.BytecodeMethod.equals (32 samples)
    • 2.23% com.codename1.tools.translator.Parser.classIndex (32 samples)
    • 1.67% org.objectweb.asm.tree.analysis.Analyzer.analyze (24 samples)
    • 1.60% java.util.HashMap.hash (23 samples)
    • 1.39% com.codename1.tools.translator.bytecodes.Invoke.resolveDirectTarget (20 samples)
    • 1.32% com.codename1.tools.translator.bytecodes.Invoke.findMethodUp (19 samples)
    • 1.25% java.lang.String.equals (18 samples)
    • 1.18% java.lang.Object.hashCode (17 samples)
    • 1.11% org.objectweb.asm.ClassReader.readCode (16 samples)
    • 1.04% com.codename1.tools.translator.NativeSymbolIndex.<init> (15 samples)
    • 1.04% java.io.FileOutputStream.open0 (15 samples)
    • 0.97% com.codename1.tools.translator.BytecodeMethod.appendCMethodPrefix (14 samples)
    • 0.90% java.util.TreeMap.getEntry (13 samples)
  • ⚠️ Coverage report not generated.

Static Analysis

  • ✅ SpotBugs: no findings (report was not generated by the build).
  • ⚠️ PMD report not generated.
  • ⚠️ Checkstyle report not generated.

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 146 screenshots: 146 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 59ms / native 3ms = 19.6x speedup
SIMD float-mul (64K x300) java 61ms / native 3ms = 20.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 144.000 ms
Base64 CN1 decode 100.000 ms
Base64 SIMD encode 78.000 ms
Base64 encode ratio (SIMD/CN1) 0.542x (45.8% faster)
Base64 SIMD decode 77.000 ms
Base64 decode ratio (SIMD/CN1) 0.770x (23.0% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 19.000 ms
Image createMask (SIMD on) 17.000 ms
Image createMask ratio (SIMD on/off) 0.895x (10.5% faster)
Image applyMask (SIMD off) 33.000 ms
Image applyMask (SIMD on) 27.000 ms
Image applyMask ratio (SIMD on/off) 0.818x (18.2% faster)
Image modifyAlpha (SIMD off) 32.000 ms
Image modifyAlpha (SIMD on) 22.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.688x (31.3% faster)
Image modifyAlpha removeColor (SIMD off) 120.000 ms
Image modifyAlpha removeColor (SIMD on) 29.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.242x (75.8% faster)

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 151 screenshots: 151 matched.

Native Android coverage

  • 📊 Line coverage: 8.15% (7924/97227 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.13% (41973/515969), branch 2.88% (1405/48721), complexity 3.19% (1665/52263), method 4.91% (1357/27634), class 10.00% (368/3680)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 8.15% (7924/97227 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.13% (41973/515969), branch 2.88% (1405/48721), complexity 3.19% (1665/52263), method 4.91% (1357/27634), class 10.00% (368/3680)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 120ms / native 126ms = 0.9x speedup
SIMD float-mul (64K x300) java 174ms / native 143ms = 1.2x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 67.000 ms
Base64 native encode 297.000 ms
Base64 encode ratio (CN1/native) 0.202x (79.8% faster)
Base64 native decode 245.000 ms
Base64 decode ratio (CN1/native) 0.273x (72.7% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 146 screenshots: 146 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 57ms / native 3ms = 19.0x speedup
SIMD float-mul (64K x300) java 59ms / native 4ms = 14.7x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 172.000 ms
Base64 CN1 decode 120.000 ms
Base64 SIMD encode 97.000 ms
Base64 encode ratio (SIMD/CN1) 0.564x (43.6% faster)
Base64 SIMD decode 91.000 ms
Base64 decode ratio (SIMD/CN1) 0.758x (24.2% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 24.000 ms
Image createMask (SIMD on) 25.000 ms
Image createMask ratio (SIMD on/off) 1.042x (4.2% slower)
Image applyMask (SIMD off) 50.000 ms
Image applyMask (SIMD on) 184.000 ms
Image applyMask ratio (SIMD on/off) 3.680x (268.0% slower)
Image modifyAlpha (SIMD off) 45.000 ms
Image modifyAlpha (SIMD on) 39.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.867x (13.3% faster)
Image modifyAlpha removeColor (SIMD off) 50.000 ms
Image modifyAlpha removeColor (SIMD on) 33.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.660x (34.0% faster)

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 148 screenshots: 148 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 148 screenshots: 148 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 144 screenshots: 144 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 217 screenshots: 217 matched.
✅ Native Apple Watch (watchOS, Core Graphics) screenshot tests passed.

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 146 screenshots: 146 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 56ms / native 4ms = 14.0x speedup
SIMD float-mul (64K x300) java 54ms / native 3ms = 18.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 246.000 ms
Base64 CN1 decode 128.000 ms
Base64 SIMD encode 64.000 ms
Base64 encode ratio (SIMD/CN1) 0.260x (74.0% faster)
Base64 SIMD decode 61.000 ms
Base64 decode ratio (SIMD/CN1) 0.477x (52.3% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 13.000 ms
Image createMask (SIMD on) 7.000 ms
Image createMask ratio (SIMD on/off) 0.538x (46.2% faster)
Image applyMask (SIMD off) 24.000 ms
Image applyMask (SIMD on) 18.000 ms
Image applyMask ratio (SIMD on/off) 0.750x (25.0% faster)
Image modifyAlpha (SIMD off) 15.000 ms
Image modifyAlpha (SIMD on) 11.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.733x (26.7% faster)
Image modifyAlpha removeColor (SIMD off) 20.000 ms
Image modifyAlpha removeColor (SIMD on) 12.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.600x (40.0% faster)

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 143 screenshots: 143 matched.
✅ Native iOS screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 514 seconds

Build and Run Timing

Metric Duration
Simulator Boot 96000 ms
Simulator Boot (Run) 1000 ms
App Install 17000 ms
App Launch 4000 ms
Test Execution 543000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 135ms / native 5ms = 27.0x speedup
SIMD float-mul (64K x300) java 180ms / native 5ms = 36.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 318.000 ms
Base64 CN1 decode 187.000 ms
Base64 native encode 448.000 ms
Base64 encode ratio (CN1/native) 0.710x (29.0% faster)
Base64 native decode 391.000 ms
Base64 decode ratio (CN1/native) 0.478x (52.2% faster)
Base64 SIMD encode 95.000 ms
Base64 encode ratio (SIMD/CN1) 0.299x (70.1% faster)
Base64 SIMD decode 58.000 ms
Base64 decode ratio (SIMD/CN1) 0.310x (69.0% faster)
Base64 encode ratio (SIMD/native) 0.212x (78.8% faster)
Base64 decode ratio (SIMD/native) 0.148x (85.2% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 14.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.214x (78.6% faster)
Image applyMask (SIMD off) 69.000 ms
Image applyMask (SIMD on) 170.000 ms
Image applyMask ratio (SIMD on/off) 2.464x (146.4% slower)
Image modifyAlpha (SIMD off) 151.000 ms
Image modifyAlpha (SIMD on) 186.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.232x (23.2% slower)
Image modifyAlpha removeColor (SIMD off) 295.000 ms
Image modifyAlpha removeColor (SIMD on) 89.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.302x (69.8% faster)

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 181 screenshots: 181 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 149 screenshots: 149 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 679 seconds

Build and Run Timing

Metric Duration
Simulator Boot 96000 ms
Simulator Boot (Run) 0 ms
App Install 17000 ms
App Launch 4000 ms
Test Execution 483000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 93ms / native 3ms = 31.0x speedup
SIMD float-mul (64K x300) java 108ms / native 4ms = 27.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 515.000 ms
Base64 CN1 decode 140.000 ms
Base64 native encode 874.000 ms
Base64 encode ratio (CN1/native) 0.589x (41.1% faster)
Base64 native decode 421.000 ms
Base64 decode ratio (CN1/native) 0.333x (66.7% faster)
Base64 SIMD encode 82.000 ms
Base64 encode ratio (SIMD/CN1) 0.159x (84.1% faster)
Base64 SIMD decode 58.000 ms
Base64 decode ratio (SIMD/CN1) 0.414x (58.6% faster)
Base64 encode ratio (SIMD/native) 0.094x (90.6% faster)
Base64 decode ratio (SIMD/native) 0.138x (86.2% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 13.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.231x (76.9% faster)
Image applyMask (SIMD off) 66.000 ms
Image applyMask (SIMD on) 66.000 ms
Image applyMask ratio (SIMD on/off) 1.000x (0.0% slower)
Image modifyAlpha (SIMD off) 59.000 ms
Image modifyAlpha (SIMD on) 132.000 ms
Image modifyAlpha ratio (SIMD on/off) 2.237x (123.7% slower)
Image modifyAlpha removeColor (SIMD off) 275.000 ms
Image modifyAlpha removeColor (SIMD on) 200.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.727x (27.3% faster)

…native semantics

- backfill_port_status.sh published whatever the newest run produced. A report
  built against an older contract passes the freshness check but is rejected by
  the website sync, so the column would stay on its stale fallback while the
  sweep reported success. Each artifact now goes through "port_status.py
  accept" before publication, and the closing assertion re-checks the published
  file instead of only its timestamp -- which is how windows-arm64's drifted
  report now surfaces.
- CN1_REQUIRE_SUITE is now set by both Linux legs. Left unset, the new branch
  in the capture harness was unreachable and both jobs kept the screenshot
  stabilization exit that kills the suite while DesktopMode, the VideoIO grid,
  the VR scene and the 360 panorama are still queued.
- The shared offset lookup passes UTC fields. The POSIX native resolves them
  with timegm and the JavaScript runtime with Date.UTC, but the iOS native
  built its NSDate from [NSCalendar currentCalendar], reading them in the
  device's zone; near a transition that lands on the wrong side of it. It now
  builds the date in UTC, and no longer drops the hour and second components.
- Character.getType collapsed every non-ASCII whitespace code point to
  SPACE_SEPARATOR. U+2028 and U+2029 are LINE_SEPARATOR and PARAGRAPH_SEPARATOR
  and U+180E is FORMAT, all of which isWhitespace already treats individually.
- The page validator matched the note marker with quoted attributes, which the
  production build minifies away, so the check failed on CI and passed locally.
- java.time/DateTimeSupport.java carries the project header; java.util.TimeZone
  keeps its Apache Harmony notice and is recorded in the exclusions list.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3c58dcc345

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread vm/JavaAPI/src/java/time/DateTimeSupport.java Outdated
Comment thread scripts/hellocodenameone/conformance/port_status.py
@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

The first CI run on this branch confirmed the time zone, Character.getType
and openInputStream fixes -- TimeApiTest, SurfacesPublishTest and
FileSystemStorageOpenInputStreamMissingTest all pass on Linux now -- and the
new exceptions turned two silent write failures into named ones.

- getAppHomePath() returned a bare path on both desktop ports. Android and
  iOS return it with the file:// scheme, and com.codename1.io.File prepends
  the app home to any path that lacks the scheme, so
  new File(fs.getAppHomePath() + "x") resolved to the home directory joined
  to itself: AudioMixerApiTest was asking to write
  ".../codenameone//home/runner/.local/share/codenameone/audio-mixer-api-test.wav".
  Both ports now return the scheme and implement toNativePath.
- The Windows port never overrode getAppHomePath at all, so it inherited
  listFilesystemRoots()[0] + AppName, which is a drive root plus the literal
  string "null" when no app name is set. It now anchors on the same per-user
  storage directory the Linux port uses.
- cn1StorageDir() created only the leaf directory. A home without an existing
  ~/.local/share -- a fresh CI runner, or a new account -- left the storage
  directory absent, so every write into it failed at fopen(); that is why
  ClipboardRoundTripTest could not create its file. The path is now created
  component by component.
- Both ports record why the last open failed and include it in the exception,
  so a missing directory is distinguishable from a permission or sharing
  problem without another CI round trip.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a2cb05fce5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Ports/WindowsPort/src/com/codename1/impl/windows/WindowsImplementation.java Outdated
Comment thread scripts/hellocodenameone/conformance/backfill_port_status.sh Outdated
Comment thread docs/website/layouts/partials/port-status-feature-status.html Outdated
@shai-almog

shai-almog commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 148 screenshots: 148 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 295 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 98ms / native 7ms = 14.0x speedup
SIMD float-mul (64K x300) java 111ms / native 9ms = 12.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 167.000 ms
Base64 CN1 decode 96.000 ms
Base64 native encode 587.000 ms
Base64 encode ratio (CN1/native) 0.284x (71.6% faster)
Base64 native decode 435.000 ms
Base64 decode ratio (CN1/native) 0.221x (77.9% faster)
Base64 SIMD encode 50.000 ms
Base64 encode ratio (SIMD/CN1) 0.299x (70.1% faster)
Base64 SIMD decode 48.000 ms
Base64 decode ratio (SIMD/CN1) 0.500x (50.0% faster)
Base64 encode ratio (SIMD/native) 0.085x (91.5% faster)
Base64 decode ratio (SIMD/native) 0.110x (89.0% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.500x (50.0% faster)
Image applyMask (SIMD off) 65.000 ms
Image applyMask (SIMD on) 57.000 ms
Image applyMask ratio (SIMD on/off) 0.877x (12.3% faster)
Image modifyAlpha (SIMD off) 58.000 ms
Image modifyAlpha (SIMD on) 55.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.948x (5.2% faster)
Image modifyAlpha removeColor (SIMD off) 59.000 ms
Image modifyAlpha removeColor (SIMD on) 58.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.983x (1.7% faster)

…misuse

Crypto
- The Linux port answers the whole com.codename1.security surface through
  OpenSSL's EVP layer: secure random, AES in GCM/CBC/ECB, RSA with OAEP or
  PKCS#1, SHA-2 signatures and RSA key generation. Keys cross the boundary in
  the encodings the portable API documents -- X.509 SubjectPublicKeyInfo and
  PKCS#8 PrivateKeyInfo -- so d2i_PUBKEY and d2i_PKCS8_PRIV_KEY_INFO do the
  ASN.1 and nothing parses DER by hand. libcrypto comes with the libcurl the
  port already links.
- The Windows port answers the same surface through CNG, with crypt32 doing
  the ASN.1 between those DER encodings and BCRYPT_RSAKEY_BLOB.
- A failed operation raises rather than returning an empty array: an
  authentication failure that answered "no bytes" would read as a successful
  decryption of nothing. GCM keeps the tag appended to the ciphertext, which
  is the convention the portable API documents.
- The OpenSSL implementation was exercised against libcrypto off-device
  before landing: GCM round trip, tamper and wrong-AAD rejection, CBC with
  padding, OAEP round trip, and sign/verify including tampered-data and
  wrong-key rejection.

stringToUTF8 aliasing
  stringToUTF8 returns one buffer per thread and overwrites it on every call,
  so a native that converted a second String silently repointed the first
  result at the second string. Five natives in the Linux port did exactly
  that:
  - fileRename renamed a file onto itself, which is why WAVWriter's rename
    step left AudioMixerApiTest without its output;
  - httpSetHeader sent every request header as "value: value";
  - printDocument, showNotification and shareText each collapsed their
    arguments onto the last one.
  They now copy through cn1LinuxJStrDup, which the header documents as
  mandatory for any native converting more than one String. The Windows port
  was already safe -- its wide-string helper allocates.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8dd4c6a954

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Ports/LinuxPort/nativeSources/cn1_linux_crypto.c
Comment thread scripts/hellocodenameone/conformance/backfill_port_status.sh
shai-almog and others added 2 commits July 31, 2026 13:25
…ietly

A test that blocks the event dispatch thread outright can never be timed out
by the runner, because the per-test deadline is itself enforced by an EDT
callback. The suite simply stopped: the log ended mid-line, every later test
was published as "never run", and nothing said which test was responsible --
that is how Media360PanoramaScreenshotTest on Linux and CalendarApiTest on
Windows have been going unattributed.

A watchdog thread now tracks the running test and, thirty seconds past its
deadline, reports it by name, emits a CN1SS:SUITE:WEDGED marker and exits.
The normalized report then records that test as failed and the rest as
unreached, which is what actually happened, and the harness stops burning its
forty-minute cap on a thread that is not coming back.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The shared POSIX implementation sets TZ and reads tm_gmtoff back. Neither
half exists on Windows: the Microsoft C runtime only parses the "EST5EDT"
form of TZ, not an IANA identifier, and its struct tm carries no GMT offset
at all. Every named zone therefore resolved to an offset of zero, which is
why TimeApiTest read America/New_York as UTC.

Windows has shipped ICU since Windows 10 1703, and its calendar speaks IANA
identifiers and knows the daylight rules for the instant being asked about.
The three time zone natives now go through it and fall back to the previous
behaviour if it is unavailable. The POSIX path is untouched and still passes
the same probe through the ParparVM clean target.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0c6c9701c8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Ports/LinuxPort/nativeSources/cn1_linux_crypto.c
Comment thread vm/JavaAPI/src/java/util/TimeZone.java Outdated
Comment thread vm/ByteCodeTranslator/src/nativeMethods.m Outdated
The watchdog reached for Runtime.exit, which the bytecode compliance gate
rejects along with System.exit -- both are outside the API the ports support,
and exitApplication would have to run on the very thread that is stuck. That
broke the suite build, and with it every job that compiles the suite.

The watchdog now only reports: it names the test and emits CN1SS:SUITE:WEDGED.
Both capture harnesses watch for that marker, stop waiting as soon as it
appears and fail with the test name, which is ordinary JUnit code under no
such restriction. It also starts through Display.startThread rather than
configuring a raw Thread, and stops itself once the suite finishes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 19255ebe82

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Ports/LinuxPort/nativeSources/cn1_linux_crypto.c
Crypto
- The RNG now fails closed. RAND_bytes and BCryptGenRandom report failure to
  Java, which throws, instead of leaving a zeroed buffer that KeyGenerator
  would hand out as a key.
- OAEP masks with SHA-1 even when the digest is SHA-256, matching the JCE
  providers behind the JavaSE and Android ports. Naming the digest for both
  halves made anything sealed on a desktop port undecryptable elsewhere.
- Initialization vectors are checked before they reach the platform library:
  a missing GCM nonce silently repeated across messages under one key, and a
  short CBC IV was read as a whole block past the Java array.
- Windows imports private keys through NCrypt, which takes PKCS#8 for both
  RSA and EC, so the ECDSA signature APIs work instead of decoding every key
  as RSA. Sign and verify pick their padding from the key's own algorithm.

Time zones
- Custom IDs split their last two digits as minutes for the three-digit form
  too, so GMT+012 is UTC+00:12 rather than UTC+12.
- The Windows raw offset samples the current year and prefers the later
  standard-time reading. A zone whose base offset changed mid-year with
  neither sample flagged as daylight saving -- Asia/Almaty in 2024 -- would
  otherwise report its retired offset forever.
- The UWP native reads its fields as UTC like the POSIX, JavaScript and iOS
  implementations, rather than as host-local time.

Port status
- A report whose generated_at cannot be parsed is unusable rather than
  publishable; it would otherwise poison the sweep and the page's own
  rendering.
- The sweep merges artifacts across candidate runs until every port a
  workflow owns is covered, so one failed matrix leg no longer hides the
  others, and compares exact elapsed seconds rather than whole days.
- A feature whose tests all passed or were documented skips keeps its noted
  pass even when the suite run stopped early; the completion fallback now
  runs after that case rather than before it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 902b535c80

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Ports/WindowsPort/nativeSources/cn1_windows_crypto.c Outdated
Comment thread Ports/WindowsPort/nativeSources/cn1_windows_crypto.c Outdated
My bisect probes went into the Accordion the test actually shows, so they
changed the rendered "kotlin" screenshot and failed the golden comparison on
Android, JavaScript, Linux and the Mac/Windows comparators -- six jobs red for a
diagnostic. That was careless: a screenshot test's form is its assertion.

addContent does its work in the AccordionContent constructor, so an unparented
Accordion exercises the identical path and renders nothing. Same measurement,
no visible change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6f02a35362

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +719 to +725
if suite_finished:
if performance.get("status") != "complete":
malformed.append(f"performance run is {performance.get('status')!r}")
if declared_missing:
malformed.append(
"performance workloads never reported: " + ", ".join(declared_missing)
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject complete labels on partial benchmark data

When an unfinished producer report names omitted workloads in performance.missing but mistakenly leaves performance.status as complete, this branch performs no status-consistency check; accounted ∪ missing can still cover the contract, so accept returns success. Fresh evidence after the resolved partial-rendering comment is that docs/website/layouts/_default/port-status.html renders any benchmark whose status is complete, causing the available partial timings to be presented as completed measurements. Require partial whenever an unfinished report has declared missing workloads.

Useful? React with 👍 / 👎.

Comment on lines +671 to +676
for test, result in tests.items():
if not isinstance(result, dict) or result.get("status") not in {
"pass", "fail", "skip", "not-run"
}:
malformed.append(f"invalid result for {test}")
continue

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Validate per-test reason arrays before publication

When a producer emits a valid test status but a malformed reasons value such as true or an object, this loop accepts the result and the report is copied into the website data. The feature template then passes that value to len, range, and hasPrefix in port-status-feature-status.html, which can fail the Hugo build instead of classifying the newest report as unusable. Validate that reasons, when present, is an array of strings as part of this result check.

Useful? React with 👍 / 👎.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Human review recommended

It spans build/reporting infrastructure plus cross-platform runtime/native changes, so it needs careful human validation across affected ports and CI workflows.

Review details
  • Files reviewed: 71/73 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

Round one of the bisect ruled out the obvious: a container holding a plain
CheckBox, Switch or TextArea goes through addContent fine on Windows. So the
trigger is something the real container does beyond constructing its children --
setOn() on the Switch, a hint on the TextArea, or holding three at once. One
probe each; still on the unparented Accordion, so nothing renders.

Separately, Build Android JDK 21 died on HTTP 429 fetching a JDK from GitHub
releases. Every Android job provisions its own JDKs from the same release at the
same moment, so the matrix trips the rate limit together -- and curl's default
backoff of 1s, 2s, 4s meant the whole thing gave up inside seven seconds.
--retry-delay 15 with six attempts and a 300s ceiling: curl waits for the larger
of that and any Retry-After the server sends, and a genuinely dead mirror still
fails the job rather than hanging.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Human review recommended

It spans cross-platform runtime, native code, CI workflows, and reporting contracts, so it needs careful human validation across affected ports despite only minor localized review comments.

Review details

Suppressed comments (1)

vm/JavaAPI/src/java/time/DateTimeSupport.java:240

  • utcDate is derived from localStandard (epoch milli + raw offset), so it is not actually a UTC date. This name is misleading and makes the offset calculation harder to reason about.
  • Files reviewed: 72/74 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6615b01464

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

# as "never run" and the job stayed green -- a result that reads as
# success while hiding both the tests that failed and the fact that
# they stopped running.
export CN1SS_FAIL_ON_TEST_PROBLEMS=1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Publish normalized reports from failed producers

When this strict gate detects a failed or never-run test, compare-comment exits nonzero after the if: always() step uploads the normalized report, but .github/workflows/port-status-publish.yml lines 21-24 only publishes reports from workflows whose conclusion is success. In the scheduled Linux workflow, which may run for 90 minutes from 01:45 while the nightly sweep snapshots completed runs at 02:35, a failure finishing after that snapshot therefore leaves the previous green report public until the next day's sweep. Allow the workflow-run publisher to consume completed failed master runs that contain normalized artifacts.

Useful? React with 👍 / 👎.

# suite that actually finished; a partial section simply is not presentable
# as performance. Structural defects below stay loud either way, because
# those are producer bugs whatever the suite did.
suite_finished = bool(report.get("suite_finished"))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Require a boolean suite completion marker

When a malformed producer serializes suite_finished as the string "false" or the integer 1, this coercion treats it as a completed suite and the acceptance gate can publish it. Hugo also treats that value as truthy in port-status-port-state.html, so a report with no failing tests but many not-run tests can render a green “Suite completed” card. Validate that this field is an actual boolean and classify other types as unusable before publication.

Useful? React with 👍 / 👎.

FileSystemStorage.rename documents newName as "relative to the current
folder" -- a leaf name -- and the Linux port resolves it against the source's
parent. Windows passed it straight to MoveFileExW as a full target, so a leaf
name moved the file into the process working directory instead of renaming it
in place.

WAVWriter.close() does exactly that: it renames the recording to <name>.pcm
using new File(...).getName(), then reopens the .pcm to write the real WAV.
On Windows the .pcm was not where it was left, so the reopen threw
FileNotFoundException and AudioMixerApiTest failed -- reported as a missing
file, for a file the port had quietly moved somewhere else.

A leaf name now joins to the source's parent directory. An absolute target --
drive letter, UNC prefix or leading separator -- is still honoured as-is, so a
caller depending on the old behaviour is unaffected.

The old comment asserted the opposite contract and said a bare leaf name
"would be a contract violation on the Java side". The Java side is CN1's own
WAVWriter, and the javadoc agrees with it.

Verified by cross-compiling the port into a real Windows PE with clang-cl +
lld-link.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Human review recommended

It spans core runtime behavior, native platform implementations, cryptography, and multiple CI/workflow/reporting paths that require end-to-end validation across ports and environments.

Review details
  • Files reviewed: 72/74 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c0e4c6ce1f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

} else {
WCHAR* lastBack = wcsrchr(path, L'\\');
WCHAR* lastFwd = wcsrchr(path, L'/');
WCHAR* sep = lastBack > lastFwd ? lastBack : lastFwd;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Select the separator without comparing against NULL

For ordinary Windows paths containing only backslashes—and normalized paths containing only forward slashes—one of these pointers is NULL. Relationally comparing that null pointer with a pointer into path is undefined C behavior, so an optimized Windows build is not guaranteed to select the existing separator; if sep becomes null, the destination loses its parent and the rename can again land in the working directory. Handle the null cases explicitly before comparing the two in-array pointers.

Useful? React with 👍 / 👎.

VideoIORoundTripTest failed on Windows with "decoded clip reports audio but no
PCM samples were returned" -- hasAudio true, readAudio empty. The reader never
called SetStreamSelection. Which streams a source reader starts with depends on
the presentation descriptor, and SetCurrentMediaType succeeds on a stream that
is not selected, so configuring 16-bit PCM reported success and set hasAudio
while ReadSample produced nothing. Everything is deselected now and the two
streams this reader consumes are turned on explicitly.

Compiled into a real Windows PE with clang-cl + lld-link. I cannot run a Windows
binary here, so CI is the confirmation -- but the mechanism matches the symptom
exactly, which is more than the last two theories about the NPE managed.

On that NPE: the probes narrowed it to a Switch with setOn() reaching
Accordion.addContent, while a plain Switch is fine and setOn() on its own is fine
(the real test does both before the failure). The composite probe cannot tell
constructing one from adding one, so it is split to the statement.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Human review recommended

It touches core runtime behavior, multiple native ports, and CI/reporting pipelines across platforms, so it warrants careful human validation despite only minor review nits found.

Review details

Suppressed comments (1)

vm/JavaAPI/src/java/util/TimeZone.java:297

  • The JavaDoc lists UTC+01:30 as a supported custom fixed-offset ID, but the implementation explicitly rejects non-"GMT" offset suffixes (see the index != 3 || !ID.startsWith("GMT") check). This makes the comment inaccurate.
  • Files reviewed: 73/75 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: dedc1fc708

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +672 to +674
if not isinstance(result, dict) or result.get("status") not in {
"pass", "fail", "skip", "not-run"
}:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Validate result status before set membership

When a malformed producer writes a test status as an array or object, the set-membership expression raises TypeError instead of returning ACCEPT_UNUSABLE. The backfill only records status 12 as unusable, so it can fall back to an older report and finish green; check that status is a string before testing the allowed values.

Useful? React with 👍 / 👎.

*) reason="rejected by the publication gate (status ${accept_status})" ;;
esac
echo "Not publishing the ${port} report: ${reason}; preserving the last published one."
exit 0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Fail publication when a report is unusable

When accept returns ACCEPT_UNUSABLE for a malformed artifact from an otherwise successful producer, this unconditional zero exit makes port-status-publish.yml succeed and rebuild the site while retaining the previous report. Contract drift is intentionally quiet, but unusable reports and unexpected gate failures should propagate a nonzero status so the publishing workflow exposes the producer defect immediately rather than waiting for a later nightly sweep.

Useful? React with 👍 / 👎.

…cessor

AudioMixerApiTest is fixed -- Windows went from pass=166 fail=4 to pass=167
fail=3 and the rename failure is gone.

VideoIORoundTripTest still fails with SetStreamSelection in the build, so that
was not the cause. Rather than guess a second time at a stack I cannot run here,
readAudio now reports what MF actually did: read count, null-sample count, bytes
collected, the last HRESULT and stream flags, and the negotiated rate/channels.
It also bounds the null-sample path, which could otherwise spin forever on a
stream that only ever ticks.

For the NPE, the probes have it at addContent on a container holding an ON
switch. The only state the ON path reaches that the OFF path does not is
getSelectedStyle -- getThumbOnImage uses it where getThumbOffImage uses the
unselected style -- and calcPreferredSize is what asks for the thumb. Both are
public, so the test now touches unselectedStyle, selectedStyle and
preferredSize in turn and the breadcrumbs will name which one throws. No probes
in Switch itself.

Cross-compiles into a real Windows PE.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Human review recommended

It changes core reporting gates and multiple native runtime/port implementations across platforms, so it needs careful human validation across the CI matrix and target environments.

Review details
  • Files reviewed: 73/75 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c8644d55f5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

# to go to a separate jq invocation rather than being smuggled in after --jq.
candidates="$(gh run list --workflow "${workflow}" --branch master --limit 100 \
--json databaseId,event,conclusion,updatedAt \
| jq -r --arg horizon "${horizon}" '[.[] | select((.event == "push" or .event == "schedule" or .event == "workflow_dispatch") and

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Exclude watch-only iOS dispatches from the sweep

When scripts-ios.yml is manually dispatched with watch_only=true, its build-ios, build-ios-metal, and build-ios-tv jobs are skipped while only the watchOS job uploads a report. This filter nevertheless selects that dispatch as the newest candidate for every port owned by the workflow, so the omission check later marks ios-gl, ios-metal, and tvos unusable after filling them from older runs, causing the nightly sweep to fail even though those ports were intentionally not run. Exclude this dispatch mode or scope its expected ports to watchos.

Useful? React with 👍 / 👎.

Two Windows defects, both now diagnosed from CI rather than guessed at.

Audio: the instrumentation answered plainly -- reads=1 nullSamples=0 bytes=0
lastFlags=0x2. That flag is MF_SOURCE_READERF_ENDOFSTREAM on the very first read
after the rewind, so SetCurrentPosition was not bringing the audio stream back
once the video pass had driven the file to end-of-stream, and its HRESULT was
never checked. My earlier SetStreamSelection change did not fix this and was not
the cause. readAudio now opens a source reader of its own from the stored URL: a
fresh reader starts at the beginning by construction, so the audio track no
longer depends on seek semantics or on what the video pass did to the shared
position. The old rewind remains as a fallback.

Images: createMutableImage returned 0 for any non-positive extent, and a 0 peer
is worse than a tiny image -- Image.getGraphics() answers null for it and the
caller dies with a NullPointerException far from the cause. That is the shape of
the Switch failure: the probes put it in getPreferredSize(), whose track image is
sized from the font height, and createRoundRectTrackImage calls
img.getGraphics().setAntiAliased(true) with no null check. Clamped to 1x1 so the
object is always usable, and the test reports the font height so the next run
says whether a zero height is what got us there.

Cross-compiles into a real Windows PE.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8175b20cc4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

pcmType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
pcmType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
pcmType->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 16);
audioReader->SetCurrentMediaType((DWORD) MF_SOURCE_READER_FIRST_AUDIO_STREAM, NULL, pcmType.Get());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Fall back when configuring the fresh audio reader fails

When Media Foundation opens the fresh reader but either stream selection or PCM negotiation fails, these unchecked calls still leave audioReader non-null, so the code bypasses the shared-reader fallback and reads an unselected stream or the source's compressed native format as though it were 16-bit PCM. This can return an empty array or compressed bytes with the separately cached PCM rate/channel metadata; use the fresh reader only after all configuration calls succeed, otherwise rewind and use the already-configured reader.

Useful? React with 👍 / 👎.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Human review recommended

It introduces large cross-cutting changes across CI workflows, reporting gates, core Java APIs, and native desktop implementations, which warrants careful human validation on all affected platforms.

Review details
  • Files reviewed: 74/76 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

You are right that clamping to 1x1 was the wrong answer: something asking for a
zero-sized image has a real bug -- a metric that came out zero -- and quietly
handing back a 1x1 surface leaves that unfixed and renders wrongly instead of
crashing. createMutableImage refuses a degenerate extent again, but says so in
the log rather than returning a bare 0 with no explanation.

I do not yet know why the metric is zero, and I am not going to guess a fourth
time. DirectWrite is not failing -- cn1dwCreateFormat logs when CreateTextFormat
fails and nothing appears in the Windows log -- so the format is being created
and the cached font->height should be real. The font-height probe added last
commit reports the actual number on the next run.

Permanent diagnostics instead of one-off probes, as asked: every reported
throwable now carries the platform state that turns NullPointerException with
no stack into a lead -- display extent, density, EDT flag, default font height
and system font height. A zero font height or a zero display extent is exactly
how a component ends up asking for a zero-sized image whose graphics come back
null. Printed only on failure, on every port, and it stays in.

Runner lambda count unchanged at 7 code lines. Cross-compiles into a real
Windows PE.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 378c948385

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

utc.tm_min = (millisOfDay / 60000) % 60;
utc.tm_sec = (millisOfDay / 1000) % 60;
utc.tm_isdst = 0;
return (long long) timegm(&utc) * 1000LL;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve pre-epoch dates in Windows zone lookup

When Windows callers query a named zone for any date before 1970, timegm resolves to the new _mkgmtime compatibility wrapper, whose supported range starts at the Unix epoch and which returns -1 outside that range. Multiplying that failure value by 1000 makes every historical request query ICU at 1969-12-31T23:59:59Z, so APIs such as TimeZone.getOffset() return incorrect historical offsets—for example, a 1900 Europe/Paris request is evaluated using 1969 rules. Convert the calendar fields without the CRT's restricted _mkgmtime path or detect and handle its failure.

Useful? React with 👍 / 👎.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Human review recommended

It spans critical CI/reporting infrastructure plus multiple platform native/runtime changes (timezone, IO, crypto), so it needs careful human validation across ports beyond the targeted fixes.

Review details

Suppressed comments (1)

vm/JavaAPI/src/java/util/TimeZone.java:350

  • customTimeZone() rejects lowercase/mixed-case "GMT" offset IDs (e.g. "gmt+5") because it uses ID.startsWith("GMT") (case-sensitive). Since getTimeZone() is documented/implemented as case-insensitive on other ports/JDK, this causes such IDs to fall through to the malformed-offset fallback and resolve to plain GMT instead of the intended fixed offset.
  • Files reviewed: 74/76 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

The cross-compile job went red because of me: I added #include <string> to
cn1_windows_video.cpp, which drags in the MSVC STL, and that hard-asserts
STL1000 unless clang is exactly 19. That job does not pin LLVM 19 the way the
build+run job does. The file already carried a comment saying no std::wstring
precisely to avoid this, and I ignored it. The URL is a malloc'd wchar_t copy
now, freed in the destructor, and the file has no STL again. My local check
passed only because Homebrew clang here is 22.1.6 -- so a green xwin run locally
is NOT evidence the CI toolchain accepts it.

On the NPE: the font-height theory is dead. Windows reports fontHeight=20,
systemFontHeight=20, display 784x561, density 20, and both styles resolve. So no
metric is zero and no image is degenerate -- which also means the clamp I
removed would have fixed nothing.

What remains inside calcPreferredSize is the thumb image, and Switch builds it by
creating an image, blurring it for the drop shadow, and drawing on the result.
Rather than read further, the test now walks that same sequence through the
public API and reports each step: create, graphics, antialias, blur support, the
blur call, and graphics on the blurred image. Whichever comes back null or
throws is the defect. Left in permanently -- a platform whose blur returns
something undrawable cannot render a Switch at all.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 214286accc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +719 to +720
if suite_finished:
if performance.get("status") != "complete":

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Validate performance status for unfinished suites

When an unfinished report emits a malformed performance.status such as an object, this conditional skips all validation as long as the workload keys remain accounted for, so accept publishes the report. The website then evaluates eq .status "complete" in docs/website/layouts/_default/port-status.html, where comparing a map with a string terminates the Hugo build with an incompatible-types error; validate the field as a string with an allowed status for incomplete suites as well.

Useful? React with 👍 / 👎.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

There are a few concrete correctness/diagnostic issues in the new JavaAPI TimeZone custom-ID logic and in two new tests’ failure messages that should be fixed before merging.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.

Review details

Suppressed comments (1)

vm/JavaAPI/src/java/util/TimeZone.java:350

  • customTimeZone() uses a case-insensitive prefix match (regionMatches(true, ...)) but then requires ID.startsWith("GMT") case-sensitively. This inconsistent check will reject valid case variations like "gmt+05:00" (which the earlier logic already accepted as a GMT-prefix ID) and fall back to plain GMT instead of a fixed offset.
  • Files reviewed: 74/76 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

The primitive probes came back entirely clean on Windows: create, graphics,
antialias, blur supported, the blur call, graphics on the blurred image -- every
one non-null. So the gaussian-blur theory is dead alongside the font-height one,
and getPreferredSize still throws.

The difference I had missed is that my probe called Image.createImage directly
while Switch goes through ImageFactory.createImage(context, ...) with the
component as context, which walks the parent chain looking for a per-component
factory -- and at sizes derived from the font rather than my arbitrary 32x24.
That exact call is now probed, at the size the switch computes.

Also probing an OFF switch's preferred size. The ON/OFF split may be an
artifact: the earlier OFF probe only ever called addContent, never
getPreferredSize, so it may throw identically and the state is a red herring.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4aab910910

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +686 to +687
if report.get("summary") != expected_summary:
malformed.append("summary does not match the test results")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Validate summary count types before accepting reports

When an expected count is exactly one, a malformed JSON boolean passes this equality because Python considers True == 1; for example, changing Android's summary.skip from 1 to true is still accepted. The report is then published and Hugo renders true skipped, defeating the acceptance gate's numeric-count contract. Explicitly require each summary value to be a non-boolean, non-negative integer before comparing it with the calculated summary.

Useful? React with 👍 / 👎.

Comment on lines +89 to +90
<span><i class="cn1-port-status__mark is-pass" aria-hidden="true">✓</i><sup class="cn1-port-status__note" aria-hidden="true">*</sup> Passed, with a skip the <a href="#skip-errata-title">errata</a> account for</span>
<span><i class="cn1-port-status__mark is-partial" aria-hidden="true">−</i> Incomplete run or an unexplained skip</span>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Filter displayed errata by reason code and port

When a test with errata is skipped for an unexpected reason or on a disallowed port—for example, VideoIORoundTripTest reporting an encoder failure on Linux—the feature cell correctly remains partial, but the errata loop at lines 162-174 includes every skip based only on the test name and status. The page therefore lists Linux under an erratum that specifically explains Apple simulator limitations, contradicting the new unexplained-skip distinction and misdiagnosing the failure; apply the same reason-prefix and port predicate when populating the errata entry.

Useful? React with 👍 / 👎.

Two facts this round, both new.

An OFF switch's getPreferredSize WORKS on Windows -- probe-off-preferredsize-ok
-- and the ON switch's throws. So the ON/OFF split is real, not an artifact of
which probe happened to compute a size. And the ImageFactory path is clean:
create through the factory at the size the switch computes, take graphics,
antialias, all fine.

That leaves exactly one thing the ON path does that the OFF path does not.
calcPreferredSize calls getCurrentThumbImage, then both track images; the tracks
are shared, so the difference is getThumbOnImage vs getThumbOffImage. The ON
thumb hard-codes shadowSpread=2 while the OFF thumb reads
switchThumbShadowSpreadInt, which Material 3 sets to 0 for a flat thumb -- and a
spread of 0 skips the drop-shadow branch entirely. The ON thumb is therefore the
only one that ever reaches the blur.

My earlier blur probe passed because it blurred a BLANK image. The real branch
draws the shadow rings first, so the blur reads back a Direct2D target with an
open draw batch. The probe now does that: create, draw, blur, take graphics --
and reports switchThumbShadowSpreadInt so the premise is checked rather than
assumed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 89590b3dcf

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +2897 to +2898
boolean wantsEc = algorithm.toUpperCase().indexOf("ECDSA") >= 0;
boolean keyIsEc = keyAlgorithm.toUpperCase().startsWith("EC");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Require exact key algorithm labels

When callers create a key with the public factories using a noncanonical label—such as PrivateKey.fromPkcs8("garbage", rsaDer) or PublicKey.fromX509("ECfoo", ecDer)—this predicate treats every non-EC prefix as RSA and every EC prefix as EC, so the native DER-family check succeeds and signing or verification proceeds. JavaSE and Android instead pass the label to KeyFactory.getInstance() and reject these inputs, making identical public API calls port-dependent; require the label to be exactly RSA or EC (case-insensitively) here and in the identical Linux helper.

Useful? React with 👍 / 👎.

switchThumbShadowSpreadInt is 0 on Windows, confirming the premise: the OFF
thumb skips the drop-shadow branch and the ON thumb always enters it, which is
the whole of the ON/OFF split.

But create -> draw -> blur -> graphics all pass, so the blur itself is not it.
The one call calcPreferredSize makes on the blur result that no probe has made
is getWidth(). It matters here: the Windows blur returns Image.createImage(argb,
w, h) rather than the mutable surface it was handed, so the result's dimensions
come from a different native than the one every passing probe exercised.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 27121ff241

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +156 to +158
| jq -r --arg horizon "${horizon}" '[.[] | select((.event == "push" or .event == "schedule" or .event == "workflow_dispatch") and
(.conclusion != null and .conclusion != "cancelled" and .conclusion != "skipped") and
(.updatedAt >= $horizon))]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark not-run-only producer failures as incomplete

When a completed producer fails only because one or more tests are not-run while the suite still emits its completion marker, this filter admits the failed run and the acceptance gate publishes its report, but port-status-port-state.html checks only summary.fail before treating suite_finished as a passing card. The strict producer gate explicitly fails on not-run, so this reachable report renders a green port card even though its workflow failed and its feature cells are incomplete; account for the not-run count when deriving the displayed port state.

Useful? React with 👍 / 👎.

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.

2 participants