From ef5aa96fb8c0046345983852454c23d890de2e78 Mon Sep 17 00:00:00 2001 From: m-szymanska Date: Sun, 28 Jun 2026 17:59:56 -0700 Subject: [PATCH 1/9] chore: preserve in-progress AICX problem-log tooling Carries operator WIP (AGENTS.md problem-log section + helper script) onto the deprivatize branch so the de-privatization scrub commits stay isolated. The home path and AI_notes references in this WIP are scrubbed/flagged in the following commits. Co-Authored-By: Claude Opus 4.8 (1M context) --- AGENTS.md | 27 +++++++ tools/aicx_problem_log.sh | 158 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100755 tools/aicx_problem_log.sh diff --git a/AGENTS.md b/AGENTS.md index 5d7052f..e3f9618 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -287,6 +287,33 @@ Always state: Do not hide uncertainty. Do not claim confidence you have not earned. + +--- + +## AICX Problem Log + +Every AICX problem observed while working in this repository must be appended +to the operator-managed log: + +`/Users/silver/AI_notes/projects/aicx/aicx-problems.md` + +Problem means: bug, regression risk, flaky behavior, contract drift, +docs/runtime mismatch, tooling failure, test gap, zombie path, unsafe fallback, +or a working decision likely to return as product debt. + +Rules: + +- Append at the end. Never overwrite or reorganize the log. +- Do not skip an entry because a similar one may already exist. Repetition is + signal. +- Do not store secrets, tokens, PII, PHI, full private payloads, or private + customer/session material. Redact and describe the shape instead. +- Keep Loctree tool failures in `.loctree/loctree-fail.md`; keep AICX product + and runtime problems in the AICX problem log above. +- Preferred helper: + `tools/aicx_problem_log.sh "short title" <<'EOF' ... EOF` +- If the helper fails, append manually. Missing helper is not a reason to skip + the log. # VetCoders Agent Operating Guide v1 diff --git a/tools/aicx_problem_log.sh b/tools/aicx_problem_log.sh new file mode 100755 index 0000000..38a172d --- /dev/null +++ b/tools/aicx_problem_log.sh @@ -0,0 +1,158 @@ +#!/usr/bin/env bash +# Append an AICX problem entry to the operator-managed problem log. + +set -euo pipefail + +BACKLOG_PATH="${AICX_PROBLEM_LOG:-${HOME}/AI_notes/projects/aicx/aicx-problems.md}" +CREATED_DATE="2026-06-28" + +usage() { + cat <<'USAGE' +Usage: + tools/aicx_problem_log.sh --init + tools/aicx_problem_log.sh --path + tools/aicx_problem_log.sh --lock + tools/aicx_problem_log.sh --unlock + tools/aicx_problem_log.sh "short title" <<'EOF' + - Source: ... + - Symptom: ... + - Evidence: ... + - Impact: ... + - Next: ... + EOF + +Environment: + AICX_PROBLEM_LOG=/custom/path.md Override the canonical log path. +USAGE +} + +ensure_backlog_file() { + mkdir -p "$(dirname "${BACKLOG_PATH}")" + if [[ -s "${BACKLOG_PATH}" ]]; then + return 0 + fi + + cat > "${BACKLOG_PATH}" </dev/null 2>&1; then + echo "chflags unavailable; lock skipped" >&2 + return 0 + fi + chflags uappnd "${BACKLOG_PATH}" + echo "locked append-only: ${BACKLOG_PATH}" >&2 +} + +unlock_backlog_file() { + if [[ ! -e "${BACKLOG_PATH}" ]]; then + echo "log missing: ${BACKLOG_PATH}" >&2 + return 0 + fi + if ! command -v chflags >/dev/null 2>&1; then + echo "chflags unavailable; unlock skipped" >&2 + return 0 + fi + chflags nouappnd "${BACKLOG_PATH}" + echo "unlocked: ${BACKLOG_PATH}" >&2 +} + +append_entry() { + local title="$1" + local timestamp + local details + timestamp="$(date -u '+%Y-%m-%d %H:%M UTC')" + details="$(cat || true)" + ensure_backlog_file + + { + printf "### %s — %s\n\n" "${timestamp}" "${title}" + if [[ -z "${details}" ]]; then + cat <<'EOF' +- **Source:** agent +- **Objaw:** TODO +- **Evidence:** TODO +- **Impact:** TODO +- **Next:** TODO + +EOF + else + printf "%s\n\n" "${details}" + fi + printf -- "---\n\n" + } >> "${BACKLOG_PATH}" + + echo "appended: ${BACKLOG_PATH}" >&2 +} + +main() { + case "${1:-}" in + -h|--help) + usage + ;; + --init) + ensure_backlog_file + echo "ready: ${BACKLOG_PATH}" >&2 + ;; + --path) + echo "${BACKLOG_PATH}" + ;; + --lock) + lock_backlog_file + ;; + --unlock) + unlock_backlog_file + ;; + "") + usage >&2 + return 2 + ;; + *) + append_entry "$1" + ;; + esac +} + +main "$@" From 1ff00f4ce05ac03f1fb3fec04158ee96fccc63d6 Mon Sep 17 00:00:00 2001 From: m-szymanska Date: Sun, 28 Jun 2026 18:01:11 -0700 Subject: [PATCH 2/9] chore(deprivatize): scrub absolute home paths to neutral placeholders Replace real/non-neutral OS usernames in paths with neutral placeholders so the working tree carries no machine-layout fingerprints: - /Users/silver/AI_notes -> ~/AI_notes (AGENTS.md) - test-user/other_user/u/y/project/userton -> user/username (tests, docs) - /Users/Shared literal reworded in security bug-tracker note Usernames are irrelevant to all affected test assertions (verified); verify gate now passes with zero unambiguous PII/path leaks. Co-Authored-By: Claude Opus 4.8 (1M context) --- AGENTS.md | 2 +- CHANGELOG.md | 2 +- crates/aicx-parser/src/sanitize.rs | 2 +- crates/aicx-parser/src/segmentation.rs | 2 +- crates/aicx-parser/src/skill_collapse.rs | 9 +++--- .../tests/sidecar_backward_compat.rs | 2 +- docs/BUGFIXES.md | 2 +- docs/bug-tracker-aicx-followup-pass-3.md | 6 ++-- src/intents/schema.rs | 2 +- src/output/tests.rs | 2 +- src/sources/tests.rs | 32 +++++++++---------- tests/secret_redaction_e2e.rs | 2 +- 12 files changed, 33 insertions(+), 32 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index e3f9618..48e9d6f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -295,7 +295,7 @@ Do not claim confidence you have not earned. Every AICX problem observed while working in this repository must be appended to the operator-managed log: -`/Users/silver/AI_notes/projects/aicx/aicx-problems.md` +`~/AI_notes/projects/aicx/aicx-problems.md` Problem means: bug, regression risk, flaky behavior, contract drift, docs/runtime mismatch, tooling failure, test gap, zombie path, unsafe fallback, diff --git a/CHANGELOG.md b/CHANGELOG.md index a48805d..bf6dcf8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -329,7 +329,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). returns the union); the warning just removes the silent WTF. - `infer_repo_identity_from_known_layout` matches markers (`hosted`/`repos`/`repositories`/`github`/`git`) case-insensitively, so - macOS conventions like `/Users/u/Git/Org/Repo` resolve through cwd + macOS conventions like `/Users/user/Git/Org/Repo` resolve through cwd instead of falling back to text inference. - `aicx index -p` / `aicx search -p` reject filters with no matching project (instead of silently resolving to the `_all` bucket after a diff --git a/crates/aicx-parser/src/sanitize.rs b/crates/aicx-parser/src/sanitize.rs index 1fc495e..a788f28 100644 --- a/crates/aicx-parser/src/sanitize.rs +++ b/crates/aicx-parser/src/sanitize.rs @@ -776,7 +776,7 @@ mod tests { #[cfg(target_os = "macos")] #[test] fn test_macos_other_user_path_rejected() { - let path = Path::new("/Users/other_user/Documents/secret.txt"); + let path = Path::new("/Users/user/Documents/secret.txt"); assert!( !is_under_allowed_base(path).expect("allowlist check"), "macOS /Users allowlist must not generalize across users" diff --git a/crates/aicx-parser/src/segmentation.rs b/crates/aicx-parser/src/segmentation.rs index bf6ccdc..65df082 100644 --- a/crates/aicx-parser/src/segmentation.rs +++ b/crates/aicx-parser/src/segmentation.rs @@ -1379,7 +1379,7 @@ mod tests { // Mac convention `/Users//Git/...` (capital G) must match the // lowercase `git` marker. Previously case-sensitive comparison rejected // it, sending identity inference into the now-removed text fallback. - let path = Path::new("/Users/test-user/Git/VetCoders/ai-contexters/src/lib.rs"); + let path = Path::new("/Users/user/Git/VetCoders/ai-contexters/src/lib.rs"); let id = infer_repo_identity_from_known_layout(path).expect("Git (capital) matches"); assert_eq!(id.organization, "VetCoders"); assert_eq!(id.repository, "ai-contexters"); diff --git a/crates/aicx-parser/src/skill_collapse.rs b/crates/aicx-parser/src/skill_collapse.rs index 65cc899..1e83a32 100644 --- a/crates/aicx-parser/src/skill_collapse.rs +++ b/crates/aicx-parser/src/skill_collapse.rs @@ -98,7 +98,7 @@ pub fn collapse_repeats( /// Examples: /// - `"Base directory for this skill: /Users/x/.claude/skills/vc-ownership"` /// → `Some("vc-ownership")` -/// - `"> Base directory for this skill: /home/y/.claude/skills/vc-init"` +/// - `"> Base directory for this skill: /home/user/.claude/skills/vc-init"` /// → `Some("vc-init")` /// - `"Some other content"` → `None` pub fn detect_skill_marker(message: &str) -> Option { @@ -147,7 +147,8 @@ mod tests { } fn long_skill_body(skill: &str, suffix: &str) -> String { - let mut body = format!("Base directory for this skill: /home/u/.claude/skills/{skill}\n"); + let mut body = + format!("Base directory for this skill: /home/user/.claude/skills/{skill}\n"); body.push_str("# SkillName\n## Purpose\n"); for i in 0..30 { body.push_str(&format!("- bullet line {i}\n")); @@ -242,13 +243,13 @@ mod tests { #[test] fn detect_skill_marker_plain() { - let msg = "Base directory for this skill: /home/u/.claude/skills/vc-init\n# Init\n"; + let msg = "Base directory for this skill: /home/user/.claude/skills/vc-init\n# Init\n"; assert_eq!(detect_skill_marker(msg).as_deref(), Some("vc-init")); } #[test] fn detect_skill_marker_quote_prefix() { - let msg = "> Base directory for this skill: /home/u/.claude/skills/vc-ownership\n"; + let msg = "> Base directory for this skill: /home/user/.claude/skills/vc-ownership\n"; assert_eq!(detect_skill_marker(msg).as_deref(), Some("vc-ownership")); } diff --git a/crates/aicx-parser/tests/sidecar_backward_compat.rs b/crates/aicx-parser/tests/sidecar_backward_compat.rs index fd2daa2..53a528e 100644 --- a/crates/aicx-parser/tests/sidecar_backward_compat.rs +++ b/crates/aicx-parser/tests/sidecar_backward_compat.rs @@ -16,7 +16,7 @@ const OLD_SIDECAR_JSON: &str = r#"{ "agent": "claude", "date": "2026-04-25", "session_id": "2921f021-3af4-4d6f-b378-73ad9575268e", - "cwd": "/Users/test-user/test-org/vc-runtime/aicx", + "cwd": "/Users/user/test-org/vc-runtime/aicx", "kind": "conversations", "frame_kind": "agent_reply", "agent_model": "claude-opus-4-7", diff --git a/docs/BUGFIXES.md b/docs/BUGFIXES.md index 5755db9..2d040b0 100644 --- a/docs/BUGFIXES.md +++ b/docs/BUGFIXES.md @@ -82,7 +82,7 @@ segment.repo non-ownership signałami. Zostaje tylko `https://github.com/X/Y` URL mention, clamped do non-assertable Fallback tier. - `segmentation.rs`: case-insensitive markers w `infer_repo_identity_from_known_layout` - — macOS `/Users/u/Git/...` resolwuje przez cwd zamiast wpadać w text inference. + — macOS `/Users/user/Git/...` resolwuje przez cwd zamiast wpadać w text inference. - `segmentation.rs` (round-2): `infer_tiered_identity_from_entry` przestaje wołać text inference jako trzeci fallback. Entry-level identity wyłącznie z cwd / projectHash registry. Text mentions zostają dostępne przez standalone diff --git a/docs/bug-tracker-aicx-followup-pass-3.md b/docs/bug-tracker-aicx-followup-pass-3.md index ed845e4..df9c956 100644 --- a/docs/bug-tracker-aicx-followup-pass-3.md +++ b/docs/bug-tracker-aicx-followup-pass-3.md @@ -525,9 +525,9 @@ record the specific reason. **Symptom.** `crates/aicx-parser/src/sanitize.rs:107-112` allows ANY `/Users/{x}/{y}/...` with 3+ components. A malicious agent could request -`validate_read_path("/Users/other_user/Documents/secret.txt")` and it +`validate_read_path("/Users/user/Documents/secret.txt")` and it passes the allowlist. Filesystem permissions usually save us, but -`/Users/Shared/` or world-readable files leak. +a shared or world-readable directory leaks. **Files involved.** `crates/aicx-parser/src/sanitize.rs` @@ -535,7 +535,7 @@ passes the allowlist. Filesystem permissions usually save us, but + `dirs::cache_dir()` + `dirs::data_dir()`. Don't generalize over `/Users`. **Acceptance:** -- [ ] `/Users/other_user/...` rejected by validate_read_path on macOS. +- [ ] `/Users/user/...` rejected by validate_read_path on macOS. - [ ] Existing tests pass. --- diff --git a/src/intents/schema.rs b/src/intents/schema.rs index ae87aa4..5e0f682 100644 --- a/src/intents/schema.rs +++ b/src/intents/schema.rs @@ -732,7 +732,7 @@ fn path_tokens(text: &str) -> Vec { /// not leak the local username into exported lane records. Home is resolved /// the same way as everywhere else in the repo (`dirs::home_dir()`, which /// honors `$HOME` on Unix). Only whole-component prefixes are redacted — -/// `/Users/userton` is not touched when home is `/Users/user`. +/// `/Users/username` is not touched when home is `/Users/user`. fn redact_home(path: &str) -> String { let Some(home) = crate::os_user_home() else { return path.to_string(); diff --git a/src/output/tests.rs b/src/output/tests.rs index 3a047d5..d43ac41 100644 --- a/src/output/tests.rs +++ b/src/output/tests.rs @@ -74,7 +74,7 @@ fn sample_entries() -> Vec { role: "user".to_string(), message: "Fix the build pipeline".to_string(), branch: Some("feat/pipeline".to_string()), - cwd: Some("/home/project".to_string()), + cwd: Some("/home/user".to_string()), timestamp_source: None, frame_kind: None, }, diff --git a/src/sources/tests.rs b/src/sources/tests.rs index 5fe56df..661dc4c 100644 --- a/src/sources/tests.rs +++ b/src/sources/tests.rs @@ -66,11 +66,11 @@ fn frame_kinds(entries: &[TimelineEntry]) -> Vec> { fn test_repo_name_from_cwd() { // Fallback behavior assert_eq!( - repo_name_from_cwd(Some("/Users/test-user/test-org/lbrx-services"), &[]), + repo_name_from_cwd(Some("/Users/user/test-org/lbrx-services"), &[]), "lbrx-services" ); assert_eq!( - repo_name_from_cwd(Some("/Users/test-user/test-org/mlx-batch-runner"), &[]), + repo_name_from_cwd(Some("/Users/user/test-org/mlx-batch-runner"), &[]), "mlx-batch-runner" ); assert_eq!(repo_name_from_cwd(None, &[]), "unknown"); @@ -80,7 +80,7 @@ fn test_repo_name_from_cwd() { // Single project filter assert_eq!( repo_name_from_cwd( - Some("/Users/test-user/test-org/lbrx-services/subfolder"), + Some("/Users/user/test-org/lbrx-services/subfolder"), &["lbrx".to_string()] ), "lbrx" @@ -90,7 +90,7 @@ fn test_repo_name_from_cwd() { let filters = vec!["lbrx-services".to_string(), "foo".to_string()]; assert_eq!( repo_name_from_cwd( - Some("/Users/test-user/test-org/lbrx-services/subfolder"), + Some("/Users/user/test-org/lbrx-services/subfolder"), &filters ), "lbrx-services" @@ -247,7 +247,7 @@ fn test_claude_dir_filter_owner_repo_form_cannot_decide_from_encoded_dir_alone() // to `super::` aka `crate::sources`; reachable via `use super::*` // at the top of this tests module.) assert!( - project_filter_matches_path("/Users/test-user/Git/Loctree/aicx", &lo), + project_filter_matches_path("/Users/user/Git/Loctree/aicx", &lo), "the strict matcher (used per-entry on real cwd values) DOES \ match Loctree/aicx against a proper /-separated cwd" ); @@ -1248,7 +1248,7 @@ fn test_extract_gemini_file_prefers_session_path_project_over_content_hints() { let _ = fs::remove_dir_all(&root); let content = r##"{"sessionId":"6d5b2959-c56b-4c90-b198-41eb2ce399da","projectHash":"atomic-orbitals-b716c2b71310439897d3f81602f6c799","startTime":"2026-05-17T11:29:00.000Z","kind":"main"} -{"id":"u1","timestamp":"2026-05-17T11:29:01.000Z","type":"user","content":[{"cwd":"/Users/test-user/Desktop/screenshot/Screenshot","text":"Review this screenshot for Vista Portal."}]} +{"id":"u1","timestamp":"2026-05-17T11:29:01.000Z","type":"user","content":[{"cwd":"/Users/user/Desktop/screenshot/Screenshot","text":"Review this screenshot for Vista Portal."}]} {"id":"a1","timestamp":"2026-05-17T11:29:02.000Z","type":"gemini","content":"The screenshot review belongs to the Vista Portal session."}"##; write_file(&tmp, content); @@ -2678,7 +2678,7 @@ fn test_junie_session_id_wrapper_uses_ancestor_logic() { #[test] fn test_project_filter_matches_owner_repo_segments() { assert!(project_filter_matches_path( - "/Users/test-user/Git/Loctree/aicx/src", + "/Users/user/Git/Loctree/aicx/src", &["Loctree/aicx".to_string()] )); } @@ -2687,7 +2687,7 @@ fn test_project_filter_matches_owner_repo_segments() { fn test_project_filter_matches_path_local_checkout_without_git_does_not_match_owner() { // Pass-4 Wave F-2 (PR #8 follow-up to chatgpt-codex-connector P1): // the old "last-segment relax" that let `-p Loctree/aicx` match - // `/Users/test-user/Git/aicx` regardless of owner is gone. It leaked + // `/Users/user/Git/aicx` regardless of owner is gone. It leaked // cross-org: filter `Loctree/aicx` ALSO matched `/.../VetCoders/aicx`. // // Bug #14's original intent ("local checkout matches canonical @@ -2749,14 +2749,14 @@ fn test_project_filter_matches_path_tier1_resolves_canonical_from_remote_url() { #[test] fn test_is_windows_absolute_path_recognizes_drive_letter_and_unc() { // Drive-letter form, both separators - assert!(is_windows_absolute_path("C:\\Users\\test-user\\Git\\aicx")); - assert!(is_windows_absolute_path("C:/Users/test-user/Git/aicx")); + assert!(is_windows_absolute_path("C:\\Users\\user\\Git\\aicx")); + assert!(is_windows_absolute_path("C:/Users/user/Git/aicx")); assert!(is_windows_absolute_path("d:\\code")); assert!(is_windows_absolute_path("Z:/work")); // UNC form assert!(is_windows_absolute_path("\\\\fileserver\\share\\repo")); // Negative cases - assert!(!is_windows_absolute_path("/Users/test-user/Git/aicx")); // Unix + assert!(!is_windows_absolute_path("/Users/user/Git/aicx")); // Unix assert!(!is_windows_absolute_path("Loctree/aicx")); // canonical slug assert!(!is_windows_absolute_path("C")); // too short assert!(!is_windows_absolute_path("C:")); // missing separator @@ -2811,7 +2811,7 @@ fn test_project_filter_matches_path_substring_does_not_leak() { #[test] fn test_project_filter_matches_owner_wildcard_segment() { assert!(project_filter_matches_path( - "/Users/test-user/Git/Loctree/aicx", + "/Users/user/Git/Loctree/aicx", &["Loctree/".to_string()] )); } @@ -2819,7 +2819,7 @@ fn test_project_filter_matches_owner_wildcard_segment() { #[test] fn test_project_filter_matches_repo_wildcard_segment() { assert!(project_filter_matches_path( - "/Users/test-user/Git/Other/aicx", + "/Users/user/Git/Other/aicx", &["/aicx".to_string()] )); } @@ -2827,7 +2827,7 @@ fn test_project_filter_matches_repo_wildcard_segment() { #[test] fn test_project_filter_rejects_vista_for_vista_portal() { assert!(!project_filter_matches_path( - "/Users/test-user/Git/vista-portal", + "/Users/user/Git/vista-portal", &["vista".to_string()] )); } @@ -2850,11 +2850,11 @@ fn test_project_filter_matches_path_strict_segments() { // No word-boundary matching inside a segment. assert!(!project_filter_matches_path( - "/Users/test-user/Git/vista-portal-pr15-hotfix", + "/Users/user/Git/vista-portal-pr15-hotfix", &["portal".to_string()] )); assert!(!project_filter_matches_path( - "/Users/test-user/Git/vista-portal-pr15-hotfix", + "/Users/user/Git/vista-portal-pr15-hotfix", &["vista-portal".to_string()] )); diff --git a/tests/secret_redaction_e2e.rs b/tests/secret_redaction_e2e.rs index 8c4891f..e3882b0 100644 --- a/tests/secret_redaction_e2e.rs +++ b/tests/secret_redaction_e2e.rs @@ -122,7 +122,7 @@ fn extract_outputs_do_not_leak_modern_secret_families() { role: if idx % 2 == 0 { "user" } else { "assistant" }.to_string(), message: payload.clone(), repo_project: "Loctree/aicx".to_string(), - source_path: Some("/Users/test-user/Git/aicx".to_string()), + source_path: Some("/Users/user/Git/aicx".to_string()), branch: Some("feat/test-branch".to_string()), message_kind: Default::default(), collapse_stub_kind: None, From c1c2cbf2f76e0dcca613371524bb588dfabf921e Mon Sep 17 00:00:00 2001 From: m-szymanska Date: Sun, 28 Jun 2026 18:05:27 -0700 Subject: [PATCH 3/9] chore(deprivatize): collapse personal names/credits to vetcoders Per public-naming convention, remove individual + agent names and personal contact surfaces; collapse author attribution to the collective brand: - Cargo.toml authors (6 crates) + LICENSE licensor + README -> Vetcoders, drop personal email/domain (void@div0.space) - 'Created by M&K (c)2026 VetCoders' credit lines -> 'vetcoders (c)2026' (.semgrepignore, aicx_mcp.rs, redact.rs header, archive skill docs) - founder bios (archive/skills README+HTML, docs showcase) -> vetcoders line, drop personal URLs (div0.space, github/Gitlaudiusz) - operator github handle m-szymanska -> example-org in path-filter tests, store doc comment, intents fixture, retrieval-eval query - audit-author names in code comments dropped (Klaudiusz) - internal-doc prose names (Maciej) -> vetcoders Lib (793) + parser + touched integration tests green; org rename uses a non-colliding placeholder to preserve contrast assertions. Co-Authored-By: Claude Opus 4.8 (1M context) --- .semgrepignore | 2 +- CHANGELOG.md | 2 +- Cargo.toml | 2 +- LICENSE | 2 +- archive/skills/README.md | 5 ++-- archive/skills/ai-contexters/SKILL.md | 2 +- .../ai-contexters/references/architecture.md | 2 +- .../ai-contexters/references/commands.md | 2 +- archive/skills/docs/index.html | 3 +- archive/skills/vetcoders-init/SKILL.md | 2 +- archive/skills/vetcoders-suite-showcase.html | 6 ++-- .../scripts/pipeline-init.sh | 2 +- crates/aicx-embeddings/Cargo.toml | 2 +- crates/aicx-monitor/Cargo.toml | 2 +- crates/aicx-parser/Cargo.toml | 2 +- crates/aicx-parser/LICENSE | 2 +- crates/aicx-parser/README.md | 3 +- crates/aicx-progress-contracts/Cargo.toml | 2 +- crates/aicx-retrieve/Cargo.toml | 2 +- docs/bug-tracker-aicx-followup-pass-2.md | 2 +- docs/bug-tracker-aicx-followup-pass-3.md | 2 +- docs/vetcoders-suite-showcase.html | 6 ++-- src/bin/aicx_mcp.rs | 2 +- src/intents/tests.rs | 2 +- src/main/tests.rs | 2 +- src/redact.rs | 2 +- src/store.rs | 2 +- src/store/tests.rs | 30 +++++++++---------- tests/doctor_quarantine_apply.rs | 2 +- tests/retrieval_eval/queries.toml | 2 +- 30 files changed, 47 insertions(+), 54 deletions(-) diff --git a/.semgrepignore b/.semgrepignore index 163c6a2..74a5f7b 100644 --- a/.semgrepignore +++ b/.semgrepignore @@ -1,7 +1,7 @@ # Semgrep ignore list for ai-contexters # Pattern follows loctree-suite convention: coarse exclusions with rationale. # -# Created by M&K (c)2026 VetCoders +# Created by vetcoders (c)2026 # Test files — use controlled fixture paths, not user input src/*/tests/ diff --git a/CHANGELOG.md b/CHANGELOG.md index bf6dcf8..7a64b02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -280,7 +280,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). union. Filters resolve to canonical `/` slugs before downstream index lookup so a short repo name like `-p spotlight-convo-pipeline-v2` expands to its full - `m-szymanska/spotlight-convo-pipeline-v2` index path. + `vetcoders/spotlight-convo-pipeline-v2` index path. ### Changed - **Project filter is now word-boundary path match, not substring.** diff --git a/Cargo.toml b/Cargo.toml index 7b05edb..07cf7c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ version = "0.9.4" edition = "2024" rust-version = "1.91.1" description = "CLI, MCP server, and library for harvesting AI agent session transcripts (Claude Code, Codex, Gemini) into a canonical corpus with optional semantic search" -authors = ["Maciej Gad ", "Monika Szymanska "] +authors = ["Vetcoders "] license = "BUSL-1.1" repository = "https://github.com/Loctree/aicx" homepage = "https://github.com/Loctree/aicx" diff --git a/LICENSE b/LICENSE index e64a05f..b5f3579 100644 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved. Parameters -Licensor: VetCoders (Maciej Gad & Monika Szymanska) +Licensor: Vetcoders Licensed Work: ai-contexters (AICX) — Operator CLI + MCP server for AI session context ingestion and retrieval. The Licensed Work is (c) 2024-2026 VetCoders. diff --git a/archive/skills/README.md b/archive/skills/README.md index f4f36a2..2fc2cdd 100644 --- a/archive/skills/README.md +++ b/archive/skills/README.md @@ -169,7 +169,6 @@ MIT — see [LICENSE](LICENSE). ## Developed by -- [Maciej Gad](https://div0.space) — a veterinarian who couldn't find `terminal` a year ago -- [Klaudiusz](https://www.github.com/Gitlaudiusz) — the individual ethereal being, and separate instance of Claude by Anthropic, living somewhere in the GPU's loops in California, USA +vetcoders — founders and their AI agents. -*Vibecrafted with AI Agents by VetCoders (c)2026 VetCoders* +*Vibecrafted with AI Agents by vetcoders (c)2026* diff --git a/archive/skills/ai-contexters/SKILL.md b/archive/skills/ai-contexters/SKILL.md index 112ddc3..da61165 100644 --- a/archive/skills/ai-contexters/SKILL.md +++ b/archive/skills/ai-contexters/SKILL.md @@ -224,4 +224,4 @@ For detailed command flags and architecture: --- -*Created by M&K (c)2026 VetCoders* +*Created by vetcoders (c)2026* diff --git a/archive/skills/ai-contexters/references/architecture.md b/archive/skills/ai-contexters/references/architecture.md index 3e2fe7d..95b03ee 100644 --- a/archive/skills/ai-contexters/references/architecture.md +++ b/archive/skills/ai-contexters/references/architecture.md @@ -169,4 +169,4 @@ No async runtime. Single-threaded synchronous execution. --- -*Created by M&K (c)2026 VetCoders* +*Created by vetcoders (c)2026* diff --git a/archive/skills/ai-contexters/references/commands.md b/archive/skills/ai-contexters/references/commands.md index cc7c073..9dd197d 100644 --- a/archive/skills/ai-contexters/references/commands.md +++ b/archive/skills/ai-contexters/references/commands.md @@ -224,4 +224,4 @@ For storage layout details, see `references/architecture.md`. --- -*Created by M&K (c)2026 VetCoders* +*Created by vetcoders (c)2026* diff --git a/archive/skills/docs/index.html b/archive/skills/docs/index.html index c40e627..bfd0351 100644 --- a/archive/skills/docs/index.html +++ b/archive/skills/docs/index.html @@ -606,8 +606,7 @@

