Skip to content

Eliminate initial CPAN compatibility workarounds - #895

Merged
fglock merged 58 commits into
masterfrom
feature/cpan-workaround-cleanup
Aug 10, 2026
Merged

Eliminate initial CPAN compatibility workarounds#895
fglock merged 58 commits into
masterfrom
feature/cpan-workaround-cleanup

Conversation

@fglock

@fglock fglock commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Summary

  • complete Phases 1–8 of dev/design/cpan-workaround-elimination.md
  • remove dependency-only and obsolete compatibility preferences while retaining explicit capability policies
  • replace runtime workarounds with shared parser, control-flow, regex, lifetime, module API, and CPAN tooling fixes
  • complete the 64-bit IV/UV runtime migration and advertise it through Config.pm
  • complete source-first SQL::Translator, CGI, libwww-perl, Data::CompactReadonly, and Number::Phone gates
  • bundle a Java-backed Scalar::Type 1.0.1 provider, replacing its XS scalar-flag probe

Post-rebase update

All 55 branch commits are rebased onto master 2095f7b55. Rebase reconciliation preserves both branches' regex byte-view, CPAN prerequisite phase/prefs, lvalue/caller, 64-bit integer, HTML entity, Storable UV, interpreter regex-state, taint-mode, ICU regex-fold, and weak-lifecycle work. No commit was dropped.

The bundled hash-backed File::Temp wrapper now exposes the scalar slot of the glob it emulates. The standard-Perl-validated regression passes under both PerlOnJava backends, and unchanged CGI 4.72 again passes all 64 files and 1,603 assertions, including uploadInfo.t.

Weak-observed blessed wrappers without DESTROY now defer their targeted cleanup to the next statement boundary instead of also launching an immediate global sweep. This preserves master's Hash::AutoHash cleanup while preventing an unrelated Moo weak index -> table link from being cleared inside SQL::Translator's nested diff construction.

The final sweep also found a regression already present on the new master: compile-time our declarations did not materialize their package glob slots, so Specio rejected DateTime::Duration during its circular load. PerlOnJava now matches standard Perl by creating scalar, array, and hash slots while compiling our; the focused 6-test regression passes on standard Perl and both backends, and DateTime again passes its complete suite.

Verification highlights

  • full make: pass (BUILD SUCCESSFUL)
  • all 378 bundled module files: pass after the final rebase
  • reported 27-file core matrix versus freshly built master 2095f7b55: 0 regressions, 17 equal, 10 improved
  • all 54 CPAN targets fixed across current master and this branch: pass
  • newly landed master gates: Getopt::Param, DateTime::TimeZone::Tzfile, and Unicode::BiDiRule all pass
  • DateTime: 51 files, 3,589 assertions
  • Devel::Symdump: 9 files, 29 assertions
  • aliased: 6 files, 40 assertions
  • Test::Deep: 42 files, 1,268 assertions
  • Data::CompactReadonly: 11 files, 342 assertions
  • Number::Phone: 40 files, 13,609 assertions with the supported 4 GB test-child override
  • CGI 4.72: 64 files, 1,603 assertions
  • source-first SQL::Translator: all 75 files and 1,947 assertions exercised; the sole post-rebase failing file was repaired and rerun 16/16
  • Hash::AutoHash: 32 files, 2,785 assertions
  • Data::FetchPath: 4 files, 19 assertions
  • Password::OWASP: 4 files, 40 assertions
  • Crypt::Twofish2: 1 file, 83 assertions
  • Text::Markdown: 17 files, 64 assertions
  • Text::Markdown::Slidy: 2 files, 5 assertions
  • Char::Latin7: 210 files, 5,711 assertions
  • Text::Fold: 6 files, 38 assertions
  • 64-bit Config regression: 22/22 on standard Perl, JVM, and interpreter
  • unsigned scalar/bitwise regression: 17/17 on standard Perl, JVM, and interpreter
  • DBIx::Class SQL::Translator consumers: 179/179 and 144/144

Master now defaults MakeMaker test children to 768 MB. Number::Phone's generated 9.2 MB CN module exceeds that ceiling during weak-reference reachability sweeps; its unchanged complete suite passes with PERLONJAVA_TEST_JPERL_OPTS=-Xmx4g. SQL::Translator continues to use the documented 2 GB CPAN parent and 768 MB test children.

Live CPAN test output follow-up

