Commit Graph
428 Commits
Author SHA1 Message Date
haelyra a3e9ddfde7 feat(gateguard): integrate evidence-aware first-touch questions 2026-10-10 17:46:23 -04:00
haelyra 9d09febe5d fix(skills): scope host compatibility to target projections 2026-10-10 17:44:28 -04:00
haelyraandalizahidraja eb7ffd8d64 feat(agents): integrate isolated Pi conversion foundation from PR 3022
Carry the canonical IR, Pi emitter and source-schema doctor from https://github.com/affaan-m/ECC/pull/3022. Cursor and OpenCode emitters remain with the open source PR pending capability fixes.

Co-authored-by: alizahidraja <alizahidrajaa@gmail.com>
2026-10-10 17:43:18 -04:00
haelyra 58fc8f25a5 feat(qoder): integrate native plugin and SessionStart projection 2026-10-10 17:40:46 -04:00
haelyra 07c18210eb fix(qwen): adapt managed agents before ownership receipts 2026-10-10 17:38:07 -04:00
haelyra b79346d16b feat(frontend): integrate rendered evidence contract from PR 2814 2026-10-10 17:35:32 -04:00
Matt Van Horn 5ec23e8e3d fix: reconcile skill-host-compat with current main
Drop the duplicate ECC_PREPUSH_RUN_CHECKS key now that main sets it,
refresh the skill-triggers registry digest, classify skill-host-compat
for pi/core, and bump the Turkish AGENTS.md counts the catalog sync
does not cover.
2026-10-10 07:33:04 -07:00
Matt Van Horn e128f4398b Merge branch 'main' into cursor/skill-host-compat-ci-10d0 2026-10-10 07:09:43 -07:00
calm 2d9e6977dc feat: add native Qoder plugin support 2026-10-10 20:11:00 +08:00
montjeffrey 92947a68df Merge upstream/main into feat/gateguard-fewer-round-trips
Resolve six conflicts:
- hooks/hooks.metadata.json: keep this branch's gateguard description and
  fingerprint, add upstream's hookify-runtime entries.
- package.json: keep both gateguard-report.js and github-coordination.js.
- scripts/hooks/gateguard-fact-force.js, tests/hooks/gateguard-fact-force.test.js,
  skills/gateguard/SKILL.md: upstream added a simpler session denial cap; this
  branch already has the fuller one (cap threaded through
  markCheckedAndCountDenial, malformed-value warning, miss and target notes),
  so keep it. Upstream's taskset and su wrapper handling, fail-closed
  recursion limit and soft-hyphen sanitising merged cleanly and their tests pass.
- manifests/context-packs/skill-triggers@1.json: take upstream's file and
  recompute registryDigest for the merged registry.