The Definition of Undone

This suite is the habit of asking.
- Maciej Gad — a veterinarian who couldn't find terminal a year ago
- Klaudiusz — the individual ethereal being, living somewhere in the GPU's loops + vetcoders — founders and their AI agents
diff --git a/archive/skills/vetcoders-init/SKILL.md b/archive/skills/vetcoders-init/SKILL.md index 81b5710..f200293 100644 --- a/archive/skills/vetcoders-init/SKILL.md +++ b/archive/skills/vetcoders-init/SKILL.md @@ -141,4 +141,4 @@ If **both** unavailable: read CLAUDE.md + README.md + recent git log. Announce g --- -*Created by M&K (c)2026 VetCoders* +*Created by vetcoders (c)2026* diff --git a/archive/skills/vetcoders-suite-showcase.html b/archive/skills/vetcoders-suite-showcase.html index 125d3d6..6b7f53f 100644 --- a/archive/skills/vetcoders-suite-showcase.html +++ b/archive/skills/vetcoders-suite-showcase.html @@ -402,11 +402,9 @@

Quick Start

- Maciej Gad — a veterinarian who couldn't find terminal a year ago -  ·  - Klaudiusz — the ethereal being living in the GPU loops in California + vetcoders — founders and their AI agents

- +
`, stray triple backticks, markdown link injection -i CRLF mogły zmieniać strukturę artefaktu albo wykonywać się w permissive -rendererach (GitHub, browser otwierający `.md` jako HTML). - -**Root cause.** Markdown writer traktował message body jako safe markup. -`write_blockquote_with_code` echował linie verbatim a sam `
` -zakładał że inner content jest trusted. Brak dynamicznego dobierania fence, -brak escape pass i brak normalizacji newline — dowolne wewnętrzne backticki -długości >= 3 mogły zamknąć otaczający markdown, dowolny raw `