The retry-aware CPAN test path now tees each output chunk to the current Perl STDOUT while retaining the complete stream for canonical missing-module detection. This restores immediate TAP visibility for long suites such as DBIx::Class without removing prerequisite promotion or its one-retry-per-command bound.

The shared process runner now also resolves an omitted working directory from PerlOnJava's logical current directory before entering Java. This prevents CPAN's make test command from accidentally running the PerlOnJava checkout's own Makefile after CPAN changes into a distribution build directory.

The process timing, implicit-cwd inheritance, CPAN integration, and canonical missing-module regressions pass under standard Perl, JVM, and interpreter execution. The final full make gate passes.

The first clean Ubuntu rerun exposed that http_cookies_request_header.t had been resolving HTTP::Request only from the developer CPAN home. The unit harness now exposes its test-only fixture library, including a minimal request/URI fixture; the unchanged test passes without adding a production module shadow. The final full make gate passes after this correction.

Removed workaround classes

  • Phase 1: WWW::Form::UrlEncoded preference and source patch
  • Phase 2: lifecycle preferences for bundled providers and DBI source patches
  • Phase 3: 46 dependency-only skip and ignore-failure preferences
  • Phase 4: caller/eval, core-override, symbol-table, and warning suppressions
  • Phase 5: Graph, Class::Method::Modifiers, Module::Install, and Term::ANSIColor::Markup workarounds
  • Phase 6: XML::TreePP incremental parser rewrite; its independent UTF-8 adaptation remains
  • Phase 7: Test::Deep::JSON, XML::Filter::GenericChunk, HTTP::Response::Encoding, and CPAN::FindDependencies workarounds
  • Phase 8: SQL::Translator preference

Retired signed preferences and owned patch-cache files are removed safely during bootstrap upgrades; user-owned policy files remain untouched.

Remaining capability policy

Regexp::Common executable conditional/recursive patterns, Type::Tiny executable regex paths, Object::InsideOut/Logger::Simple, and ExtUtils::ParseXS remain explicit capability policies pending the required compiler/runtime callback interfaces.

Next step

Run the required Ubuntu and Windows CI jobs after the rebased branch is pushed, then resolve platform-specific failures without restoring distribution workarounds.

Generated with OpenAI Codex

Co-Authored-By: OpenAI Codex codex@openai.com

@fglock
fglock force-pushed the feature/cpan-workaround-cleanup branch 2 times, most recently from 7ac8e57 to 1b7aabd Compare August 9, 2026 20:53
fglock and others added 28 commits August 10, 2026 15:11
Carry lexical use-bytes mode with replacement regexes so both compiler
backends match against UTF-8 octets while destructive substitutions write
through the original scalar. Materialize regex capture proxies for bytes::ord
to avoid encoding captured octets twice.

Add standard-Perl-validated coverage for destructive, non-destructive,
aggregate, and tied-scalar substitutions. Retire the WWW::Form::UrlEncoded
distropref and source patch after its unmodified 199-test suite passes with
both PerlOnJava backends.

Add the forward-looking CPAN workaround elimination design handout and mark
the bytes-substitution phase complete.