2026-10-09 20:38:25 -04: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 ba0520340f fix: reconcile reviewed sources and generated integration surfaces 2026-10-09 17:27:37 -04:00
haelyra b6e2cfe5e4 merge: preserve tested installer extraction 3187 and Copilot ownership fixture 2026-10-09 17:05:03 -04:00
haelyra a5432e84f7 merge: preserve tested stocktake discovery and save source 3220 2026-10-09 17:03:20 -04:00
haelyra 67c89375c3 merge: preserve serialized store source 3252 with portable cache fixtures 2026-10-09 16:28:34 -04:00
haelyra cc288b6e28 merge: reconcile tested OpenCode home carry-forward with Copilot transforms 2026-10-09 16:20:04 -04:00
haelyra 7265b989c4 merge: preserve tested bounded Hookify carry-forward candidate 3055 2026-10-09 16:17:57 -04:00
haelyra a1e0f46c7c merge: preserve tested PowerShell prerequisite source 3042 2026-10-09 16:15:41 -04:00
haelyra 34ba911ad3 merge: preserve tested Python audit source 3007 2026-10-09 16:11:22 -04:00
haelyra 899a12310e merge: preserve tested dashboard read-once source 3002 2026-10-09 16:11:12 -04:00
haelyra 83cd2ad91e merge: preserve tested commit-review source 2974 2026-10-09 16:10:04 -04:00
haelyra a6f6faed2a merge: preserve source 2983 with tested activity dashboard fixes 2026-10-09 16:09:59 -04:00
haelyra c4f419bea0 merge: refresh reviewed stewardship source 3280 on current main 2026-10-09 16:02:58 -04:00
wellkiloandhaelyra a50ee13cac feat: execute bounded local Hookify rules in lifecycle hooks
Carry forward PR #3055 at 92f53c4c onto ef648e01, preserving contributor attribution and current main. Focused maintainer fixes reuse shared input ceilings, preserve late root context through outer bootstrap, bound frontmatter before immutable parsing, and assert real oversized input in the limits workflow.
2026-10-09 15:59:20 -04:00
haelyra 846c450658 fix: keep activity dashboard executable and bound log reads 2026-10-09 15:57:34 -04:00
5e3863e512 perf: avoid duplicate skill file reads
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-10-09 15:50:20 -04:00
Yusuf Efeandhaelyra 0f34fdcc14 fix: resolve installed OpenCode skill paths consistently
Carry forward PR #3115 ef475c79 and 780dfb78 onto current main. Preserve the newer hook-consent transforms during install and repair. Main already includes the source import fix from #3167.
2026-10-09 15:40:12 -04:00
zakyirsyaad 93e6475420 fix(qwen): publish the adapter, handle CRLF, reject unknown flags
Three review findings, all verified before fixing.

1. Publish surface (blocking). package.json `files` lists
   scripts/gemini-adapt-agents.js but not this script, so the npm tarball
   omitted it and ecc-universal users hit MODULE_NOT_FOUND. Added to `files`
   and to the allowlist in tests/scripts/npm-publish-surface.test.js, which now
   passes 2/2.

2. CRLF agents were silently skipped. The frontmatter regex matched LF only, so
   a Windows-saved agent was reported as 'already compatible' while still
   carrying tools: Read, Bash and color: teal -- a success message with no
   adaptation. Normalize to LF, adapt, then restore the original ending style.
   Reproduced before and after: the same CRLF fixture went from 'Updated 0' with
   Read/teal intact to 'Updated 1' with read_file/cyan and CRLF preserved.

3. Unknown flags were discarded. Because the script rewrites files in place,
   `--dry-run` rewrote every installed agent and exited 0. parseArgs now throws
   on any unrecognized option before a directory is selected.

Tests: 12/12 (added CRLF preservation and no-mutation-on-unknown-flag),
gemini-adapt-agents 4/4 unaffected, npm-publish-surface 2/2. Re-run against all
68 canonical definitions: 68 updated, second run 0 updated, no Claude-shaped
frontmatter remaining, no spurious CRLF introduced.

Note: findings 2 and 3 apply equally to scripts/gemini-adapt-agents.js, which
has the same LF-only regex and the same flag filter. Left unchanged here to keep
this PR scoped to the Qwen adapter; worth a follow-up.
2026-10-09 13:46:34 +07:00
zakyirsyaad 7695b99348 fix(qwen): map WebSearch to web_search instead of dropping it
Review correction. The original version dropped WebSearch on the claim that Qwen
Code has no web search tool. That claim is wrong: Qwen Code exposes web_search as
a deferred tool, resolving through a DashScope search agent.

web_search is provider-dependent rather than universally present, but mapping is
still the better default than dropping. Where the provider supports it the agent
gains the capability; where it does not, Qwen Code ignores an unresolvable entry
in tools: without warning, so the outcome is the same as dropping. The reasoning
is recorded in a comment at the mapping so the choice is not silently reverted.

Across the 68 canonical definitions this changes two agents from losing a
declared capability to keeping it. Tests updated to assert the mapping; 10/10
pass and gemini-adapt-agents.test.js still passes 4/4.
2026-10-09 13:38:24 +07:00
zakyirsyaad 64eaa7d124 feat(qwen): add qwen-adapt-agents.js to normalize agent frontmatter
--target qwen installs all 68 agent definitions verbatim, so they carry Claude
Code tool names (Read, Write, Edit, Bash, Grep, Glob, WebSearch) and color: teal.
Qwen Code uses different tool ids, and its palette is red/blue/green/yellow/
purple/orange/pink/cyan/auto, so an unlisted value is dropped at load time with a
SUBAGENT_MANAGER warning.

