{ "task": "REL-04", "status": "checkpoint", "capturedAt": "2026-09-14T16:27:46.622Z", "source": "aa29dc9212cca5ec61d90ee8145e2b2c173cf23b", "toolchain": { "node": "24.21.0", "yarn": "1.22.22" }, "iframe": { "command": "yarn test:rollback:iframe", "report": "refactor/.cache/iframe-rollback/run-6AFtyo/report.json", "sha256": "c93fe7a9ffea5653ad3b5769ee70e69082da37bbd883fd0f1641ab848d494811", "task": "REL-04", "capturedAt": "2026-09-14T16:26:50.781Z", "source": "aa29dc9212cca5ec61d90ee8145e2b2c173cf23b", "node": "24.21.0", "yarn": "1.22.22", "passed": true, "scope": "Old package name and application imports restored together; independent renamed-package installation rehearsal", "profiles": { "old": { "name": "artplayer-plugin-iframe", "version": "1.0.0", "archive": "refactor/.cache/releases/artplayer-plugin-iframe-1.0.0.tgz", "sha256": "16dc92aa84d93bd99bc0a34815dc49f1609fafc1ff255eb353ea893e70b5f91f", "lockSha256": "a2d4f7ebecc41729792b66392971384eb497cf27c261d87c3f6cfe7c29b03e6a", "applicationSha256": "9e869c95f4907957ff820828afd1ba6f13457e46aeb790f93c5bb619a725a315", "files": { "package/README.md": "52c0a1199b6529d60ce8f4414984f9bd1bc3a8daa5bb6cfec8f0aae0c8338e46", "package/dist/artplayer-helper-iframe.js": "47730ed608f0637594549b9762c01191686a4a55b3bd467132304a016d227f4a", "package/dist/artplayer-helper-iframe.legacy.js": "f4c3b11806cad6d984f03a2d9de63deba78cbe538ffe4044a106b0dddc5d4197", "package/dist/artplayer-plugin-iframe.js": "df469c3e4582b127f35798494d0845f1fc4ca2d19bbaf01b918492e035479745", "package/dist/artplayer-plugin-iframe.legacy.js": "15299cb5c848cc61614f7573a802443d69b7c6d0a938a1867835c7cbb4884edd", "package/package.json": "563a6c8407753b92b86319a5e6d9d567525146c32cb010b45b0d88ff481859f6", "package/src/index.js": "2e0b9efeedef0d6c4f2d2b526db35f634cd02af044e4e28dd1a0b26a5b9a02bf", "package/types/artplayer-plugin-iframe.d.ts": "d55d99a2488d60892a0ab82882dc96a0f373dab0c3d2a3cee978bc35aa7c2d0c" } }, "candidate": { "name": "artplayer-tool-iframe", "version": "1.1.0", "archive": "refactor/.cache/iframe-rollback/run-6AFtyo/candidate.tgz", "sha256": "0e803ab0c653e82f9e310712d9929a56d4b781d9ccfadc50fe741c28fd2d25f1", "lockSha256": "657b0a2f29c651b10f6ceb37eb84ac3d27b3ce5de949b74dc59c748b564b2634", "applicationSha256": "360e8113b39489aef5a4ecafc0ce798db77b75035694653514c82da671d4782e", "files": { "package/ARCHITECTURE.md": "dcb0d58fd02730a7a2cc620e4e7e934fae22dbbf85cc9a6eae21ee5ac2cba167", "package/README.md": "ef5af60bcb831667a78cc3421f6e3c7b5d9a50b3d2e571c5cd02d46fc533e9ce", "package/dist/artplayer-tool-iframe.js": "7408fceccb000e1b304abe30ac9bc364da7860c3896ad5aaa6af427804c237e6", "package/dist/artplayer-tool-iframe.legacy.js": "4e8bd39cdc37e98bff9cd19b5e0c9453ebe5231264242fc1c573aa96edb5ea8a", "package/dist/artplayer-tool-iframe.mjs": "ac4c5efa670c0429fc95bdab7902df60f5b5540f0dad9c7e65c2bd660796dc83", "package/package.json": "0de9c86eeb3f9a2fb46f9297105b5beddb8d6164163ffaa9874cf5cd68ba7a58", "package/types/artplayer-tool-iframe.d.cts": "66850135f45c81d4bd7a0de33b6a2f63a655de9000f2698f43660039727919f3", "package/types/artplayer-tool-iframe.d.mts": "cd394fd68e61fab3c4474daab29852a3f87dd0086b007e7937106871272676fb", "package/types/artplayer-tool-iframe.d.ts": "e760de22559caf7ffff48d7c5713485bf9f0ddbe876a93080295fb6106535bfa" } } }, "steps": [ { "action": "install-predecessor", "profile": "old", "installed": { "name": "artplayer-plugin-iframe", "version": "1.0.0", "archiveSha256": "16dc92aa84d93bd99bc0a34815dc49f1609fafc1ff255eb353ea893e70b5f91f", "verifiedMembers": 8 }, "runtime": "old import and helper restored", "types": { "compiler": "5.9.3", "mode": "node10-commonjs", "diagnostics": [] }, "otherPackageRemoved": true, "applicationRestored": true }, { "action": "upgrade-renamed-package", "profile": "candidate", "installed": { "name": "artplayer-tool-iframe", "version": "1.1.0", "archiveSha256": "0e803ab0c653e82f9e310712d9929a56d4b781d9ccfadc50fe741c28fd2d25f1", "verifiedMembers": 9 }, "runtime": "candidate import and legacy verified", "types": { "compiler": "5.9.3", "mode": "node10-commonjs", "diagnostics": [] }, "otherPackageRemoved": true, "applicationRestored": true }, { "action": "restore-predecessor", "profile": "old", "installed": { "name": "artplayer-plugin-iframe", "version": "1.0.0", "archiveSha256": "16dc92aa84d93bd99bc0a34815dc49f1609fafc1ff255eb353ea893e70b5f91f", "verifiedMembers": 8 }, "runtime": "old import and helper restored", "types": { "compiler": "5.9.3", "mode": "node10-commonjs", "diagnostics": [] }, "otherPackageRemoved": true, "applicationRestored": true } ], "aliasNegative": { "passed": true, "result": "old tarball under new dependency key does not preserve candidate constructor/legacy", "scope": "Local file dependency key alias, not npm registry alias resolution" } }, "mainline": { "command": "yarn test:rollback:mainline", "report": "refactor/.cache/mainline-rehearsal/run-zTEWy5/report.json", "sha256": "59ee81a3ead7d04a8c8cbb6f097ba4755643ec49a7bf710ab092e13f4f617fcb", "patch": { "path": "refactor/.cache/mainline-rehearsal/run-zTEWy5/resolved.patch", "sha256": "debee370777d5d3175affe6c9406c4e1897c5b11d60590c12dabc41a533bdfc3" }, "bundle": { "path": "refactor/.cache/mainline-rehearsal/run-zTEWy5/rehearsal.bundle", "sha256": "a5fe84987a8efa44b70693b08c91e0d0d955ea53f194291c156153fe080c72f2" }, "task": "REL-04", "capturedAt": "2026-09-14T16:24:22.347Z", "source": "aa29dc9212cca5ec61d90ee8145e2b2c173cf23b", "node": "24.21.0", "passed": true, "scope": "Synthetic isolated JS-to-TS modify/delete conflict; no production fix or remote mutation", "steps": [ { "executable": "git", "args": [ "init", "--initial-branch=master" ], "status": 0, "stdout": "Initialized empty Git repository in C:/Users/laozh/AppData/Local/Temp/artplayer-consumer-Etvdz1/.git/\n", "stderr": "" }, { "executable": "git", "args": [ "config", "user.name", "ArtPlayer isolated rehearsal" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "config", "user.email", "rehearsal@example.invalid" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "config", "commit.gpgsign", "false" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "config", "core.autocrlf", "false" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "add", "." ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "commit", "-m", "fixture: original JavaScript implementation" ], "status": 0, "stdout": "[master (root-commit) a10e48e] fixture: original JavaScript implementation\n 3 files changed, 9 insertions(+)\n create mode 100644 consumer.mjs\n create mode 100644 package.json\n create mode 100644 src/retry.js\n", "stderr": "" }, { "executable": "git", "args": [ "rev-parse", "HEAD" ], "status": 0, "stdout": "a10e48e0c1f7a712fd602d5d8afcacef9a5e68b0\n", "stderr": "" }, { "executable": "node", "args": [ "consumer.mjs" ], "status": 1, "stdout": "", "stderr": "node:internal/modules/run_main:107\r\n triggerUncaughtException(\r\n ^\r\n\r\nAssertionError [ERR_ASSERTION]: Expected values to be strictly equal:\r\n\r\n-2 !== 0\r\n\r\n at file:///C:/Users/laozh/AppData/Local/Temp/artplayer-consumer-Etvdz1/consumer.mjs:4:8\r\n at ModuleJob.run (node:internal/modules/esm/module_job:561:25)\r\n at async node:internal/modules/esm/loader:647:26\r\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {\r\n generatedMessage: true,\r\n code: 'ERR_ASSERTION',\r\n actual: -2,\r\n expected: 0,\r\n operator: 'strictEqual',\r\n diff: 'simple'\r\n}\r\n\r\nNode.js v24.21.0\r\n" }, { "executable": "git", "args": [ "switch", "-c", "codex/rehearsal" ], "status": 0, "stdout": "", "stderr": "Switched to a new branch 'codex/rehearsal'\n" }, { "executable": "git", "args": [ "add", "." ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "commit", "-m", "fixture: split retry policy into TypeScript modules" ], "status": 0, "stdout": "[codex/rehearsal 61a9230] fixture: split retry policy into TypeScript modules\n 4 files changed, 4 insertions(+), 4 deletions(-)\n create mode 100644 src/normalize.ts\n delete mode 100644 src/retry.js\n create mode 100644 src/retry.ts\n", "stderr": "" }, { "executable": "git", "args": [ "rev-parse", "HEAD" ], "status": 0, "stdout": "61a92304ff91bfb87f6c1a08765276187b227cf3\n", "stderr": "" }, { "executable": "node", "args": [ "consumer.mjs" ], "status": 1, "stdout": "", "stderr": "node:internal/modules/run_main:107\r\n triggerUncaughtException(\r\n ^\r\n\r\nAssertionError [ERR_ASSERTION]: Expected values to be strictly equal:\r\n\r\n-2 !== 0\r\n\r\n at file:///C:/Users/laozh/AppData/Local/Temp/artplayer-consumer-Etvdz1/consumer.mjs:4:8\r\n at ModuleJob.run (node:internal/modules/esm/module_job:561:25)\r\n at async node:internal/modules/esm/loader:647:26\r\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {\r\n generatedMessage: true,\r\n code: 'ERR_ASSERTION',\r\n actual: -2,\r\n expected: 0,\r\n operator: 'strictEqual',\r\n diff: 'simple'\r\n}\r\n\r\nNode.js v24.21.0\r\n" }, { "executable": "git", "args": [ "switch", "master" ], "status": 0, "stdout": "", "stderr": "Switched to branch 'master'\n" }, { "executable": "git", "args": [ "add", "src/retry.js" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "commit", "-m", "fixture: clamp negative retry limits" ], "status": 0, "stdout": "[master fb62f91] fixture: clamp negative retry limits\n 1 file changed, 1 insertion(+), 1 deletion(-)\n", "stderr": "" }, { "executable": "git", "args": [ "rev-parse", "HEAD" ], "status": 0, "stdout": "fb62f918310b9cd01ca6deddff6acbb1eecd55c9\n", "stderr": "" }, { "executable": "node", "args": [ "consumer.mjs" ], "status": 0, "stdout": "retry limit regression passed\n", "stderr": "" }, { "executable": "git", "args": [ "switch", "codex/rehearsal" ], "status": 0, "stdout": "", "stderr": "Switched to branch 'codex/rehearsal'\n" }, { "executable": "git", "args": [ "status", "--porcelain" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "rev-parse", "HEAD^{tree}" ], "status": 0, "stdout": "9ed1ebc390513ca0f09c3c4fc20700b38fc2e614\n", "stderr": "" }, { "executable": "git", "args": [ "cherry-pick", "-x", "fb62f918310b9cd01ca6deddff6acbb1eecd55c9" ], "status": 1, "stdout": "CONFLICT (modify/delete): src/retry.js deleted in HEAD and modified in fb62f91 (fixture: clamp negative retry limits). Version fb62f91 (fixture: clamp negative retry limits) of src/retry.js left in tree.\n", "stderr": "error: could not apply fb62f91... fixture: clamp negative retry limits\nhint: After resolving the conflicts, mark them with\nhint: \"git add/rm \", then run\nhint: \"git cherry-pick --continue\".\nhint: You can instead skip this commit with \"git cherry-pick --skip\".\nhint: To abort and get back to the state before \"git cherry-pick\",\nhint: run \"git cherry-pick --abort\".\nhint: Disable this message with \"git config set advice.mergeConflict false\"\n" }, { "executable": "git", "args": [ "ls-files", "--unmerged" ], "status": 0, "stdout": "100644 44a1d3c1960ca191cb02699472e845df31381af2 1\tsrc/retry.js\n100644 826028d2df226a0d8c67fd275fbe689ae86b39c7 3\tsrc/retry.js\n", "stderr": "" }, { "executable": "git", "args": [ "rev-parse", "CHERRY_PICK_HEAD" ], "status": 0, "stdout": "fb62f918310b9cd01ca6deddff6acbb1eecd55c9\n", "stderr": "" }, { "executable": "git", "args": [ "cherry-pick", "--abort" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "rev-parse", "HEAD" ], "status": 0, "stdout": "61a92304ff91bfb87f6c1a08765276187b227cf3\n", "stderr": "" }, { "executable": "git", "args": [ "rev-parse", "HEAD^{tree}" ], "status": 0, "stdout": "9ed1ebc390513ca0f09c3c4fc20700b38fc2e614\n", "stderr": "" }, { "executable": "git", "args": [ "status", "--porcelain" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "cherry-pick", "-x", "fb62f918310b9cd01ca6deddff6acbb1eecd55c9" ], "status": 1, "stdout": "CONFLICT (modify/delete): src/retry.js deleted in HEAD and modified in fb62f91 (fixture: clamp negative retry limits). Version fb62f91 (fixture: clamp negative retry limits) of src/retry.js left in tree.\n", "stderr": "error: could not apply fb62f91... fixture: clamp negative retry limits\nhint: After resolving the conflicts, mark them with\nhint: \"git add/rm \", then run\nhint: \"git cherry-pick --continue\".\nhint: You can instead skip this commit with \"git cherry-pick --skip\".\nhint: To abort and get back to the state before \"git cherry-pick\",\nhint: run \"git cherry-pick --abort\".\nhint: Disable this message with \"git config set advice.mergeConflict false\"\n" }, { "executable": "git", "args": [ "rm", "src/retry.js" ], "status": 0, "stdout": "rm 'src/retry.js'\n", "stderr": "" }, { "executable": "git", "args": [ "add", "src/normalize.ts" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "node", "args": [ "consumer.mjs" ], "status": 0, "stdout": "retry limit regression passed\n", "stderr": "" }, { "executable": "git", "args": [ "-c", "core.editor=true", "cherry-pick", "--continue" ], "status": 0, "stdout": "[codex/rehearsal db16876] fixture: clamp negative retry limits\n Date: Tue Sep 15 00:24:23 2026 +0800\n 1 file changed, 1 insertion(+), 1 deletion(-)\n", "stderr": "" }, { "executable": "git", "args": [ "rev-parse", "HEAD" ], "status": 0, "stdout": "db16876b0622d8dd6337a2bebcf7bca9e743fa31\n", "stderr": "" }, { "executable": "git", "args": [ "log", "-1", "--format=%B" ], "status": 0, "stdout": "fixture: clamp negative retry limits\n\n(cherry picked from commit fb62f918310b9cd01ca6deddff6acbb1eecd55c9)\n\n", "stderr": "" }, { "executable": "git", "args": [ "status", "--porcelain" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "ls-files", "src/retry.js" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "node", "args": [ "consumer.mjs" ], "status": 0, "stdout": "retry limit regression passed\n", "stderr": "" }, { "executable": "git", "args": [ "show", "--format=fuller", "--binary", "db16876b0622d8dd6337a2bebcf7bca9e743fa31" ], "status": 0, "stdout": "commit db16876b0622d8dd6337a2bebcf7bca9e743fa31\nAuthor: ArtPlayer isolated rehearsal \nAuthorDate: Tue Sep 15 00:24:23 2026 +0800\nCommit: ArtPlayer isolated rehearsal \nCommitDate: Tue Sep 15 00:24:24 2026 +0800\n\n fixture: clamp negative retry limits\n \n (cherry picked from commit fb62f918310b9cd01ca6deddff6acbb1eecd55c9)\n\ndiff --git a/src/normalize.ts b/src/normalize.ts\nindex 74a0d7c..2251bcd 100644\n--- a/src/normalize.ts\n+++ b/src/normalize.ts\n@@ -1 +1 @@\n-export const normalizeLimit = (value: number): number => Math.trunc(value);\n+export const normalizeLimit = (value: number): number => Math.max(0, Math.trunc(value));\n", "stderr": "" }, { "executable": "git", "args": [ "bundle", "create", "D:\\github\\ArtPlayer\\refactor\\.cache\\mainline-rehearsal\\run-zTEWy5\\rehearsal.bundle", "--all" ], "status": 0, "stdout": "", "stderr": "" }, { "executable": "git", "args": [ "bundle", "verify", "D:\\github\\ArtPlayer\\refactor\\.cache\\mainline-rehearsal\\run-zTEWy5\\rehearsal.bundle" ], "status": 0, "stdout": "The bundle contains these 3 refs:\ndb16876b0622d8dd6337a2bebcf7bca9e743fa31 refs/heads/codex/rehearsal\nfb62f918310b9cd01ca6deddff6acbb1eecd55c9 refs/heads/master\ndb16876b0622d8dd6337a2bebcf7bca9e743fa31 HEAD\nThe bundle records a complete history.\nThe bundle uses this hash algorithm: sha1\n", "stderr": "D:/github/ArtPlayer/refactor/.cache/mainline-rehearsal/run-zTEWy5/rehearsal.bundle is okay\n" } ], "commits": { "base": "a10e48e0c1f7a712fd602d5d8afcacef9a5e68b0", "migrated": "61a92304ff91bfb87f6c1a08765276187b227cf3", "fix": "fb62f918310b9cd01ca6deddff6acbb1eecd55c9", "resolved": "db16876b0622d8dd6337a2bebcf7bca9e743fa31" }, "abort": { "restoredCommit": "61a92304ff91bfb87f6c1a08765276187b227cf3", "restoredTree": "9ed1ebc390513ca0f09c3c4fc20700b38fc2e614", "clean": true }, "resolution": { "source": "src/retry.js", "destination": "src/normalize.ts", "obsoleteFileAbsent": true, "regressionPassed": true, "attributed": true } }, "inventory": { "command": "yarn check:rollback-inventory", "packages": 22, "verifiedArchives": 20, "file": "refactor/baselines/rollback-inventory.json", "sha256": "33d083badfc54f4be5be42518b03fb499062ab724bc4f4ebb3c1dec32b9bfb8a", "deferredArtifacts": [ { "name": "artplayer-tool-thumbnail", "status": "complete-rollback-artifact-required" }, { "name": "artplayer-vitepress", "status": "previous-deployment-artifact-required" } ] }, "realRepository": { "command": "git fetch origin master", "log": "refactor/.cache/rel04-mainline-fetch-final.log", "exitCode": 0, "master": "40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f", "ahead": 257, "behind": 0, "incomingFixes": [], "cherryPicksApplied": [] }, "engineering": { "status": "passed", "log": "refactor/.cache/rel04-workflows-engineering.log", "exitCode": 0, "commands": [ "scoped ESLint for three workflow modules", "node --test test/rollback-files.test.js test/package-runtime.test.js refactor/scripts/ci-workflow.test.mjs", "yarn check:rollback-inventory", "yarn check:toolchain --strict", "node refactor/scripts/plan.mjs --check", "git diff --check" ] }, "limitations": [ "REL-04 remains doing: complete Thumbnail fallback and Pages recovery evidence remain.", "Iframe browser/device acceptance remains in PKG-IFRAME-05; these are real installation/import/type checks.", "Conflict exercise is synthetic and does not claim a production retry bug or repair.", "Registry mutable tags and current availability were not queried or changed.", "All final publication batches must bind actual next-major candidates and repeat relevant rollback checks.", "No dependencies, production source, root lock, distribution outputs, remote CI runs, push, tag or deployment changes." ] }