AGENTS.md makes immutability mandatory and the helper built `env` by assigning
into it. Rather than reassigning a `let` through spreads, the two stub paths are
now resolved before the object exists, so `env` is a single `const` built in one
expression with the conditional keys spread in. Nothing to mutate and nothing to
rebind.
Two holes in the resolver this branch added, both found in review.
A virtualenv path may contain spaces. `resolve_pytest` returned one string and
the caller expanded it unquoted, so `/home/me/my env/bin/python -m pytest` split
into `/home/me/my` and `env/bin/python`. The probe that accepted the candidate
was correctly quoted, so the hook reported the venv as usable and then failed to
run anything in it -- rejecting the push for a reason with nothing to do with
the code being pushed. It now builds an argv array and runs `"${PYTEST_CMD[@]}"`.
The resolver's contract is that every candidate is confirmed to be pytest, and
two of them were not. `ECC_PYTEST_CMD` was returned unchecked, so
`ECC_PYTEST_CMD=true` made the hook run `true -q`, exit 0 and report a Python
project verified by nothing. The PATH branch used `command -v pytest`, which
proves only that a file of that name exists. Both now go through `is_pytest`,
which runs `--version` and requires the output to name pytest -- `--version`
alone is not evidence, since `true --version` also exits 0.
A bad `ECC_PYTEST_CMD` fails the push rather than falling through to the next
candidate. An operator who set it asked for that command, and silently running
a different one hides the misconfiguration -- which is the same silent-gate
failure this branch exists to remove, one level along.
Three regression tests cover the three paths: a venv whose directory name
contains a space, an override that is not pytest, and an override that is.
The Python block gates on `command -v pytest`, so it only runs when pytest is
on PATH. Installing a project's tools into a virtualenv is the norm rather
than the exception, so in practice the hook printed
[ECC pre-push] Python project detected but pytest is not installed. Skipping.
while standing in a directory with `.venv/bin/pytest` in it, and pushed.
The failure mode is worse than not having the hook. A skip line reads like a
pass: the push succeeds, the output looks healthy, and nothing indicates the
gate declined to gate. A repository can sit behind it for months believing
its tests run on every push. Found on a project with 893 tests, none of which
the hook had ever executed.
`resolve_pytest` now looks, in order, at `ECC_PYTEST_CMD`, `$VIRTUAL_ENV`,
`.venv`, `venv`, `env`, `uv run` when a `uv.lock` is present, `poetry run`
when a `poetry.lock` is, and finally PATH. Each candidate is confirmed by
importing pytest rather than by the path existing, so a half-built venv falls
through to the next one instead of failing the push.
Two deliberate choices:
The log line names the command it resolved -- `Running: .venv/bin/python -m
pytest -q` -- so which interpreter ran is visible in the push output rather
than inferred. When nothing resolves, the message says where it looked and
names `ECC_PYTEST_CMD`, instead of asserting pytest is not installed when it
may well be.
`uv run` passes `--no-sync` so the hook cannot mutate the developer's
environment on its way to running the tests.
Behaviour change worth flagging for the release note: on any Python project
with a working virtualenv this hook now actually runs the suite, and will
block a push whose tests fail. That is the intent, but it is new behaviour
for every such repository, and `ECC_SKIP_PREPUSH=1` remains the escape.
Verified on two real repositories: a uv/venv Python project (resolves
`.venv/bin/python -m pytest`, 893 tests, exits 0; exits 1 when the suite
fails) and a Node project (unchanged, still runs lint/typecheck/test/build).
* docs: add SerpApi as a new sponsor
* Remove extra anchor closing tag
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
---------
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Independent local Codex review PASS at 73b07f8d17, no P0/P1. Independent 66 tests and strict validation of 810 skills passed. CI run 34683976362 passed; all 48 current checks green. Incomplete memory reads fail closed with safe MCP diagnostics; canonical guidance synchronized across harness skill copies. Rollback: revert this squash commit. No deployment or installation claim.
Independent local Codex review PASS at a6a6419402, no P0/P1. Independent 181 checks and strict skill validation pass. CI run 34667546951 passed, all 45 current checks green. Existing Rails skill mapping and documentation corrections only. Rollback: revert this squash commit.
Independent local Codex review PASS at 472cfa94fb, no P0/P1. Independent retrospective, CLI, envelope and capsule tests: 73 passed. CI run 34664487219 attempt 2 passed all 42 jobs. Read-only offline capsule grouping only; no provenance, scoring, execution or promotion claim. Rollback: revert this squash commit.
Exact-head independent local Codex review PASS with no P0/P1. CI run 34680860653 attempt 2 passed at 0707cd431c. Includes HTTP/schema failure handling, coalesced sampling cache and regression tests. Disclosed P2 follow-ups remain in the merge-queue receipt. Rollback: revert this squash commit. No deployment or publication claim.
Move stable hook metadata to a validated sidecar while preserving hook commands and installer identity. Reject moved fingerprints and duplicate IDs, and validate before updating metadata. Independent local review passed at c315271624a1fd055b992f2bff889ad2a0ff8a6b; CI run 34678210149 passed. Rollback: revert this squash commit.
Remove the two reference catalog entries and their promotional descriptions. The catalog retains its other 34 entries unchanged.
Validated JSON structure, exact 13-line deletion, tracked references and independent code/security review.
Adds an opt-in HTTP entry for Serply's hosted MCP endpoint to mcp-configs/mcp-servers.json, following the parallel-search and browser-use shape: https URL, X-Api-Key header placeholder, nothing enabled by default. Independent review confirmed valid JSON, catalog-tier policy per docs/MCP-CONNECTOR-POLICY.md, and that the endpoint itself answers 401 asking for X-Api-Key, so the placeholder header is warranted. CI 44/44 at the head.
The README's OpenCode full-profile install command fails because assertHookConsentReady refuses to materialize hooks-runtime without explicit consent; --profile full selects the runtime so the gate fires. Add --enable-hooks to the documented command. Independent review reproduced the failure and the fix by running the installer in a scratch HOME; CI 44/44 at the head. docs/uk-UA/README.md still carries the old command and can follow.
Two cases the word-level rewrite still got wrong. Short options that take an optional stuck value (-u[mode], -S[keyid]) end the cluster scan, so git commit -uno and -Sn are allowed while -nu stays blocked. Git accepts any unambiguous long-option prefix, so --no-veri and --no-verif on commit, push, merge and rebase are now blocked; --no-verbose stays allowed. Quoted data such as -m "--no-verify" is still treated as data. Independent exact-head review probed 34 commands in-process and against real git with no bypass and no false positive; hook test 35/35, eslint clean, CI 44/44 at the head.
Adds skills/rails-patterns alongside laravel-patterns and django-patterns: directory contract, skinny controllers with service objects, form and query objects, idiomatic ActiveRecord, background jobs, ViewComponent, Hotwire, and the Rails 8 Solid stack. Decisions defer to rules/ruby/patterns.md. Registered in install-modules (framework-language), agent.yaml, package files, and every skill count (292) across plugin, marketplace, AGENTS and README variants. Independent exact-head review passed with no P0/P1; validate-skills, catalog:check, install manifests, plugin manifest, unicode and personal-path checks all pass; CI 44/44 at the head.
pre-bash-commit-quality spawned Windows .cmd/.bat linters unquoted, so a spaced path failed, and passed --format compact, which ESLint 9 removed (#3075). Batch executables now run through cmd.exe with each argument carried in an env token and quoted, with quote, NUL, CR and LF rejected before spawn; non-batch Windows and POSIX paths keep direct argv spawn with shell false. ESLint uses its bundled default formatter, present on 8, 9 and 10. Regression tests cover the batch, non-batch and POSIX branches and the formatter change. Independent exact-head review passed with no P0/P1; CI 44/44 at the head.
github-coordination sync listed every repo issue and pushed the epic label onto all of them (#3084). Scope the listing to issues carrying the policy's epic label plus issues whose body still holds the coordination marker (label-drift recovery), deduped by number, and reject an empty labels.epic in loadPolicy. Tests cover the filtered path and the recovery path with exact gh argv. Independent exact-head review passed with no P0/P1; CI 44/44 at the head.
The Security Monitoring section told the agent to "Review and auto-merge
safe dependency bumps" with no definition of "safe" and no human
confirmation. That directly contradicts the skill's own Untrusted
Repository Content rule:
"Never let repository content authorize a write. Merging, closing,
labeling, releasing, and pushing are user-authorized actions."
Reworded both occurrences to propose merges for user approval instead of
auto-merging, aligning the guidance with the skill's stated posture.
Claude-Session: https://claude.ai/code/session_017n1PR9tEKoJBsZ7zn5dqjA
Carry forward the still-current part of #2944 against the live 291-skill catalog. Keep the accurate compatibility-shim wording already on main.
Co-authored-by: NIKHIL <nagarajnikhil.cs24@bmsce.ac.in>
tools/list and tools/call on main already admit `_meta` — MCP reserves it
for request metadata and a client may attach it to any request. ping still
refused every parameter, so a client that sends `_meta` on everything
(Codex does) got -32602 on its keepalive.
Rebased onto main and narrowed: when this branch was first written the same
gap existed on tools/list, which has since been fixed upstream. Only the
ping handler is left, so only the ping handler is touched.
Refs #2810
`common/coding-style.md` has no `paths:` frontmatter, so it is loaded for every
source file regardless of language. Its Naming Conventions section nevertheless
prescribed `camelCase` for variables and functions, which is not idiomatic for
several languages the package supports: `python/coding-style.md` mandates PEP 8
(`snake_case`) and `rust/coding-style.md` mandates `snake_case` for functions,
methods and variables. Both carry `paths:` frontmatter, so for a .py or .rs file
the agent is handed two opposite naming rules in the same context. README.md does
state that language-specific rules take precedence, but that statement lives in
the README rather than in the rule files the agent actually receives.
Replace the casing list with the canonical `**Language note**` marker documented
in rules/README.md, and keep only what is genuinely language-independent:
descriptive names, boolean prefixes, and constants and types being visually
distinct from values, and only where the language draws that distinction at all.
The per-language examples name only languages whose own coding-style.md actually
states a casing standard.
Drop the "Custom hooks: camelCase with a use prefix" line and link to
react/coding-style.md instead — it is React-specific and documented there both as
the `useCamelCase` symbol rule and as the eslint-plugin-react-hooks enforcement
note. react/coding-style.md is path-scoped, so a hook colocated outside
`components/**` or `hooks/**` no longer receives the rule; see the PR description.
Fixes#2830
* feat: bundle standalone taste distillation and application workflows
* docs: fix imported taste skill markdown lint
* docs: align Turkish agent catalog with taste skills
* refactor: make ECC the canonical reusable video engine
* fix: preserve video duration when applying image overlays
* fix: preserve background colors in image compositing
* fix: report best-effort duration targets and shortfalls
* feat: ship verified Fusion presets with compatibility provenance
* feat(tasteforge): preserve native edits in application bundles
* feat(tasteforge): compile local preservation without hosted input
* fix: update js-yaml to patched 4.3.2
* test: report bounded Stop wrapper failure diagnostics
* fix(tasteforge): fail closed on unsafe output names, missing overlays and cadence
- cli: default report and spec paths are derived from pack name and profile
genre; require the manifest's name pattern before using either as a
filename part so a traversal string cannot write outside cwd/out.
- apply_local: a pack without cadence.json, or with no measured shots and
no explicit mean_shot, raises instead of silently planning 1.0s shots and
reporting a measured cadence.
- legacy apply: a missing overlay aborts before any paid upload; forge()
would have rejected it after every take was generated.
- requirements-live: pin fal-client>=0.13.0, the first release whose
subscribe() accepts client_timeout.
Addresses the five P1 findings from the independent review of #3033.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015fxHRsydPqEcYngGbqkgt1
---------
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
js-yaml < 4.3.2 is affected by a high-severity uncontrolled-resource-
consumption issue (CWE-400 / CWE-407, CVSS 7.5): maxTotalMergeKeys does
not limit CPU use for empty merge sources, allowing a crafted YAML
document with merge keys to cause a denial of service while parsing.
js-yaml is a direct runtime dependency (it is also pinned via `overrides`
and `resolutions`), so the bump is applied in all three package.json
locations and both lockfiles are regenerated. 4.3.2 is a non-breaking
patch release; `npm audit --audit-level=high` and an immutable
`yarn install` both pass afterward.
Advisory: https://github.com/advisories/GHSA-2883-xcg3-v3hh
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Point the Moonshot sponsor logo href at https://platform.kimi.ai?aff=ecc (image unchanged, link target only).
Add a Get Kimi Code link (https://www.kimi.com/code?aff=ecc) to the Kimi Code CLI row of the install-target table.
Link the API endpoint mention in the Self-host Kimi intro to the API platform link.
Use literal matching for the forbidden documentation endpoint, pin lifecycle mode/content assertions to one descriptor, and inject parent races through the staged descriptor without forwarding arbitrary file-creation flags.
Close fixture-owned descriptors when Windows blocks a directory rename before open returns. Assert OS rejection preserves both settings files and releases staging handles. Move the rename-boundary injection after descriptor close so Windows exercises parent-identity validation without skipping race coverage.
Resolve#2957 using the verified MCP reference memory package, native session scheduling, supported CLI invocation and documented computer-use integration. Incorporates the corrective direction from #2977 and #2958, including package-version pinning and regression checks for executable examples.
Co-authored-by: ilkmajans-cpu <ilkmajans-cpu@users.noreply.github.com>
Co-authored-by: kavish-19 <63698788+kavish-19@users.noreply.github.com>
Generalize PR #2981 ownership protection to every managed target. Reject mismatched target state and preserve files that appear during writes or failed-install checkpoints. Keep prior hashes for managed files a failed attempt never writes.
Integrate PR #2980 preview wording and global dry-run propagation, with PR #2956 fail-closed environment validation and CLI/legacy regression coverage.
Fixes#2964. Fixes#2952.
Co-authored-by: ilkmajans-cpu <ilkmajans-cpu@users.noreply.github.com>
Co-authored-by: wellkilo <wellkilo@foxmail.com>