ECC already solves this for Gemini via scripts/gemini-adapt-agents.js; this adds
the Qwen counterpart plus a test mirroring the Gemini one. The canonical agents/
directory is untouched -- each harness adapts its own installed copy.

Deliberate differences from the Gemini adapter, each a real Qwen behaviour:

  Edit              -> edit          (Gemini maps to replace)
  WebSearch         -> dropped       (Qwen has web_fetch only, no web search)
  mcp__server__tool -> unchanged     (Gemini lowercases to mcp_server_tool)
  color:            -> remapped      (Gemini removes it; teal becomes cyan)
  tools: output     -> comma scalar  (the form Qwen's own examples use)

model: is left alone, matching the Gemini adapter. 58 files say sonnet, 6 haiku,
4 opus and none are Qwen model ids, but Qwen logs no warning for them, so whether
they are ignored or resolved at dispatch time is unverified and changing 68 files
on an assumption seemed worse than flagging it as a follow-up.

Tested: 10/10 new cases pass and gemini-adapt-agents.test.js still passes 4/4.
Run against a copy of all 68 real definitions: 68 updated, 0 bodies changed,
0 invalid frontmatters, second run reports 0 updated. The result was installed
into ~/.qwen/agents and a headless Qwen session loaded all 68 with no errors and
no color warnings.
2026-10-09 12:55:36 +07:00
montjeffrey 6dbf6e6883 fix(gateguard): report fresh-process failures and fail the gate on them
The previous fix stopped a throwing hook from aborting the cold replay by
recording it as an allow, matching the warm path. But coldSummary only counted
disagreements, so a failure on a step the worker also allowed was no
disagreement and left no trace: the report showed no failure, a run with no
measured step reported a cold latency of 0 ms because percentile of an empty
list is 0, and the exit status passed. Trading a crash for a clean-looking
success hid exactly the failure the crash had exposed.

coldSummary now counts errors and samples, and reports no latency when nothing
was measured rather than a 0 that reads as a fast hook. The report prints "no
valid sample" in place of a latency and adds a line for steps that failed in a
fresh process, beside the existing disagreement line. The exit check moves into
gateFails, which fails on cold errors as it already did on warm errors and cold
disagreements, and is exported with coldSummary so both can be tested.

The render test builds its report from summarize([]), the real summary shape,
so it keeps working as metrics are added.
2026-10-04 22:34:30 -04:00
montjeffrey 3a4a574609 fix(gateguard): a throwing hook no longer ends the fresh-process replay
measureColdLatency ran each step in a fresh process through execFileSync,
inside try/finally with no catch. A hook that threw made the child exit
non-zero, execFileSync threw, and the error left measureColdLatency and then
evaluate, so neither the report nor the requested SARIF was written for a run
that had hit a single bad step.

The probe now catches a throwing require or run itself and records it the way
workerMain does: the raw payload stands in for the result, so the step reads as
an allow, and the error is kept. Matching the warm path matters because
coldSummary counts every cold decision that differs from the warm one as a
disagreement; any other choice would have reported disagreements that do not
exist. A child that dies without writing parseable output is caught outside the
probe and recorded the same way with no latency, and coldSummary leaves
unmeasured steps out of the percentiles while still counting them.

The new tests run a hook that always throws through both passes. They fail
against the previous code, 2 of 17, and pass against this one.
2026-10-04 22:22:50 -04:00
montjeffrey 56a516c2c5 Merge upstream/main into feat/gateguard-fewer-round-trips
Brings in the three commits main gained since the branch's merge base: the 2.2.3
release, retiring the Everything Claude Code name for ECC, and the ja-JP sponsor
update. 227 files arrive from main; two conflicted.

CHANGELOG.md: the branch had added an Unreleased section and main a released
2.2.3 section, both at the top. Both are kept verbatim with Unreleased above
2.2.3, since none of the branch's entries shipped in that release.

manifests/context-packs/skill-triggers@1.json: both sides had recomputed
registryDigest from the same earlier value to different results, and neither is
the digest of the merged tree. It is recomputed with loadContextRegistry over the
merged tree and only that field changes; triggers and triggersDigest are
untouched on both sides. validate-context-profiles passes.

All twelve CI validators pass. The full suite reports 44 failures in seven files;
43 of them fail by name and count identically on an unmodified upstream/main, and
the remaining one, plugin-hook-bootstrap, fails only inside run-all and passes in
isolation on both trees. The merge introduces no failing test that main does not
already have.
2026-10-04 20:47:30 -04:00
Yann Roberto 8be6a6f292 chore: sync state store branch with main 2026-10-05 00:15:25 +08:00
Yann Roberto 64746b0f66 chore: sync main and refresh stocktake registry digest 2026-10-05 00:11:29 +08:00
Affaan MustafaandGitHub 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
Jeffrey Montoya b821262997 feat(gateguard): compare hook latency with confidence intervals 2026-09-30 20:27:36 -04:00
Yann Roberto 3b7d15e7fa test(skill-stocktake): make traversal failure fixtures portable 2026-10-01 03:05:06 +08:00
Yann Roberto 9a1ccaaf25 fix(skill-stocktake): invalidate stale resumed evaluations 2026-10-01 03:01:10 +08:00
Yann Roberto bb39e5da7f fix(skill-stocktake): reconcile resumed live inventories safely 2026-10-01 02:16:54 +08:00
Yann Roberto 566eddec57 Merge remote-tracking branch 'origin/main' into fix/stocktake-live-inventory 2026-10-01 01:59:10 +08:00
Yann Roberto 1d20d449e6 fix(skill-stocktake): make batch workflow executable 2026-10-01 01:59:10 +08:00
haelyra 5ea629876e fix: reconcile stewardship batch on current main
Preserve the Bengali and MyBatis catalog additions, keep Laravel storage examples disk-consistent, isolate ECC 2 test configuration with private permissions, and verify every command-referenced runtime script is published.
2026-09-30 13:29:20 -04:00
Jeffrey Montoya d95aa3425e feat(gateguard): measure hook latency in fresh processes 2026-09-30 11:35:49 -04:00
Yi-111-a b09a26aaad fix(package): publish scripts/github-coordination.js for the /epic-* commands
`package.json` `files[]` enumerates each top-level `scripts/*.js` by hand, and
`scripts/github-coordination.js` was never added. npm therefore drops it from
the tarball while `scripts/lib/` still ships wholesale, so only the CLI entry
disappears.

All seven `/epic-*` commands ship in `commands/` and each instructs the agent
to run:

    node scripts/github-coordination.js <command> <issue> --repo <owner/repo>

so anyone who installs from npm -- including the documented
`npm i -g ecc-universal` path -- gets seven commands that cannot run:

    Error: Cannot find module '.../ecc-universal/scripts/github-coordination.js'

It works from a git clone, which is what masked it locally.

Add the missing `files[]` entry, the matching publish-surface allowlist entry in
`tests/scripts/npm-publish-surface.test.js` (CONTRIBUTING asks for both), and a
guard test that fails when any published command invokes a `scripts/*.js` that
the publish surface does not cover. The guard reproduces this exact bug: with
`package.json` reverted it fails naming only `github-coordination.js`.

Refs #3270
2026-09-30 21:09:38 +08:00
Jeffrey Montoya 3055eb3746 fix(gateguard): link SARIF findings to the evaluated corpus 2026-09-30 00:04:11 -04:00
Jeffrey Montoya 216fe89c36 feat(gateguard): write scenario gate results as SARIF 2026-09-29 22:20:41 -04:00
Jeffrey Montoya d591999ec0 feat(gateguard): add metrics event schema and report script 2026-09-29 21:50:19 -04:00
haelyraandGitHub abe2a310ca Merge branch 'main' into codex/add-ui-quality-gate 2026-09-29 14:58:53 -04:00