Commit Graph
222 Commits
Author SHA1 Message Date
haelyra eb267762a1 test(x402): reject a provably invalid ECDSA scalar
Zero the 32-byte r scalar while preserving the signature encoding, length, s and recovery byte. The previous tail overwrite could leave r/s unchanged and normalize recovery 27 to 0, preserving a valid payment. Keep and strengthen no-claim/no-handler/no-settlement checks before serving the original valid payment.
2026-10-29 19:14:07 -07:00
haelyra 6d7d4920c8 fix: close final integration security and portability gaps 2026-10-29 12:57:39 -07:00
haelyra 44e508922a fix: integrate x402 replay guard with bounded retention and audited test dependencies 2026-10-29 11:42:39 -07:00
haelyra 59b8ab024f maint: integrate reviewed contribution #3707 2026-10-29 11:23:24 -07:00
haelyra 9b296f4cab docs: preserve latest contributor migration safeguards and workflow assertions 2026-10-29 11:17:59 -07:00
Christopher FerjoandClaude Opus 5.5 c11288086c fix(skills): release x402 claims that land after a timeout
A claim write that times out can still land. When the guard fails
closed the handler never ran, so a late claim would make every retry
look like a replay of work that never happened; delete it once it
lands. Type the snippet so it passes tsc --strict against the real
packages, and close idle keep-alive sockets in the test on Node 18.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 17:44:03 -07:00
Christopher FerjoandClaude Opus 5.5 46baaeddf0 fix(skills): claim x402 payments in onAfterVerify, fail closed
Claim from the verified payload and matched requirements in the
resource server's onAfterVerify hook, so a forged header can no longer
reserve a legitimate payment's key, and an invalid payment takes no
claim. Fail closed on a store error or timeout by returning an abort
(a throwing hook is skipped and would run the handler unguarded);
document fail-open as an explicit, idempotent-only choice. Cover
Permit2 (BigInt nonce) and keep claims until validBefore/deadline.

The test now drives the real @x402/express middleware with payments
signed by the real @x402/evm client and a stand-in facilitator that
checks EIP-3009 signatures with viem, so verification, the hook, the
handler and settlement run in their real order. Adds exact-pinned,
test-only devDependencies and refreshes the registry digest.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 17:25:46 -07:00
Christopher FerjoandClaude Opus 5.5 8f7672406c fix(skills): keep x402 replay claims until the authorization expires
The signer picks the EIP-3009 validBefore and verification does not cap
it at maxTimeoutSeconds, so a fixed 900 s TTL could drop the claim for
a still-valid authorization whose settlement failed, and a copy would
run the handler again. Expire claims at validBefore + 60 s (900 s
floor, one-year ceiling) with SET NX EXAT, using node-redis's current
option form. Also wrap messageBytes for createHash so the snippet
typechecks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 17:13:51 -07:00
Christopher FerjoandClaude Opus 5.5 ef5a0805a4 fix(skills): cap pending replay claims when the store stops replying
The claim timeout stops a request from waiting but does not cancel the
command, so a connected-but-silent Redis could accumulate abandoned SETs.
commandsQueueMaxLength bounds them; past the cap, claims reject at once
and the guard fails open. The test asserts the cap and counts unhandled
rejections in its summary.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 17:13:51 -07:00
Christopher FerjoandClaude Opus 5.5 e24bffde26 fix(skills): harden x402 seller replay guard; add executable test
- Connect to Redis in the background with an error listener and the
  offline queue disabled, so an unavailable store never blocks startup
  or crashes the process; bound each claim with a 250 ms timeout.
- Include the asset in EVM claim keys (EIP-3009 nonces are per token).
- Cap the payment header at 16 KB before storing anything, and note that
  the path needs the same rate limits as any unauthenticated write.
- State the TTL rule: longer than maxTimeoutSeconds plus the slowest
  handler run.
- tests/ci/agent-payment-x402-seller-guard.test.js runs the guard block
  from all three documents: concurrent copies, key equivalence (EVM
  re-encoding, asset, Solana fee-payer slot), offline and hanging store,
  oversized and missing headers.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 17:13:51 -07:00
