Repository navigation
Integrate 27 verified collection, artifact and CLI fixes - #410
Merged
Merged
Conversation
what changed: Fix #379; dispatch.mjs, dispatch regression coverage, architecture map, changelog and test inventory. why: Restore the existing collection input and credential-handling contract. This is a bug fix with one remedy; no alternative design was set aside. what it touched: Shared remote collection seams; existing ADR-0033/0034 behavior. No new domain term or public interface. what you verified: verified - dispatch/MCP red-first reproduction and passing combined regression run (83 tests); CLI integration regressions pass in the broader command run. The commit gate runs the required complete offline suite before accepting this commit. what you got wrong and fixed: mistake - running six full suites concurrently exceeded the default 3900-second budget; where - local commit validation on this Windows host; impact - affected hooks refused commits before publication; cause - excess concurrent subprocess and filesystem work; fix - retry one commit at a time with the ADR-0142 timeout extension (RESEARCH_KIT_GATE_TIMEOUT=7920); verified - the required full-suite commit gate accepted the commit.
what changed: Fix #376; dispatch.mjs, dispatch/MCP/CLI regression coverage, architecture map, changelog and test inventory. why: Restore the existing collection input and credential-handling contract. This is a bug fix with one remedy; no alternative design was set aside. what it touched: Shared remote collection seams; existing ADR-0033/0034 behavior. No new domain term or public interface. what you verified: verified - dispatch/MCP red-first reproduction and passing combined regression run (83 tests); CLI integration regressions pass in the broader command run. The commit gate runs the required complete offline suite before accepting this commit. what you got wrong and fixed: mistake - running six full suites concurrently exceeded the default 3900-second budget; where - local commit validation on this Windows host; impact - affected hooks refused commits before publication; cause - excess concurrent subprocess and filesystem work; fix - retry one commit at a time with the ADR-0142 timeout extension (RESEARCH_KIT_GATE_TIMEOUT=7920); verified - the required full-suite commit gate accepted the commit.
what changed: Fix #378; mcp.mjs, collect-remote.mjs, MCP/CLI regression coverage, architecture map, changelog and test inventory. why: Restore the existing collection input and credential-handling contract. This is a bug fix with one remedy; no alternative design was set aside. what it touched: Shared remote collection seams; existing ADR-0033/0034 behavior. No new domain term or public interface. what you verified: verified - dispatch/MCP red-first reproduction and passing combined regression run (83 tests); CLI integration regressions pass in the broader command run. The commit gate runs the required complete offline suite before accepting this commit. what you got wrong and fixed: mistake - running six full suites concurrently exceeded the default 3900-second budget; where - local commit validation on this Windows host; impact - affected hooks refused commits before publication; cause - excess concurrent subprocess and filesystem work; fix - retry one commit at a time with the ADR-0142 timeout extension (RESEARCH_KIT_GATE_TIMEOUT=7920); verified - the required full-suite commit gate accepted the commit.
what changed: dispatchCollection parses successful responses through readJsonBody; the existing malformed-body regression now covers dispatch as well as run/artifact lookup. why: A maintenance page was diagnosed as missing workflow_run_id and suggested pinning an API version already pinned. This restores the existing BAD_BODY contract; no alternative design was set aside. what it touched: dispatch.mjs, dispatch.test.mjs, its architecture map row and CHANGELOG.md; existing ADR-0033 semantics, no new domain terms. what you verified: verified - red-first dispatch reproduction (31 passed, one expected failure), then passing targeted dispatch tests. The required complete offline suite runs in the commit gate. what you got wrong and fixed: mistake - running six full suites concurrently exceeded the default 3900-second budget; where - local commit validation on this Windows host; impact - affected hooks refused commits before publication; cause - excess concurrent subprocess and filesystem work; fix - retry one commit at a time with the ADR-0142 timeout extension (RESEARCH_KIT_GATE_TIMEOUT=7920); verified - the required full-suite commit gate accepted the commit.
what changed: Require a root pathname, no search and no fragment in usableProxyUrl; extend proxy and doctor regressions, including a loopback-only fetch that must still go direct. why: Undici parseOrigin refuses those URL shapes, so auto-enabling them crashes Node fetch and doctor incorrectly reports success. Restore the existing invalid-proxy path (ADR-0047); no alternative design was set aside. what it touched: runtime.mjs, proxy.test.mjs, doctor.test.mjs, runtime/doctor architecture rows and CHANGELOG.md. No new interface or domain term. what you verified: verified - red-first runtime assertion and doctor regression. Targeted proxy/runtime/doctor checks and the required full suite run before commit acceptance. what you got wrong and fixed: mistake - running six full suites concurrently exceeded the default 3900-second budget; where - local commit validation on this Windows host; impact - affected hooks refused commits before publication; cause - excess concurrent subprocess and filesystem work; fix - retry one commit at a time with the ADR-0142 timeout extension (RESEARCH_KIT_GATE_TIMEOUT=7920); verified - the required full-suite commit gate accepted the commit.
what changed: Added a shared startup-choice reader used by runtime selection and doctor; warn when NODE_USE_ENV_PROXY is not 1 or startup flags disable proxies. Regression coverage includes environment values, flag precedence and unchanged no-override behavior. why: doctor promised proxy routing when the operator had explicitly left it off. Restore ADR-0047's diagnostic and startup-choice contract; no alternative design was set aside. what it touched: runtime.mjs, doctor.mjs, proxy/doctor tests, architecture rows, changelog and test inventory. No new public flag, config key or domain term. what you verified: verified - red-first direct doctor assertion. The targeted doctor/proxy tests and required complete offline suite run before commit acceptance. what you got wrong and fixed: mistake - running six full suites concurrently exceeded the default 3900-second budget; where - local commit validation on this Windows host; impact - affected hooks refused commits before publication; cause - excess concurrent subprocess and filesystem work; fix - retry one commit at a time with the ADR-0142 timeout extension (RESEARCH_KIT_GATE_TIMEOUT=7920); verified - the required full-suite commit gate accepted the commit.
what changed: Only non-array JSON objects may create or restore a last-good machine config snapshot. Added regressions for arrays, strings, numbers, booleans and null, plus preservation of an existing good backup. why: A JSON scalar or array holds no machine settings; restoring it after a parse failure silently enabled collector and fail-open defaults. Apply the existing ADR-0020/0023 fallback instead. No alternative design was set aside. what it touched: machine.mjs, machine tests, architecture map, changelog and README test inventory. No new config key, role or public interface. what you verified: verified - red-first reproduction (23 passed, two expected failures), then machine tests (25 passed, zero failures); handoff OK; root preflight PASS with its existing unstamped-brief warning; doctor READY on the collector with firecrawl-cli. The required full suite runs in the commit gate before acceptance. what you got wrong and fixed: nothing to report.
what changed: MCP argument validation and collect-remote use the existing checkClientRef identifier rule before token lookup or dispatch. A bare CLI flag is refused, empty/omitted references remain accepted, and the shared checker refuses CR/LF. Added MCP and CLI integration regressions and expanded the producer's existing identifier tests. why: Malformed references could start workflow runs that were certain to fail. Reuse the existing rule without rewriting a caller's correlation token. No alternative design was set aside. what it touched: mcp.mjs, collect-remote.mjs, artifact.mjs, MCP/CLI/producer tests, architecture rows, changelog and README inventory. No new flag, config field or domain term. what you verified: verified - red-first MCP reproduction (47 passed, one expected failure), then MCP/producer tests (80 passed, zero failed, two unsupported symlink capabilities on this host); thirteen offline CLI boundary cases passed, including valid 64-character and empty references, refusal before output creation, and credential redaction. Handoff OK; root preflight PASS; doctor READY collector/firecrawl-cli. The full suite runs in the required commit gate before acceptance. what you got wrong and fixed: mistake - adding client-ref to the generic flag checker rejected an explicit empty value; where - collect-remote argument validation; impact - caught before commit or delivery, it would have changed the existing optional-reference behavior; cause - that checker treats an empty string as a missing value; fix - refuse only the bare boolean flag there and let checkClientRef judge strings; verified - thirteen passing CLI boundary cases including an explicit empty reference.
what changed: usableOutDir resolves its argument and returns the absolute path it checked. MCP fetch_corpus passes that path to the shared downloader. Added download and MCP regressions for relative nested folders and links to the actual saved file. why: A relative download folder previously produced a root-anchored file URI that named a different location. Use the same resolved folder for access checks, writing and linking. No alternative design was set aside. what it touched: dispatch.mjs, mcp.mjs, dispatch/MCP tests, architecture rows, changelog and test inventory. No new option or path semantics for absolute folders. what you verified: verified - red-first reproduction (79 passed, two expected failures), then dispatch/MCP regressions (81 passed, zero failed); handoff OK and preflight PASS in this checkout. The required complete suite runs in the commit gate before acceptance. what you got wrong and fixed: nothing to report.
what changed: A non-PASS corpus download returns redacted validator codes, messages and remedies in its text result, with no resource link or review instructions. Build authorization remains false. Expanded existing invalid-package coverage over FAIL, BLOCKED and INCOMPLETE, including unreadable and contradictory inputs. why: Corrupt downloads were described as collected corpora awaiting review, while their actual remedies were absent from the text. Keep the existing approved/collected texts for PASS only. No alternative design was set aside. what it touched: mcp.mjs, existing MCP tests, architecture row and changelog. No new status, tool or field; inventory unchanged. what you verified: verified - red-first MCP reproduction (46 passed, one expected failure), then 47 passing MCP tests; handoff OK and preflight PASS in this checkout. The required full suite runs in the commit gate before acceptance. what you got wrong and fixed: nothing to report.
what changed: Fetch and search selection now require an own member of the existing registry. Added coverage for constructor, toString, __proto__, valueOf and hasOwnProperty through explicit arguments, environment and machine config. why: Plain object lookups accepted inherited members as adapters, allowing a run to start with no real transport. Use the existing UNKNOWN_TRANSPORT and UNKNOWN_SEARCH_PROVIDER refusals. No alternative design was set aside. what it touched: transport.mjs, transport tests, architecture row, changelog and README inventory. No new provider, setting or interface. what you verified: verified - red-first transport reproduction (120 passed, one expected failure), then 121 passing transport tests with zero failures; handoff OK and preflight PASS in this checkout. The required full suite runs in the commit gate before acceptance. what you got wrong and fixed: nothing to report.
what changed: Folded whitespace in timeline details before escaping table pipes. Added CR/LF, trailing-newline and pipe regressions, and regenerated the root TIMELINE.md from its existing corpus. why: Firecrawl's trailing stderr newline split failure rows across lines, including four rows in the committed root timeline. Normalize the derived table cell, preserving the underlying evidence. No alternative design was set aside. what it touched: timeline.mjs, hardening tests, architecture row, changelog, README inventory and derived research/TIMELINE.md. The provenance ledger and raw captures were not edited; their content remains evidence. what you verified: verified - red-first reproduction (65 passed, one expected failure, two unsupported capabilities), then 66 passing hardening tests with zero failures and two unsupported symlink capabilities; timeline regeneration produced 60 events and its diff joins exactly the four broken failure rows; ledger SHA256 stayed unchanged; handoff OK and preflight PASS. The required full suite runs in the commit gate before acceptance. what you got wrong and fixed: nothing to report.
what changed: Validate every requested group against available test filenames before importing any test. An unmatched group is named and refused with exit 2, including beside a valid group. Added CLI regressions for both orders and for valid multi-group runs. why: The union of group matches silently dropped misspelled groups while printing all tests passed. Apply the existing no-match refusal to each requested group. No alternative design was set aside. what it touched: selftest CLI, new selftest-cli tests, architecture description, changelog and research-kit README inventory. No new flag or result format. what you verified: verified - red-first one pass and one expected refusal failure; then three CLI regressions passed with zero failures, including parent-report isolation. Handoff OK and preflight PASS in this checkout. The required full offline suite runs in the commit gate before acceptance. what you got wrong and fixed: mistake - CLI regression children initially inherited RESEARCH_KIT_RESULT_FILE from the parent suite. where - selftest-cli.test.mjs runGroups. impact - a child wrote a partial group report to the full-suite report path; the observer captured that partial sample. The initial commit remained unpublished, and no delivered PR was affected. cause - copied the parent environment without excluding its output artifact path. fix - remove that variable from child environments and add a parent-report preservation regression; amend the unpublished commit through the full gate. verified - the new regression first failed with the parent file overwritten, then all three CLI tests passed in 13.3 seconds with the parent report unchanged.
what changed: Default downloads now create a fresh private mkdtemp folder per call. Before writing a package, lstat refuses an existing or dangling symbolic link as OUT_DIR. MCP's tool description names the private default. Added repeated-name isolation and real symlink regressions. why: A public artifact name in the shared temp root let downloads replace each other and follow a planted link. Allocate the existing default output in its own directory and refuse redirection at the package name. No alternative design was set aside. what it touched: dispatch and MCP libraries, dispatch tests, architecture row, changelog and research-kit README inventory. Explicit output-folder selection and atomic package writes retain their existing interfaces. what you verified: verified - red-first 79 passes, one expected isolation failure and one unsupported file-symlink capability; then 80 passes, zero failures and that same unsupported test across dispatch/MCP. Handoff OK, preflight PASS, doctor READY collector/firecrawl-cli in this checkout. Untested locally - real file symlinks and POSIX directory permissions; CI exercises those supported capabilities. The required full offline suite runs in the commit gate before acceptance. what you got wrong and fixed: nothing to report.
what changed: Scoped core.hooksPath reads now request Git include expansion. A disposable global-config fixture covers ordinary includes and gitdir conditional includes through preview, install, recorded hand-on and uninstall restoration. why: Git defaults scoped config reads to excludes, so a configured hooks folder was reported as unset and lost from the hand-on record. Request the effective included value with the existing scoped reader. No alternative design was set aside. what it touched: machine.mjs, doctor tests, architecture map, changelog and research-kit README inventory. Writes still use the existing Git config writer. what you verified: verified - red-first 66 passes and one expected include-read failure; then 90 doctor/machine tests passed with zero failures. Handoff OK and preflight PASS in this checkout. The required full offline suite runs in the commit gate before acceptance. Git's config documentation confirms scoped reads need --includes. what you got wrong and fixed: mistake - the first Windows fixture spelled the conditional Git path with Node realpath, which did not match Git's RUNNER~1 temp-path spelling. A follow-up using --absolute-git-dir targeted the wrong matching path. fix - derive the worktree root from `git rev-parse --show-toplevel`, so Git supplies the path spelling it uses for includeIf. verified - 90 doctor/machine tests passed, zero failures, in 108.5 seconds; the final fixture correction is queued for the full commit gate and supported CI.
what changed: Install-state reads accept only objects, keep non-empty string paths and path arrays, and filter skill hashes with the installer's existing string-value rule. Doctor warns by filename when an existing record lacks a readable deployment path instead of passing ill-typed data to path functions. why: Parsed JSON was treated as a valid install record, allowing numbers, arrays and other values to crash doctor or be spread into future writes. Apply the same boundary typing already used for machine config. No alternative design was set aside. what it touched: machine/doctor libraries and tests, architecture, changelog and research-kit README inventory. Existing install-state field names and other metadata are preserved. what you verified: verified - red-first 89 passes and three expected failures; then 92 doctor/machine tests passed in 134.6 seconds. Covered non-object records, ill-typed and blank paths, mixed arrays/hash values, read-only preservation, named deploy warnings and the CLI's JSON output. Handoff OK, preflight PASS, doctor READY collector/firecrawl-cli in this checkout. The required full offline suite runs in the commit gate before acceptance. what you got wrong and fixed: nothing to report.
what changed: Ledger verification is triggered by actual raw archive entries and parsed evidence rows as well as manifest claims. Added relabelled-capture/missing-ledger, relabelled-capture/invalid-ledger and evidence-rows-only regressions. Corrected the existing failed-collection fixture to have an actually empty evidence table. why: Untrusted manifest roles and capture counts could turn off provenance checks while evidence still travelled. Judge what the archive carries, preserving the accepted empty failed-collection case. No alternative design was set aside. what it touched: artifact validator/tests, architecture row, changelog and research-kit README inventory. No new format, option or provenance implementation. what you verified: verified - red-first 45 passes and one expected failure; after the implementation, the old failed-collection fixture exposed retained evidence rows despite its empty-scaffold claim. Corrected that fixture, then all 46 artifact-validator tests passed in 6.5 seconds. Missing/garbage chains fail even with relabelled roles and zero counts; the genuinely empty failed-collection case passes. Handoff OK, preflight PASS, doctor READY collector/firecrawl-cli in this checkout. The required full offline suite runs in the commit gate before acceptance. what you got wrong and fixed: mistake - initially accepted the existing failed-collection fixture's empty-scaffold description. where - fixture 03-failed-collection-valid. impact - the first targeted run rejected it because it actually retained collected evidence; no delivered PR was affected. cause - the old fixture removed captures and ledger but kept the populated EVIDENCE table. fix - empty that synthetic table to represent the promised uncollected scaffold, preserving production checks. verified - 46 artifact-validator tests passed, including both the empty scaffold and the evidence-rows-only ledger requirement.
what changed: Evidence context validates recorded Raw paths before reading, refuses private project files/traversal/links leaving research/raw, and distinguishes directories from missing captures. ADR-0109's defect trigger also migrates corpus capture/Raw checks and artifact Raw/ledger readers to projectFile; a non-file ledger is refused before reading. why: A Raw cell could print a project's private file into an agent context. The accepted ADR-0109 explicitly requires the other recorded-path readers to move when this deferral's defect trigger fires. No alternative design was set aside. what it touched: evidence-context, corpus and artifact libraries; evidence-context and artifact-producer tests; all three architecture rows; ADR-0109 implementation note, changelog and research-kit README inventory. what you verified: verified - red-first 90 passes, three expected failures and four unsupported file-symlink tests; then 93 passes, zero failures and the same four unsupported capabilities across evidence-context/corpus/artifact-producer. Direct/traversal private paths cause zero private reads and no text/JSON disclosure; directories and non-file ledgers are named. Handoff OK, preflight PASS, doctor READY collector/firecrawl-cli in this checkout. Untested locally - real file links; the CI matrix exercises supported symlink capabilities. The required full offline suite runs in the commit gate before acceptance. what you got wrong and fixed: mistake - the documentation updater assumed every architecture row ended with an ADR column. where - the local architecture-update step. impact - its first attempt stopped before writing the map; no delivered PR was affected. cause - the existing corpus row spans lines and the evidence-context row has an empty ADR cell. fix - update each module's responsibility prefix and record the expired deferral. verified - all three rows changed and git diff --check passed; the targeted code checks remain 93 passes, zero failures and four unsupported capabilities.
what changed: Share authorization derivation between producer and validator. Re-derive claimed approvals from package contents under a portable baseline, preserve false claims, and verify pre-0069 format-1 stamps against their historical input hash. Add regressions, ADR-0160, source probes and indexes. why: A manifest's approval booleans are claims, not proof. Portable validation must evaluate package contents without consumer policy and preserve verified legacy behavior. what it touched: artifact state/producer/validator modules and tests; architecture map and 64-module inventory, ADR-0160, decision research corpus and trace, changelog and README inventory/count. what you verified: verified - targeted artifact group 105 passed, 0 failed, 2 unsupported Windows symlink checks; architecture-map 21 passed; root preflight PASS (28 pass, 1 warn); handoff OK; doctor ok with no blockers. Full commit gate is running again. what you got wrong and fixed: mistake - initial module inventory stayed at 63 after adding artifact-state.mjs; where - docs/ARCHITECTURE.md current inventory; impact - first gate blocked commit, no delivery affected; cause - new module row was added without updating the filesystem count; fix - corrected count to 64; verified - architecture-map passed 21/21. Also mistake - research probe README trace link had the wrong relative depth; where - nested research/probes/README.md; impact - link would not resolve, no product impact; cause - parent directory depth was miscounted; fix - corrected to ../../../collection-357.log; verified - rg shows corrected link.
what changed: Classify rate-limited 403 responses from GitHub headers or message for dispatch and run reads; preserve Retry-After and reset time. why: Rate limits and token permissions both use 403, so diagnostics should identify the actual cause. No alternative design was set aside. what it touched: dispatch library/tests, architecture, changelog and test inventory; no retry policy or public interface. what you verified: verified - red-first 32 passes/1 expected failure, then 33 dispatch tests pass; handoff OK, preflight PASS, doctor READY. Full gate is running. what you got wrong and fixed: nothing to report.
what changed: Keep source as the broken machine config and carry snapshotSource separately. Doctor reports the held snapshot and effective posture/role; collection refusal names an unknown role from that snapshot. why: Snapshot resolution previously named the good file as broken and confused configured fail-closed with fallback. what it touched: machine/doctor libraries and tests, architecture, changelog and README inventory. Resolved settings and collection policy are unchanged. what you verified: verified - red-first 88 passes, 3 expected failures; then 91 doctor/machine tests pass. Handoff OK, preflight PASS, doctor READY. Full gate is running. what you got wrong and fixed: nothing to report.
what changed: Require a string numeric dotted version before classifying its major. Missing, ill-typed, malformed and below-oldest versions yield MANIFEST-SCHEMA/FAIL with a regeneration remedy; only newer majors yield FORMAT-UNSUPPORTED/INCOMPLETE. why: Invalid manifests were incorrectly described as newer packages with an upgrade remedy. Preserve the distinction between corruption and an unimplemented format. what it touched: artifact validator/tests, architecture, changelog and README test inventory. No supported format or exit-code mapping changed. what you verified: verified - red-first 45 passed/1 expected failure; then 46 artifact-validator tests passed. Handoff OK, preflight PASS, doctor READY. Full gate is running. what you got wrong and fixed: nothing to report.
what changed: Await the existing exitAfterFlush helper for all artifact CLI help, refusal, success and validation endings. Add large-output regressions for JSON and text with 700 missing files. why: Direct process.exit can discard queued stdout on POSIX pipes, truncating reports after 64 KiB. Drain output before preserving the existing exit code. what it touched: artifact CLI/tests, architecture, changelog and README test inventory. No report schema or exit-code change. what you verified: verified - corrected baseline and fixed CLI each passed 23 artifact-cli tests; large JSON parses and text retains 700 errors, both over 64 KiB and exit 1. Handoff OK, preflight PASS, doctor READY. Full gate is running. what you got wrong and fixed: mistake - initial missing-files fixture was rebuilt by the seal helper. where - artifact-cli test. impact - it did not reproduce the truncation defect; no delivery affected. cause - default inventory recomputation; fix - preserve the mutated inventory using recomputeFiles:false; verified - corrected baseline and fixed CLI each passed 23 tests.
what changed: The validator now exposes manifest state and identity metadata only after schema validation. The artifact CLI escapes control characters in every text diagnostic field, so malformed manifest strings remain on one physical line and cannot forge a verdict. JSON reports retain normal escaping. why: Issue #360 showed package-supplied state, packageId, clientRef and unknown schema keys could inject terminal controls or a second PASS line, including under --quiet. Quiet mode promises a single verdict line and exit status alone cannot protect a human reading output. what it touched: artifact-validator report shape, artifact CLI text rendering, artifact CLI regressions, architecture map, changelog, README test inventory. No format schema or exit-code change. what you verified: verified - red-first 22 passed/2 expected failures; then 69 artifact-cli and artifact-validator tests passed. Coverage includes forged state under --quiet, newline in an unknown manifest key, terminal escape in packageId, newline clientRef, and null metadata for invalid schemas. Architecture-map 21 passed; handoff OK (33 ledger entries, 27 evidence rows); preflight PASS (28 pass, 1 warn, 0 fail); doctor ok with no blocking findings. Cached diff check clean. A retained full gate blocked on the preflight-scope CLI case (1778 passed, one failed, 12 unsupported); a subsequent interrupted focused run returned null child statuses in other CLI cases. The precise cause was not retained by those helpers. An isolated repeat with unchanged assertions passed all 120 CLI/artifact-CLI tests in 396.4 seconds, with no spawn errors. Temporary diagnostics were restored from exact backups before the normal full gate retry. The required full offline suite runs in the commit gate before acceptance. what you got wrong and fixed: mistake - the first green-regression assertion rejected the string PASS anywhere in output, including the escaped key name on its now-safe diagnostic line. where - artifact-cli.test.mjs hostile metadata test. impact - it falsely failed a safe one-line rendering; no product behavior or delivered result was affected. cause - the assertion checked for a substring, not an actual forged physical output line. fix - assert no physical line starts with the forged PASS verdict, and assert the unknown key yields exactly one MANIFEST-SCHEMA line. verified - artifact-cli and artifact-validator groups passed 69 tests, 0 failures.
what changed: ZIP inspection now detects a regular file used as another entry's parent directory, independent of entry order, before any inflation or materialization. Explicit file/directory name collisions also receive ZIP-PATH-COLLISION. Added two validator fixtures with stable FAIL results and diagnostics that contain no private temp path or raw filesystem error. why: A readable, self-contradictory archive should be FAIL; it previously threw EEXIST during materialization and became BLOCKED with a temporary path and a misleading kit-bug remedy (#362). This applies the existing structural ZIP refusal boundary. No alternative design was set aside. what it touched: artifact-zip inspection, artifact-validator fixtures, the artifact-zip architecture row, changelog and README test inventory. No schema, public option or exit-code mapping changed. what you verified: verified - red-first 45 passed and two expected collision failures; then 47 artifact-validator tests passed. The final strengthened diagnostics assertion passed in 35.2 seconds. Architecture-map 21 passed; handoff OK (33 ledger entries, 27 evidence rows), preflight PASS (28 passing, one warning, no blockers), doctor READY collector/firecrawl-cli. The issue's artifact-zip test group has no file in this tree; its ZIP regressions are in artifact-validator. The required full offline suite runs in the commit gate before acceptance. what you got wrong and fixed: mistake - the initial temp-path assertion searched for research-kit-artifact- instead of the actual rk-artifact- prefix. where - artifact-validator.test.mjs collision diagnostic assertion. impact - the assertion did not independently detect the real private extraction path; the FAIL/status and ZIP-PATH-COLLISION checks still caught the baseline defect, and no delivered PR was affected. cause - the prefix was written without checking materializeProject. fix - check the actual scratch directory and rk-artifact- prefix, plus EEXIST/ENOTDIR, in all diagnostic messages and remedies. verified - all 47 artifact-validator tests passed in 35.2 seconds.
what changed: Bring the merged README preview and contributor guide into the selftest fix branch; preserve both changelog entries. why: Main advanced through PR407 after the fix's CI run. Strict branch protection requires the current base and its combined checks before merging PR395. what it touched: Root README, CONTRIBUTING.md, docs/assets/research-overview.svg and CHANGELOG.md only. The selftest implementation, tests, architecture map and inventory remain exactly those of the accepted fix commit. what you verified: verified - original fix fe7f338 passed its full local commit gate and all seven CI jobs. Main's presentation input passed all seven CI jobs. The only merge conflict was additive changelog prose and both entries are retained. The normal docs commit gate and combined-head GitHub CI follow this resolution; those outcomes are not yet observed in this report. what you got wrong and fixed: nothing to report.
what changed: Corrected ADR-0121's two stale target slugs. Extended the existing ADR hygiene test to resolve relative file links in every numbered ADR body. Added current context for missing artifact references in the dated benchmark plans and the snapshot review's unretained probe, while keeping the received review unchanged. why: Broken decision links hid the records ADR-0121 refines, while the hygiene test only checked the index (#292). Historical planning references also needed to state that their named artifacts are not shipped in this repository. No new design choice or alternative was set aside. what it touched: ADR-0121, repo-hygiene test, docs/superpowers README and changelog. Expanded an existing test, so the README test count is unchanged. No product code or archived record was removed or rewritten. what you verified: verified - the expanded check failed by naming exactly the two stale ADR-0121 links; after correcting them, repo-hygiene passed 11 tests, zero failures in45.8s. The first full gate blocked with two bundle-integrity failures (1775 passed,12 unsupported) caused by the review edit. After restoring that file, bundle.mjs reports66/80 unchanged,14 expected drift and no unexpected drift. Focused bundle/repo-hygiene/CLI passed141 tests,zero failures,zero unsupported in215.1s after the correction, including both previously failing cases. Handoff OK, preflight PASS (28 passing,one warning,no blockers), doctor READY collector/firecrawl-cli. The probe path is absent from tracked files and available Git history. The required full offline suite runs again in the normal commit gate before acceptance. what you got wrong and fixed: mistake - I edited the received snapshot review to explain a missing probe instead of keeping that archived record unchanged. where - docs/researcher-review-2026-09-16.md line36. impact - two archive-integrity checks failed and the full gate refused the commit; no commit or PR was delivered. cause - I treated a historical clarification as a current-document edit without checking the bundle's frozen planning records. fix - restore the review exactly and move the clarification into the new dated-artifact guide. verified - bundle.mjs reports no unexpected drift and focused bundle/repo-hygiene/CLI passed141 tests,zero failures; the normal full gate retry remains required before publication.
what changed: Integrated PR382-406, PR408 and PR409 while preserving each source head as a merge parent. Retained all new regressions, resolved overlapping added tests, combined changelog and architecture responsibilities, and reconciled the suite inventory to1835. Artifact approval uses the shared derivation while retaining capture-folder path checks. The historical approval-hash reference now uses the same dated synthetic inputs as its recorded probe, while functional approval fixtures stay current. why: The independently reviewed fixes overlap in tests and documentation. A single combined tree must pass the normal local gate and current-main CI before those fixes reach main. No branch protection or test gate is changed. No new product design or rejected alternative is introduced by the integration. what it touched: Collection/dispatch/MCP validation, proxy choice and reporting, machine config diagnostics, capture and artifact validation, ZIP collision handling, artifact output, selftest grouping, FI conformance indices, ADR links, related regressions and current docs. The README's top preview remains intact. Existing raw captures, ledgers and received planning/review records remain byte-intact; PR400's decision corpus is copied byte-for-byte from its reviewed commit. what you verified: verified - all original25 PR heads remain the freshly inspected exact heads, each with seven successful CI jobs. Static integration audit retains the regression declarations, checks syntax and library map coverage, compares new captured blobs with their reviewed source commit, and confirms existing captures were not changed. Root preflight PASS (28 passing,one warning), handoff OK (27 evidence rows), doctor READY collector, and bundle verification has no unexpected drift. PR408's Node24 and archive suites passed all1790 tests; their stale README count failure is corrected in the combined inventory. PR409's normal full gate accepted its corrected commit. The first combined gate refused one calendar-dependent historical-hash assertion (1820 passed,1 failed,14 unsupported); focused reproduction was53 passed/1 failed, and after correcting only its reference fixture date the artifact-validator group passed54 tests/0 failures in9.3s. The normal combined full gate runs again before acceptance. untested - final combined GitHub CI, which must pass before merging. expected - original PRs become indirectly merged when their preserved heads reach main. what you got wrong and fixed: mistake - carried a date-dependent historical-hash assertion into the integration. where - artifact-validator.test.mjs legacyApproved helper. impact - the normal gate refused the unpublished commit after midnight changed the fixture input hash. cause - compared today's generated corpus with the hash recorded for October13. fix - keep the recorded sample's date fixed for the independent historical-algorithm assertion, and keep the functional approval packages on today's inputs; no approval condition or recorded evidence was changed. verified - the focused run first reproduced the mismatch, then all54 artifact-validator tests passed with the historical hash assertion retained; the full gate retry must accept the commit before publication.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Collection inputs that changed GitHub routes or runner lines are now refused before dispatch. Forged approval claims and unsafe packages fail offline validation, capture readers stay inside the capture folder, and proxy/config/CLI errors identify their actual cause. This integrates 27 reviewed fixes in one checked tree, reconciles their overlapping tests and docs, and preserves each source fix commit.
what changed: Combined the source PRs below, retained their regressions, updated the architecture responsibilities and changelog, and reconciled the suite inventory to 1,835. Fixed the historical approval test's date-dependent reference while keeping current approval packages and the recorded historical hash assertion.
why: These fixes overlap in shared code, regression files and documentation. The resulting tree needs one complete integration check before reaching main.
what it touched: The modules/tests documented by the source PRs, current architecture and contribution-facing release notes, and ADR link hygiene. The top README preview stays intact. Existing captured pages, ledgers and received review records stay byte-intact; the added decision corpus matches its reviewed source blobs.
what you verified: verified — the normal full-suite commit gate accepted 0dc3ff0 on Windows / Node 24.20.0. The static audit retained 45 added regression declarations, checked 33 JavaScript files and 64 library map entries, and verified captured-byte preservation. Root preflight PASS, handoff OK, doctor READY and no unexpected bundle drift. All original 25 source heads had seven successful CI jobs. PR408 passed all 1,790 tests on its Node24 and archive runs but failed the stale README inventory check; the combined inventory includes its added test. PR409 could not start standalone CI because its changelog conflicts with main; that conflict is resolved here. The corrected artifact validator group passed 54/54 tests. Untested at publication — combined GitHub CI; all required current-base checks must pass before merge. Local unsupported capabilities remain governed by the existing documented policy; no unsupported test is claimed as passing.
what you got wrong and fixed: mistake — the first integration retained a current-date fixture assertion against an October13 historical reference; where — artifact-validator.test.mjs legacyApproved; impact — the normal gate refused the unpublished commit with one failure; cause — the reference corpus date was assumed to remain today; fix — assert the recorded hash against the fixed-date reference corpus and keep functional approval packages fresh; verified — focused red reproduction, 54/54 passing artifact tests, and the accepted normal full gate.
The source heads are preserved as merge parents. Their PRs should become indirectly merged when this checked integration reaches main. No hook bypass, protection change, force push or squash is used.
Fixes #379
Fixes #376
Fixes #378
Fixes #377
Fixes #380
Fixes #381
Fixes #368
Fixes #375
Fixes #372
Fixes #371
Fixes #349
Fixes #354
Fixes #369
Fixes #332
Fixes #373
Fixes #365
Fixes #358
Fixes #351
Fixes #357
Fixes #374
Fixes #366
Fixes #361
Fixes #359
Fixes #360
Fixes #362
Fixes #337
Fixes #292