Commit Graph
206 Commits
Author SHA1 Message Date
dajiaohuang 22ec4a6ac7 test(ci): make catalog validator fixtures explicit 2026-09-10 19:53:09 +08:00
Affaan Mustafa d2b352c202 feat: ship verified Fusion presets with compatibility provenance (#3010) 2026-09-10 14:13:06 +03:00
dajiaohuang 04b44ec574 fix(ci): isolate catalog validator fixtures 2026-09-10 19:00:21 +08:00
dajiaohuang 214c6a1e6f fix(ci): validate cross-harness catalog counts 2026-09-10 18:48:12 +08:00
haelyra 165074ecf4 test: fix Windows ownership paths and failure annotations 2026-09-07 18:09:46 -04:00
haelyra 14e731c6d5 fix: close release review gaps and expose failing CI suites 2026-09-07 17:57:26 -04:00
wellkilo f59cfd57c2 fix(install): harden Claude settings lifecycle 2026-09-07 01:57:04 +08:00
wellkilo 569e5a36bb feat(install): register manual Claude hooks 2026-09-07 00:53:13 +08:00
haelyra b74e0add1d test: synchronize dependency update coverage 2026-09-03 15:00:31 -04:00
haelyra 23fb7e0c79 ci: avoid redundant Python dependency floors 2026-09-03 14:59:01 -04:00
Affaan Mustafa a104765bf2 docs(ito-compute): document ito accept and ito_accept MCP workflow (#2893)
* docs(ito-compute): document ito accept and ito_accept MCP workflow

Updates the canonical ECC skill to cover the new quote acceptance path:
- CLI: ecc ito accept <ticket-id>
- MCP: ito_accept tool
- Explicit buyer-authority guard before accepting
- Clear statement that accept routes to desk, does not purchase

* test(ito-compute): assert the four-tool MCP boundary including ito_accept

The exact-boundary test pinned the three-tool description. Runtime
ito-compute-cli now exposes ito_accept (Ito-Markets/ito-cloud-runtime#1453),
so the template boundary assertion moves to four tools.

* docs(ito-compute): drop the firm-quote gate from the accept workflow

Desk quotes are indicative_paper in production (a firm quote requires the
separate human-held signing path and cannot reach the client), so gating
accept on 'a firm quote is ready' described an unfireable condition. Align
with the runtime contract: accept routes the current desk quote to human
review and the result carries quote_class (ito-cloud-runtime#1453).
2026-08-31 15:16:16 -04:00
haelyra 005eff40fd fix(install): harden universal setup release path (#2888)
* fix(install): harden universal setup release path

* docs(adal): use ecc-universal doctor command
2026-08-30 18:54:00 -04:00
haelyra d26b9cccee test(ci): confirm hooks in packed target smoke 2026-08-30 15:19:01 -04:00
haelyra caee3ee455 test(ci): opt in to hooks in packed lifecycle smoke 2026-08-30 15:13:07 -04:00
haelyra 1bdda4bdac fix: close validator and path edge cases 2026-08-29 15:36:59 -04:00
haelyra 30c41a9bde fix: close truth and portability review gaps 2026-08-29 14:55:14 -04:00
Juan Pablo 974ccc749f fix(ci): validate SKILL.md frontmatter under docs/{locale}/skills/ mirrors
Extends scripts/ci/validate-skills.js to also scan docs/{locale}/skills/
translated mirrors, not just curated skills/. Adds detection for the
YAML defect classes from #2630 without a parser dependency: unquoted
values containing ": " (glued next key / dropped quoting), values
starting with the reserved '@'/'`' indicators, and missing frontmatter
blocks entirely (required only for docs mirrors; curated skills/ keeps
its existing tolerant behavior).
2026-08-29 14:55:13 -04:00
Souptik Chakraborty 51dc76ee07 test(gateguard): reject Reflect access on process.env
Greptile flagged that the env-access guard in
gateguard-env-documented.test.js could be bypassed via reflective reads
of process.env (Reflect.get/has/set/deleteProperty/defineProperty/
getOwnPropertyDescriptor/ownKeys), since none of the existing
UNSUPPORTED_ACCESS patterns matched that form.

Add a rule that rejects Reflect.get/has/set/deleteProperty/
defineProperty/getOwnPropertyDescriptor/ownKeys(process.env, ...) and
three self-check fixture cases (Reflect.get, Reflect.has,
Reflect.ownKeys) so the guard is pinned against silently missing them
again.

Negative control: commenting out only the new rule reproduces exactly
the reported gap (the 3 new fixture cases fail with "access guard
missed: Reflect.get, Reflect.has, Reflect.ownKeys"); restoring it goes
back to 10/10.
2026-08-29 14:55:13 -04:00
Souptik Chakraborty f1521c8937 test(gateguard): read env knobs from code and pin the access convention
The documentation surface test scanned the hook's raw source with two
regexes. That had two holes, both confirmed against the shipped parser:

- a GATEGUARD_* name appearing only in a comment or a string was counted
  as a real read, and
- destructured, aliased and computed reads were invisible, so an
  undocumented knob added in one of those forms would pass silently.

Blank comments, string literals, template-literal text and regex literals
before scanning, so only real code contributes. Blanking preserves length,
so `process.env[...]` keys are located in the blanked code and read back
from the raw source at the same offset.

Rather than chase every possible access form with regexes, the supported
forms are now enforced: destructuring, aliasing, spreading, enumerating
and computed keys fail the guard with instructions to either keep the
convention or extend the parser. Six self-checks cover the blanker and
the guard, including a regex literal containing a slash.

Refs #2573
2026-08-29 14:55:13 -04:00
Souptik Chakraborty c4253805b5 docs(gateguard): address review - split full-disable, pin glob semantics
CodeRabbit review on #2611, all four findings:

- GATEGUARD_DISABLED sat in a table introduced as 'these do not disable the gate'. Moved to its own full-disable section with ECC_GATEGUARD, and corrected the accepted values against ECC_DISABLE_VALUES (0/false/off/disabled/disable - the earlier draft would have implied 'no' works, which it does not).

- Documented that a leading **/ compiles to .*/ and so needs a preceding separator: verified by reproducing the hook's glob->regex translation, **/tests/** matches /repo/tests/foo.js but not a bare relative tests/foo.js. Docs now say so and the example carries both forms. Matcher behaviour deliberately unchanged - widening it is a behaviour change, not a docs fix.

- Reverse-drift check now compares documented names against the parsed env reads instead of hookSource.includes(), so a name surviving only in a comment or error string no longer satisfies it.

- readGateguardEnvNames builds one Set from collected matches instead of mutating via Set#add, per the repo's no-in-place-mutation guideline.
2026-08-29 14:55:13 -04:00
Souptik Chakraborty 4377ea1753 docs(gateguard): document the graduated gate controls
GateGuard reads five GATEGUARD_* environment variables that were absent
from skills/gateguard/SKILL.md, so the only discoverable escape hatch was
ECC_GATEGUARD=off - disabling the load-bearing destructive-Bash gate
along with the noisy ones (#2573).

Documented, with defaults and exact accepted values read from the hook:

- GATEGUARD_BASH_ROUTINE_DISABLED (was undocumented everywhere)
- GATEGUARD_EXEMPT_GLOBS (previously only in a 2.1.0 release note)
- GATEGUARD_BASH_EXTRA_DESTRUCTIVE (was undocumented)
- GATEGUARD_DISABLED (was undocumented)
- GATEGUARD_STATE_DIR (was undocumented; named in a runtime warning)
- GATEGUARD_FACT_FORCE_FULL_DENIALS (already documented; folded into the
  same table for one lookup point)

Adds tests/ci/gateguard-env-documented.test.js, which asserts every
GATEGUARD_* variable the hook reads appears in the skill doc, and that the
doc names no variable the hook has stopped reading. That surface test is
what found the three knobs beyond the two the issue reported.

Docs and test only; no hook behaviour changes.

Refs #2573
2026-08-29 14:55:13 -04:00
haelyra b7d6c61b1e Merge remote-tracking branch 'origin/main' into maint/pr-2870-current 2026-08-28 16:03:10 -04:00
haelyra 204cc2d2a3 fix(release): stage ECC 2.2 launch safely 2026-08-25 17:19:45 -04:00
haelyra d6d0c4e696 test(nasiko): isolate malformed lock fixture 2026-08-25 13:52:19 -04:00
haelyra e10c4bb5bf fix(nasiko): use descriptor lock identity 2026-08-25 13:49:26 -04:00
haelyra 307bbd53a6 fix(nasiko): harden lifecycle recovery 2026-08-25 13:34:58 -04:00
Nguyen Thanh Dat 787154775e test(locale-agents): set process.exitCode so the summary always flushes
Review feedback on #2879. stdout is async when it is a pipe, which is exactly
how tests/run-all.js runs these files, and process.exit() does not wait for
pending writes — so exiting that way can drop the Passed:/Failed: lines the
aggregator totals, defeating the point of printing them. The sibling
tests/ci/ito-*-skill.test.js files already use process.exitCode.

Still exits 1 on drift and 0 when clean.
2026-08-25 18:35:26 +07:00
Nguyen Thanh Dat 5f79c39687 test(locale-agents): derive the file lists instead of accumulating them
Review feedback on #2879, citing rules/common/coding-style.md ("Immutability
(CRITICAL): ALWAYS create new objects, NEVER mutate existing ones"). Build one
list of locale entries, then derive the matched and orphaned sets from it with
filter/map, and build the canonical Map the same way.

Behaviour is unchanged and both mutations still fail: reintroducing the drift in
one locale file gives `Passed: 4, Failed: 3`, an orphan gives `Passed: 6,
Failed: 1`, both exit 1.
2026-08-25 18:34:12 +07:00
Nguyen Thanh Dat 4f18d1eb87 test(locale-agents): fail on a locale doc whose agent no longer exists
Review feedback on #2879: a locale file with no counterpart in `agents/` was
skipped, so every other case here silently passed over it. Retiring an agent
would leave its seven translations behind with nothing to compare against and
nothing to report it.

Collect those files while building the list and assert the collection is empty.
Zero today across 199 locale docs, so this changes no current result; planting
one orphan takes the file to `Passed: 6, Failed: 1` and exit 1.
2026-08-25 18:04:38 +07:00
Nguyen Thanh Dat 3afd97b4aa fix(docs): stop translated agent docs from contradicting the shipped agent
`scripts/ci/validate-agents.js` reads only `agents/`, so the translated copies
under `docs/<locale>/agents/` were never validated against the agent they
describe — and drifted.

Two kinds of drift, both machine-checkable and both wrong in the same
direction (the translations were made from an older revision and never
re-synced):

- **Model tier, 39 files.** Every one names a costlier tier than ships:
  haiku -> sonnet, sonnet -> opus. `security-reviewer` reads `opus` in ja-JP
  and zh-TW; it ships `sonnet`.
- **Tool set, 15 files.** `security-reviewer` and `database-reviewer` list
  `Write` and `Edit` in **all seven locales** — both agents ship read-only
  (`Read, Grep, Glob, Bash`). `seo-specialist` in zh-CN adds a `Bash` the
  canonical agent does not have. Documenting a reviewer as able to write is
  the kind of inaccuracy someone auditing what these agents can touch would
  act on.

Sync `model` and the `tools` set to canonical, preserving each locale's
existing list style so the diff is only the values that were wrong. The
`["a", "b"]` vs `a, b` formatting difference is left alone: it is consistent
per locale and carries no meaning.

Add `tests/ci/locale-agent-frontmatter.test.js` so this cannot drift back.
`tools` is compared as a set, not a string, so the style difference stays
legal; prose is not compared at all. The last case pins the specific failure:
a canonical read-only agent may never be documented with Write or Edit.

`.kiro/agents/` is deliberately excluded — it uses a different schema
(`allowedTools: [read, shell]`, no `model`), not a translation of this one.
2026-08-25 17:39:43 +07:00
Suliman Abdulrazzaq ef68f816d1 fix(gan): grant evaluator Playwright tools 2026-08-24 22:26:25 -03:00
haelyra 01779a4a2b test(release): cover final review blockers 2026-08-24 21:14:29 -04:00
haelyra 7d9f70c501 test(release): enforce release-note filename convention 2026-08-24 21:08:51 -04:00
haelyra e3a1ac6f3f fix(opencode): migrate legacy managed home installs 2026-08-24 20:59:57 -04:00
haelyra 47d629633b test(release): require packed uninstall skill cleanup 2026-08-24 20:56:27 -04:00
haelyra a504b19411 test(release): derive reviewed notes from tag 2026-08-24 20:34:26 -04:00
haelyra 8b5ef235ff test(release): accept install command result shape 2026-08-24 20:23:33 -04:00
haelyra 2c5a91a1d6 fix(release): make ECC 2.2 ready to publish 2026-08-24 20:15:12 -04:00
haelyra 6e66dfbae8 test(release): add ECC 2.2 readiness regressions 2026-08-24 20:08:41 -04:00
Affaan Mustafa b86138ae7b test(skills): align TasteForge final contract 2026-08-19 22:30:38 +00:00
Affaan Mustafa 71e3622640 fix(skills): harden TasteForge multimodal contract 2026-08-19 21:47:31 +00:00
Affaan Mustafa 348cd34a2b docs(skills): define TasteForge multimodal contract 2026-08-19 20:45:27 +00:00
affaan 9c450046be feat(skills): add tasteforge-video skill for repeatable taste-driven video work
Curated skill delegating to the canonical tasteforge package in
Ito-Markets/ito-video: taste interviews, style-pack validation, offline
distillation with measured grounding, deterministic cadence application to
local footage, EDL/FCPXML export, and generated-media provenance audits.
Provider (Fal) generation requires explicit separately authorized execution
and fails closed in ECC; local references never mean a saved provider
workflow. Registered in the opt-in media-generation install module, npm
files, and catalog counts via scripts/ci/catalog.js. Contract tests cover
frontmatter/triggers, the fail-closed boundary, manifest and npm-packed
discoverability (real tarball check opt-in via ECC_TEST_NPM_PACK=1).
2026-08-18 12:04:33 +00:00
Affaan Mustafa 06c5e118c4 test(release): verify packed Ito distribution (#2803) 2026-08-16 18:23:27 -04:00
Affaan Mustafa f34e4319b1 test: fix Nasiko Windows status expectation 2026-08-16 01:52:20 -04:00
Affaan Mustafa 28a8fda568 fix: close Nasiko filesystem race windows 2026-08-15 21:47:57 -04:00
Affaan Mustafa 9ba25b9360 fix: harden Nasiko artifact lifecycle 2026-08-15 02:22:29 -04:00
Affaan Mustafa f9801fb16b test: define Nasiko control-plane integration contract 2026-08-15 01:54:27 -04:00
haelyra 0a7d2787c4 fix(install): arm rollback before legacy sync 2026-08-13 18:30:39 -04:00
haelyra bab38ae91b fix(security): close installer filesystem races
Use no-follow file descriptors for legacy Codex snapshots, verification, restoration, and marker cleanup. Quarantine candidate removals and verify inode identity before deletion.

Carry the lifecycle runner as a verified artifact so privileged release workflows never dynamically check out and execute an output-selected revision.
2026-08-13 16:59:06 -04:00