haelyra 108ff18624 feat(ci): limit Issue bursts and open submissions per author (#3723)
Verified with 30 exact-head hosted checks, 31 combined PR and Issue tests, workflow security validation, and a live read-only Issue replay.
2026-10-25 15:16:53 -04:00
4c28a7be9e ci: audit closed-issue delivery claims — cited PRs must actually be merged (#3522)
* ci: audit closed-issue delivery claims — cited PRs must actually be merged

Follow-up to #3223: an issue closed as 'fixed in #N' while #N was closed
without merging (or does not exist) leaves a completion claim that does not
hold. The weekly maintenance workflow now runs a read-only audit over issues
closed in the last 30 days, extracts delivery-claim PR references from issue
bodies and close-window comments, verifies each cited PR's merge state, and
reports findings to the step summary.

Design constraints:
- Read-only: no comments, no closes, no labels; findings are advisory and
  the run always stays green so the weekly audit never blocks maintenance.
- Unverifiable counts as unmerged: a 404 PR or an API failure fails the
  verdict, because an unverifiable claim is exactly the failure mode.
- Pure decision functions are exported for tests; a first live run against
  this repository surfaced one real finding (#3408 cites #3060, which does
  not resolve), included here as the motivating sample.

8 unit/contract tests: extraction, windowing (close comments included),
the #3223 unmerged-citation failure mode, the all-clear summary, workflow
contract, and a no-write guard.

* ci: rework audit evidence contract — claims vs context, four PR states, visible completeness

Revision per the #3522 review (reviewer ran the CLI through 19 controlled
cases plus a bounded live check of #3408):

- Bind findings to asserted delivery claims. Closing wording ('Delivered
  through #N'), claim verbs (fixed/shipped/landed/resolved/...), and bare
  'PR #N' inside closing comments are claims; historical mentions, quoted
  lines, fenced examples, negated claims, and tracking-only references are
  reported as contextual references and never produce findings. On the live
  #3408 the audit now recognizes the closing claim #3500 (merged) instead of
  flagging the historical #3060 text.
- Separate observed states: merged / open-unmerged / closed-unmerged /
  unknown (404, rate limit, transient). Unknown claims are advisory manual-
  verification items, not failed claims; each row carries the claim snippet,
  its source link, and the observation time. Checked claims are listed even
  when passing, so the report is traceable rather than an opaque all-clear.
- Paginate issue and comment collection (--paginate --slurp), bound comment
  requests (200) and PR checks (100), and surface skipped pages, rate limits,
  and retrieval failures as an explicit incomplete audit instead of an empty
  all-clear. A live-run maxBuffer overflow on the paginated issue list was
  caught and fixed (64MB); the audit reported it as incomplete before the fix.
- Scope the job to read access: job-level contents/issues/pull-requests read.

13 contract/unit tests including a CLI fixture (stub gh) that places the
relevant issue on page two and forces a comment-fetch failure.

* ci: report incomplete audit at PR check cap

---------

Co-authored-by: chenhz01 <chenhz01@users.noreply.github.com>
Co-authored-by: haelyra <49814733+haelyra@users.noreply.github.com>
2026-10-25 14:41:22 -04:00
Rufat Azizzade 6ab58b6d3b fix(tests): resolve python utf-8 io and timeout issues on Windows 2026-10-25 02:49:07 +02:00
Affaan Mustafa 9471ef4724 test(runner): add a worker pool and an ECC_TEST_ONLY filter to run-all
The runner executed 422 files one process at a time, which is most of
the 12 to 40 minutes a CI lane spends in "Run tests". ECC_TEST_JOBS
above 1 now runs files through a pool of that many processes; output is
still buffered and printed per file, so logs read the same. The default
stays 1 and that path is the original synchronous spawnSync loop, so the
VM-driven runner test and the piped-output tests are unchanged.

ECC_TEST_ONLY is the mirror of ECC_TEST_SKIP: a comma-separated list of
path substrings, and only matching files run. CI uses it to give the
package-manager lanes just the suites that read the package-manager
variable instead of the whole suite.

Two real-process tests cover the pool (grouped output, counted failure,
summary last) and the ONLY filter.
2026-10-20 10:47:58 -04:00
Affaan Mustafa 944ea9d050 fix(ci): unescape node -e inline programs in one pass
validateInlineJs unescaped the shell body with four chained replaces,
so a backslash pair followed by n or t was unescaped twice: the pair
became one backslash, then the new backslash-n became a newline. A
valid hook command such as console.log('\\n') failed validation with
an unterminated string. CodeQL flags the chain as double unescaping.

One regex pass maps each escape exactly once. The regression test
feeds the escaped-backslash program through the validator CLI.
2026-10-19 22:03:57 -04:00
Affaan Mustafa 6c557856af feat(ci): cap open PRs per contributor at ten (#3639)
Extend the PR burst guard with an open-PR cap. On every opened or reopened
PR by a non-collaborator, the guard lists the repository's open PRs, keeps
the author's oldest `maxOpen` (10) open and closes the newer ones with a
bot comment that names the count and the limit. No lock, no maintainer
alert: the cap is about review capacity, not spam. PRs the burst logic
already closed in the same run are excluded so nothing is mutated twice.
Collaborators with write access stay exempt, dry run reports without
mutating, and the comment is deduplicated on a bot-authored marker.

Haley asked for this on 2026-10-19: each contributor should only have 10
to 15 PRs open at a time. Existing open PRs are not bulk-closed; the cap
applies as each author opens or reopens their next PR.

Verification: 22 unit tests and the HTTP workflow test pass,
validate-workflow-security passes, eslint and markdownlint clean. Dry run
against affaan-m/ECC on #3621 reports openCount 19 and nine cap excess
PRs for that author, with no writes.
2026-10-19 18:08:53 -04:00
haelyra 0ad248d199 feat(ci): guard PR submission bursts and alert maintainers 2026-10-15 14:33:45 -04:00
haelyra 837cbb0773 fix(catalog): reject unmarked agent-tree skill undercounts 2026-10-11 01:56:28 -04:00
haelyra 7682bb5b49 fix(adapters): bound parsing and publish review artifacts safely 2026-10-10 18:38:26 -04:00
haelyra be230bd85c feat: integrate reviewed adapters, conversion and GateGuard improvements 2026-10-10 17:53:23 -04:00
haelyra 9d09febe5d fix(skills): scope host compatibility to target projections 2026-10-10 17:44:28 -04:00
haelyra 6038e89904 Merge PR #3428: validate and sync every catalog project tree entry 2026-10-10 17:37:24 -04:00
Matt Van Horn e128f4398b Merge branch 'main' into cursor/skill-host-compat-ci-10d0 2026-10-10 07:09:43 -07:00
haelyra aac9b3d34b fix: preserve activity errors, asset bytes and runner summaries
Treat non-2xx activity responses as feed errors, preserve non-Markdown Copilot agent assets, and apply the reviewed reference escape parity correction with regenerated bindings. Allow the test runner to drain piped output on its existing success or failure exit status. Validate installed workflows and bounded real Node20/24 pipe regressions.
2026-10-09 19:33:37 -04:00
haelyra 5981dd7092 fix: complete reviewed integration workflows and safety checks 2026-10-09 18:54:39 -04:00
haelyra b6e2cfe5e4 merge: preserve tested installer extraction 3187 and Copilot ownership fixture 2026-10-09 17:05:03 -04:00
haelyra eed806bf4a fix: restore unskipped installer refactor validation
Follow up PR #3187 at 38b8c07f while preserving the original contribution history and all current-main helper bodies. Remove both CI safety-suite exclusions, clean stale imports and the warning glyph, retain shipped test/coverage entrypoints, and keep unknown test totals honest. The tree matches the fully tested 6246-pass/325-file tree; disposable Claude/OpenCode lifecycle passes.
2026-10-09 16:32:47 -04:00
haelyra 206ad23125 merge: preserve payment source 2575 with tested origin and approval boundaries 2026-10-09 16:27:03 -04:00
haelyra 1d02fbfa51 merge: preserve tested agent-security source 3015 2026-10-09 16:11:53 -04:00
haelyra c4f419bea0 merge: refresh reviewed stewardship source 3280 on current main 2026-10-09 16:02:58 -04:00
haelyra 9e951e266d fix: normalize portable workspace path separators 2026-10-09 15:49:31 -04:00
sybertoooth7-lgtm 8c560ac0cd fix(ci): close catalog gate holes on README project tree
The catalog gate validated only the first README project-tree block and
had no skills/commands counterpart to the agents pattern, so:

- README.md project tree (skills) and (commands) were never checked.
- A stale count in a second tree block was invisible because the agents
  pattern used String.match with a non-global regex, which reads only the
  first occurrence.

Both are now fail-closed. parseReadmeExpectations walks every tree block
for all three categories via matchAll, reports the offending line number
in the source label, and throws when an entry is missing entirely rather
than skipping it. syncEnglishReadme uses replaceAllOrThrow so --write
repairs every block instead of only the first; replaceOrThrow could not
be reused because it replaces only the first match and its regex.test()
probe is unsafe once the pattern carries the g flag.

README.md:847 documented 67 agents against an actual 68 and was never
checked, so it was corrected.

Fixtures in tests/ci/catalog.test.js and tests/ci/validators.test.js now
emit the skills and commands tree lines the gate requires, and both gain
regression coverage that fails against the previous parser (5 new tests).
2026-10-05 19:20:13 +03:00
Affaan Mustafa c05b2d6614 chore: retire the Everything Claude Code name, ECC only (#3330)
* chore: retire the Everything Claude Code name, ECC only

Replace the expanded product name and the everything-claude-code slug
with ECC across READMEs, translated docs, harness folders, skills,
commands, scripts and examples. Repo URLs now point at affaan-m/ECC.

Rename repo-internal artifacts to ecc forms (ecc-conventions skill,
ecc-guardrails, ecc-research-playbook, ecc-team-config, ecc-instincts
with ecc-* ids) and update .claude/ecc-tools.json.

Legacy install ids, plugin dirs, package names and MCP prefixes stay
where existing installs resolve against them. The codex global-state
check and harness-audit repo detection accept the new name first and
the legacy one as a fallback. The Discord bot prefers ~/GitHub/ECC and
falls back to the nested legacy checkout path.

Refresh the skill-triggers registryDigest for the changed skill text.

* fix(ecc-tools): drop managed paths to the removed Claude repo skill

.claude/skills/<repo-skill>/SKILL.md was deleted in #2770 but stayed listed in
ecc-tools.json and the team config. Remove those entries and point the Claude
Code adapter at the existing .agents/skills/ecc-conventions/SKILL.md.
2026-10-01 17:50:41 -05:00
haelyra 5e170e4886 fix(bengali): preserve decimal tokens 2026-10-01 12:04:10 -04:00
haelyra 85b4e4eea3 test: make Bengali syntax check byte exact 2026-09-30 17:23:37 -04:00
haelyra c965a61da5 Merge remote-tracking branch 'refs/remotes/pr/2655' into maint/stewardship-batch-2026-09-30
# Conflicts:
#	.claude-plugin/marketplace.json
#	.claude-plugin/plugin.json
#	AGENTS.md
#	README.md
#	README.zh-CN.md
#	docs/de-DE/README.md
#	docs/es/README.md
#	docs/ja-JP/README.md
#	docs/ko-KR/README.md
#	docs/pt-BR/README.md
#	docs/ru/README.md
#	docs/th/README.md
#	docs/tr/AGENTS.md
#	docs/tr/README.md
#	docs/uk-UA/README.md
#	docs/ur/README.md
#	docs/vi-VN/README.md
#	docs/zh-CN/AGENTS.md
#	docs/zh-CN/README.md
#	docs/zh-TW/README.md
#	scripts/lib/install-manifests.js
2026-09-30 13:20:41 -04:00
haelyra 97d3c73257 Merge branch 'main' into feat/bengali-language-support 2026-09-29 14:58:53 -04:00
affaan-m e7d69ac9ee Merge reviewed PR2879 missing-declaration regression correction
Source-PR: https://github.com/affaan-m/ECC/pull/2879
Review-Manifest-SHA256: d561b12170431bc2f5ec9baa80548a656fca9e55b4bb6b11bd756be4e6cab199
2026-09-28 05:13:01 -04:00
affaan-m de5119dcb6 fix(locale): reject missing canonical agent declarations
Preserve contributor history while applying the exact reviewed current-main repair.

Source-PR: https://github.com/affaan-m/ECC/pull/2879
Source-Parent: cc9914ce77
Review-Manifest-SHA256: d561b12170431bc2f5ec9baa80548a656fca9e55b4bb6b11bd756be4e6cab199
2026-09-28 05:11:01 -04:00
affaan-m 6c4e682c61 Merge exact reviewed PR3195 follow-up
Source-PR: https://github.com/affaan-m/ECC/pull/3195
Source-Head: 5dc3f96743
Review-Manifest-SHA256: ac156e1ed28f771f5ddb00913804dbdc79d96c13dc2090bc86f10e0fec7f5636
2026-09-28 04:07:07 -04:00
affaan-m 5dc3f96743 test(release): fail when the asynchronous check queue cannot complete
Preserve contributor history while applying the exact reviewed current-main repair.

Source-PR: https://github.com/affaan-m/ECC/pull/3195
Source-Parent: f36b5d1fda
Review-Manifest-SHA256: ac156e1ed28f771f5ddb00913804dbdc79d96c13dc2090bc86f10e0fec7f5636
2026-09-28 03:59:37 -04:00
affaan-m a7a1d8c2d8 Merge reviewed locale metadata alignment with canonical GAN capabilities
Source-PR: https://github.com/affaan-m/ECC/pull/2879
Source-Head: cc9914ce77
Composition: match the already reviewed canonical resize/key permissions in Japanese and Chinese metadata.
2026-09-28 03:55:49 -04:00
affaan-m cc9914ce77 Merge main and align translated agent metadata
Preserve translated prose and the contributor regression suite while matching
canonical models and tools, including current GAN evaluator capabilities.
2026-09-28 03:18:19 -04:00
affaan-m f1a98498cd Merge reviewed PR #3195 CI and security follow-up 2026-09-28 00:58:04 -04:00
affaan-m f36b5d1fda fix(release): bind privileged checkout to verified event commit
Preserve contributor history and current-main behavior while resolving the exact reviewed follow-up.

Source-PR: https://github.com/affaan-m/ECC/pull/3195
Source-Parent: ffb69744b0
Review-Manifest-SHA256: f732b9a4ceb5adced2990690c3857227088bbcccbb5114fcaaa581ecf16eb13f
2026-09-28 00:54:51 -04:00
affaan-m 6fcdd7ab87 Merge release-gate diagnostic correction from PR #3195
Source-PR: https://github.com/affaan-m/ECC/pull/3195
Source-Head: ffb69744b0
2026-09-27 23:48:05 -04:00
affaan-m ffb69744b0 fix(release): report pending gate reasons on bounded timeout
Retain the last gate diagnosis through deadline and attempt exhaustion, preserve unrelated failures, and use immutable hostile-response fixtures.

Source-PR: https://github.com/affaan-m/ECC/pull/3195
Reviewed-Manifest-SHA256: d480e46e86a19ea13ff0072612abf61d3a716a5ce05d6ac4232d5eb5edfbcd39
2026-09-27 23:46:15 -04:00
affaan-m b7cc7e3920 Merge reviewed contributor PR #3195 into backlog batch
Source-PR: https://github.com/affaan-m/ECC/pull/3195
Source-Head: 7c9c44736b

Local integration checkpoint; aggregate review and hosted acceptance pending.
2026-09-27 23:36:52 -04:00
affaan-m 7c9c44736b fix(release): bind trusted checks and signed tag identity on current main 2026-09-27 22:48:51 -04:00
affaan-m f8c604d37e Merge current main into PR #3060, preserving reviewed contribution 2026-09-27 20:24:52 -04:00