Generated with [Codex](https://openai.com/codex/)

Co-Authored-By: Codex <158243242+openai-codex[bot]@users.noreply.github.com>
Add a schema-validated bundled provider manifest and teach CPAN to
satisfy compatible prerequisites without fetching or installing over
authoritative PerlOnJava modules. Reject incompatible and forced
shadow installs, and add an explicit non-installing provider
conformance mode.

Bundle missing loader and facade dependencies for the initial provider
set, retire the corresponding lifecycle prefs and DBI patches, and mark
Phase 2 complete in the design.

Verification:
- standard Perl: cpan_bundled_providers.t (61/61)
- JVM and interpreter provider resolver gates
- clean isolated jcpan DBI shadow refusal
- make

Generated with [Codex](https://openai.com/codex/)

Co-Authored-By: Codex <158243242+openai-codex[bot]@users.noreply.github.com>
Retire the aliased signal-handler investigation as passing on both
PerlOnJava backends, and add a standard-Perl-validated regression for the
remaining interpreter Carp::confess frame-name mismatch. Preserve the current
interpreter call-frame name propagation work and document the exact Phase 4
resumption point.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Record that the interpreter caller mismatch requires a subroutine invoked
from eval, rather than Carp::Assert or SIG{__DIE__} specifically.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Keep an interpreter subroutine frame selected when the next formatted frame is
the virtual eval frame. This restores the named Carp frame while documenting
the remaining @db::args payload mismatch.

Update the focused regression and Phase 4 design status.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Document the recovered build-worker incident so future investigations avoid
using broad CPU-based process selection.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Use the active Perl code object to retrieve pristine @db::args when formatted
stack frames have collapsed interpreter/compiler wrappers. This preserves
Carp's original assertion arguments while retaining the caller-frame fix.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Document the passing target suites and the remaining interpreter parity
blockers discovered after the caller and @db::args fixes.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Treat sqrt as an overridable core operator so dynamically installed wrappers
receive and can modify its arguments. This restores Hook::LexWrap's unchanged
test suite and updates the Phase 4 status.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Reconstruct a coderef's canonical typeglob from Sub::Util metadata so
Test::MockObject::Extends can resolve parent AUTOLOAD packages. Document the
remaining weak-reference lifetime failure as Phase 8 work.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Alias undefined nested package entries as stashes, normalize main-package
spellings, resolve package-prefix aliases transitively, and create new scalar
slots in the canonical stash without disturbing pre-alias slots.

Add a standard-Perl-validated regression and record the remaining
Devel::Symdump symbol inventory failures in the Phase 4 design status.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Separate use-vars declaration metadata from aggregate slot materialization,
make magic hashes lazy, expose standard handle aliases and the main argument
array slot, and distinguish the special colon glob from package stashes.

This restores Devel::Symdump's unchanged 9-file, 29-assertion suite on both
PerlOnJava backends and updates the Phase 4 resumption point.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Qualify package-local handles embedded in two-argument open duplication modes,
preserve strict-vars diagnostics before later syntax failures, and restrict the
virtual-eval caller adjustment to interpreter frames.

Complete the unchanged Test2::Plugin::NoWarnings suite and advance the design
status to Phase 5.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Attach interpreter identity directly to formatted call frames and place the
synthetic eval frame outside contiguous interpreted calls. Prefer the active
named Perl subroutine when it occupies that synthetic slot, while retaining a
genuine outer eval caller as (eval).

Add an eval-defined caller regression and record the first Phase 5 Graph
checkpoint in the CPAN workaround elimination design.

Verification:
- standard Perl: zz_eval_defined_named_caller.t (4/4)
- JVM backend: zz_eval_defined_named_caller.t (4/4)
- interpreter backend: zz_eval_defined_named_caller.t (4/4)
- unchanged Graph 0.9735: 88 files, 9,256 assertions
- full make: 245 tests passed, 2 skipped

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Restore the ordinary Perl subroutine boundary in cached JVM method dispatch so
an explicit return can cross nested map callbacks without escaping the method
that owns them. Preserve raw lvalue call context while coercing the returned
value after consuming the non-local marker.

Retire the explicit-loop get_ids_by_paths rewrites from Graph's AdjacencyMap
patches while retaining the independently justified compatibility hunks.

Verification:
- standard Perl: zz_nested_map_return.t (11/11)
- JVM backend: zz_nested_map_return.t (11/11)
- interpreter backend: zz_nested_map_return.t (11/11)
- unpatched Graph t/16_edges.t: 48/48
- pristine Graph with reduced patch bundle: 88 files, 9,260 assertions
- jcpan -t Graph with refreshed reduced bundle: 88 files, 9,234 assertions
- full make: pass (245 tests, 2 skipped)

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Keep direct defined(&sub) as a CODE-slot probe while restoring normal
ampersand-call parsing on an assignment RHS. This makes
defined(my $value = &sub) call the subroutine, share @_, and test its result.

Retire Graph's AdjacencyMap-Light patch and register its installed path for
bootstrap cleanup.

Verification:
- standard Perl: zz_defined_ampersand_assignment.t (4/4)
- JVM backend: zz_defined_ampersand_assignment.t (4/4)
- interpreter backend: zz_defined_ampersand_assignment.t (4/4)
- pristine Graph focused files: 56/56, 12/12, and 1,795/1,795
- pristine Graph with two remaining patches: 88 files, 9,263 assertions
- jcpan -t Graph applying two patches: 88 files, 9,268 assertions
- installed AdjacencyMap-Light patch retirement: pass
- full make: pass (245 tests, 2 skipped)

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Use the defined-assignment ampersand parsing fix for Graph's upstream
postfix-dereference expression and remove the SCC return-shape rewrite.
Keep direct defined(&sub) probes intact and document the next Graph split.

Verification:
- standard Perl: zz_ampersand_postfix_deref.t (4/4)
- JVM backend: zz_ampersand_postfix_deref.t (4/4)
- interpreter backend: zz_ampersand_postfix_deref.t (4/4)
- unmodified Graph t/63_scc.t: 56/56
- pristine Graph with current two patches: 88 files, 9,245 assertions
- source-first jcpan -t Graph: 88 files, 9,246 assertions
- full make: pass (245 tests, 2 skipped)

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Make PerlOnJava's scalar-state bridge authoritative for safe decimal dumping
so untouched short numeric strings stay quoted while integer and numified
scalars remain numeric.

Retire Graph's recursive deterministic-dumper rewrite and retain only its
independent Set::Object adjacency workaround in AdjacencyMap.pm.patch.

Verification:
- standard Perl: zz_data_dumper_short_numeric_flags.t (5/5)
- JVM backend: zz_data_dumper_short_numeric_flags.t (5/5)
- interpreter backend: zz_data_dumper_short_numeric_flags.t (5/5)
- existing data_dumper_numified.t: 7/7
- unpatched Graph t/08_stringify.t: all dumper assertions pass
- reduced-patch Graph: 88 files, 9,249 assertions
- full make: pass

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Implement SX_CODE deserialization through Storable Eval callbacks or lexical
Perl eval, preserve seen-table tags, and collapse the redundant outer SX_REF
around callable values.

Retire Graph's Storable guard and now-obsolete caller attribution hunk, delete
Graph.pm.patch, and register its installed-cache cleanup. Graph now applies
only its independent AdjacencyMap lifetime patch.

Verification:
- standard Perl: zz_storable_code_eval.t (2/2)
- JVM backend: zz_storable_code_eval.t (2/2)
- interpreter backend: zz_storable_code_eval.t (2/2)
- unpatched Graph t/67_copy.t: 56/56
- unpatched caller-focused Graph tests: 520/520
- source-first jcpan -t Graph with one patch: 88 files, 9,243 assertions
- installed Graph.pm.patch retirement: pass
- full make: pass

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Keep caller-owned constructor results alive across nested JVM block cleanup,
add a standard-Perl list-assignment lifetime regression, and retire Graph's
final adjacency patch and distropref.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Preserve forward CODE aliases when an undefined named coderef is assigned
to another typeglob, including independently cached interpreter CVs.

Remove the Module::Install distropref and source patch after its unmodified
upstream suite passes, and record the Phase 5 checkpoint in the design.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Load a native Want call-context bridge lazily so lvalue accessors can detect
assignment context without the upstream XS implementation.

Remove the Term::ANSIColor::Markup distropref and portable-accessor patch
after its unmodified source-first suite passes.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Align interpreter caller locations, lvalue return aliases, localized aggregate
assignment, hash-slot identity, and Sub::Name introspection with the JVM
runtime. Record the zero-workaround Phase 5 acceptance matrix and advance the
design to regex coverage.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Keep XML::TreePP's upstream global parser regex now that the runtime handles
its large fixtures safely, while retaining the independent UTF-8 flag
adaptation. Record the Phase 6 baselines and next target in the design.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Add interpreter parity for legacy multidimensional hash keys so Regexp::Common
can load on both backends. Make Logger::Simple's retained callback policy
cross-platform, migrate its unsigned legacy preference, and document the
remaining executable-regex capability boundary.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Apply scalar and runtime context to dereferenced arrays in interpreter
bytecode, preventing postfix compound assignments from receiving array
containers. Record the complete Phase 6 backend matrix and select the
stack-safe matcher migration for declarative recursive subpatterns.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Introduce a backend-neutral matcher boundary and route declarative recursive
subpatterns through Joni while preserving Perl-visible character offsets.
Cover recursion, captures, global matching, substitution, flags, and deep
nesting on standard Perl and both PerlOnJava backends.

Update the Phase 6 design status with the complete Regexp::Common matrix and
the remaining non-recursion failures.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
fglock and others added 23 commits August 10, 2026 15:13
Let the bounded CPAN test retry discover LWP::UserAgent instead of patching
upstream metadata. Bundle core AnyDBM_File over the existing SDBM backend so
the clean libwww-perl graph does not attempt to install a Perl distribution.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Replace the CPAN::FindDependencies Unix system workaround with a shared
ProcessBuilder-backed service that captures output, enforces deadlines, and
terminates process trees. Retire the obsolete preference and source patch.

Update dev/design/cpan-workaround-elimination.md for Phase 7 completion.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Do not apply the selective-refcount weak cleanup heuristic while a strong
aggregate slot remains registered as an active owner. This preserves nested
block-lexical call logs and completes the Test::MockObject JVM suite.

Update dev/design/cpan-workaround-elimination.md with Phase 8 progress.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Use reachable aggregate owners rather than every active owner when deciding
whether selective-refcount drift may clear weak observers. Walk scalar,
aggregate, and closed-over captures on both execution backends.

This preserves Test::MockObject call logs while releasing Test::Deep's stale
localized comparison state.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Treat binary concatenation as an argument terminator for omitted optional
named-unary arguments. This preserves caller.'::' when Sub::Uplevel installs
its CORE::GLOBAL::caller proxy and lets YAML load afterward on the JVM backend.

Update the Phase 8 design status with the next SQL::Translator mismatch.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Emit Perl's defined empty-string result when eval-generated foreach and
C-style loops complete in scalar context. This lets Parse::RecDescent accept
successful grammar actions whose final statement is a loop.

Update Phase 8 progress with the restored SQL::Translator YAML round trip.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Record the unchanged MySQL parser's 347/347 bounded pass and make the complete
SQL::Translator source matrix the next Phase 8 policy-retirement gate.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Expose ordinary attribute nodes through getAttributes without including
namespace declarations, while preserving the broader attributes API. Record
the complete SQL Translator baseline and the five unchanged XML tests this
unblocks.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Make repeated quote-delimited token alternatives possessive when their body
cannot consume the closing delimiter. This preserves Perl match semantics
while preventing Java Pattern from overflowing its native stack on long
Parse::RecDescent grammars.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Recognize line and block comment-only SQL before JDBC prepare and return DBI's
0E0 success value. This preserves generated migration comments as successful
no-ops and unblocks SQL Translator's SQLite rename flow.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Remove the obsolete SQL-Translator skip policy after the complete upstream
suite passes through a clean source-first jcpan run. Migrate stale owned
preferences and separate CPAN metadata heap options from MakeMaker test-child
options so large installer heaps do not multiply across test JVMs.

Update dev/design/cpan-workaround-elimination.md with the clean 75-file,
1,947-assertion acceptance result and the DBIx::Class resumption point.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Request a root-based weak-reference sweep when a live blessed lexical is
weakened with a positive residual selective refcount but no reachable
registered owner. This handles DBIx::Class schema/parser lifetime drift while
leaving ordinary weak-reference cleanup on the throttled fast path.

Record passing SQL::Translator consumers in the workaround-elimination design:
t/99dbic_sqlt_parser.t passes 179/179 and t/86sqlt.t passes 144/144.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Handle sparse list holes, leading-dot prototype arguments, parenthesized
magic readline loops, failed handle duplication, File::Temp handle identity,
byte-oriented environment values, and HTML entity defaults. CGI 4.72 now
passes its complete unchanged 64-file source matrix.

Update dev/design/cpan-workaround-elimination.md with the completed CGI
follow-up and the LWP resumption point.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <codex@openai.com>
Implement request cookie header generation in the bundled HTTP::Cookies
provider and preserve Max-Age as an absolute expiry. Add a focused
standard-Perl-validated regression and record the passing libwww-perl 6.83
source matrix in the workaround-elimination design.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Store Java long values as integer scalars without losing precision, carry
them through both backends, constant folding, arithmetic, comparisons, and
increment operations, and add a standard-Perl-validated boundary regression.
Record the remaining bitwise, pack, sprintf, unsigned, and Config gaps in the
Phase 8 differential baseline.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Use a 64-bit word for shared shift operations and signed use-integer NOT,
including negative shift reversal, overshift behavior, sign propagation, and
the signed high bit. Add a standard-Perl-validated JVM/interpreter regression
and document the exact unsigned scalar boundary that remains.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <158243242+openai-codex@users.noreply.github.com>
Represent integer values above IV_MAX exactly and carry them through
arithmetic, numeric comparison, and ordinary 64-bit bitwise operations.

Add a standard-Perl-validated regression for UV_MAX, high-bit shifts, and
bitwise precision on the JVM and interpreter backends. Update the Phase 8
design status with the upstream bop.t delta and the next migration gate.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <codex@openai.com>
Compile decimal literals through UV_MAX as exact integer scalars and preserve
them through ordinary argument lists on both backends.

Enable signed and unsigned q/Q pack and unpack with native and explicit byte
orders. Add a standard-Perl-validated regression covering IV/UV boundaries,
repeats, endian modifiers, native width, and literal propagation. Record the
full upstream pack.t and make verification in the Phase 8 design status.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <codex@openai.com>
Accept Perl's ll, q, and L length modifiers for integer conversions and
preserve signed and unsigned 64-bit bit patterns across decimal and alternate
bases. Handle IV_MIN decimal magnitude without long overflow.

Add a standard-Perl-validated boundary regression and record the focused,
upstream sprintf2.t, and full make results in the Phase 8 design status.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <codex@openai.com>
Advertise the runtime's 64-bit IV, UV, quad, size, and NV model after
completing exact literal, arithmetic, bitwise, pack, unpack, and sprintf
behavior across JVM and interpreter backends.

Bundle Scalar::Type's XS scalar probe as a Java-backed module so the
unchanged Data::CompactReadonly source suite can pass without a CPAN
workaround. Record the completed gates and the remaining Number::Phone
module-selection blocker in the workaround-elimination design.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <codex@openai.com>
Cache physical line numbers by token index so parsing large generated Perl
modules does not rescan the complete token stream for every quoted string.
Invalidate the index when source filtering replaces the token list.

Reduce Number::Phone's generated CN module load from over 60 seconds to 2.03
seconds and complete its unchanged 40-file, 13,609-assertion source suite.
Mark Phase 8 complete in the workaround-elimination design.

Generated with [Codex](https://openai.com/codex)

Co-Authored-By: Codex <codex@openai.com>
Preserve the branch and master implementations while resolving their overlap,
including regex byte views, CPAN preference lookup, 64-bit integer semantics,
HTML entity defaults, and Storable UV serialization.

Expose File::Temp's scalar glob slot so unchanged CGI upload metadata tests
continue to work with the bundled hash-backed filehandle wrapper.

Keep immediate global weak cleanup for DESTROY classes while deferring
weak-observed wrappers without DESTROY to the targeted statement boundary.
This preserves Hash::AutoHash cleanup without clearing SQL::Translator's
unrelated weak index owner during nested construction.

Update the CPAN workaround-elimination design with the post-rebase verification
matrix and remaining CI handoff steps.

Generated with [OpenAI Codex](https://openai.com/codex/)

Co-Authored-By: OpenAI Codex <codex@openai.com>
Restore master parity across the reported parser, numeric, string, pack,
regex, control-flow, taint, symbol-table, and lvalue test regressions while
preserving the CPAN workaround-elimination module gates.

Update dev/design/cpan-workaround-elimination.md with the verification matrix
and the final rebase handoff.

Generated with [OpenAI Codex](https://openai.com/codex/)

Co-Authored-By: OpenAI Codex <codex@openai.com>
@fglock
fglock force-pushed the feature/cpan-workaround-cleanup branch from 1b7aabd to 205be6d Compare August 10, 2026 15:43
fglock and others added 3 commits August 10, 2026 19:27
Tee CPAN test output live while retaining the complete stream used to detect
canonical missing test prerequisites. Preserve the one-retry bound and avoid
replaying the suite only after it exits.

Add process-level timing coverage and CPAN integration coverage, and document
the behavior repair in the workaround-elimination design.

Generated with [OpenAI Codex](https://openai.com/codex/)

Co-Authored-By: OpenAI Codex <codex@openai.com>
Resolve an omitted process-runner cwd from Perl's logical current directory
before entering Java. This keeps retry-aware CPAN test commands in the
distribution build directory instead of the outer JVM launch directory.

Add system-Perl-validated coverage for implicit child cwd inheritance and
document the follow-up in the workaround-elimination design.

Generated with [OpenAI Codex](https://openai.com/codex/)

Co-Authored-By: OpenAI Codex <codex@openai.com>
Expose the existing unit fixture library to the Java Perl test harness and add
a minimal test-only HTTP::Request/URI object for the HTTP::Cookies regression.
This removes its accidental dependency on the developer CPAN home without
adding a production module shadow or changing the existing test.

Document the clean-CI follow-up in the workaround-elimination design.

Generated with [OpenAI Codex](https://openai.com/codex/)

Co-Authored-By: OpenAI Codex <codex@openai.com>
@fglock
fglock merged commit cc559b7 into master Aug 10, 2026
2 checks passed
@fglock
fglock deleted the feature/cpan-workaround-cleanup branch August 10, 2026 18:39
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.

1 participant