Skip to content

feat: team rules from a linked Altimate workspace in Codex sessions - #7

Open
saravmajestic wants to merge 4 commits into
mainfrom
feat/workspace-rules
Open

saravmajestic wants to merge 4 commits into
mainfrom
feat/workspace-rules

Conversation

@saravmajestic

@saravmajestic saravmajestic commented Oct 30, 2026 •

Copy link
Copy Markdown

Summary

Team rules from a linked Altimate workspace now apply in Codex sessions. This needs altimate-code with learn hook (AltimateAI/altimate-code#1626, which builds on the merged AltimateAI/altimate-code#1605). Merge and release after #1626 ships in an altimate-code release. With an older altimate-code the hooks do nothing: the session-start output is dropped unless it is the hook's JSON.

  • Workspace-rules hooks (SessionStart, UserPromptSubmit, Stop) call altimate-code learn hook <event> with the host's hook input on stdin.
    • Session start gives the agent the approved team rules, the number of proposals waiting, and the owner's reviews since the last session. The timeout is 15s, and the sync waits at most 3s.
    • Prompt submit records a correction with no model call.
    • Stop runs the post-turn check in the background: at most one drafting call per check round (a few per Stop at most), and none while 20 proposals are waiting. With no model configured for altimate-code, nothing is sent.
    • Prompt submit and Stop run detached, and only where .altimate-code/learn/workspace-rules/rules.json exists.
    • Every path exits 0.
  • /altimate-code:rules lists the stored proposals, the team rules and your proposals' status, asks with numbered choices in chat (Codex has no question tool), and answers through learn proposals reply.
  • Docs: README "Team rules", CHANGELOG, and PRIVACY.md. PRIVACY used to say the plugin only has a static hook and reads no files. It now lists what the hooks read (your messages and the transcript, locally), what goes to the LLM provider (a redacted digest, for drafting), and what reaches the workspace (only proposals you send, and usage counts). The privacy wording needs a review. The effective date is unchanged.
  • Version 1.2.0.

Test plan

  • bash tests/resolve-cli.sh (now covers commands/rules.md and learn calls)
  • bash tests/workspace-rules-hook.sh (new, stub CLI):
    • passes the input and host through;
    • prints only the CLI's JSON;
    • stays quiet when the CLI is missing, fails, or is too old;
    • per-turn events don't run without rules state, run in the background, and work from a subdirectory.
    • Checked against two broken versions of the script.
  • Live run in Codex against a linked workspace, after the altimate-code release

🤖 Generated with Claude Code

- Workspace-rules hooks (SessionStart, UserPromptSubmit, Stop) call `altimate-code learn hook <event>`.
  - Session start gives the agent the workspace's approved team rules, the number of proposals waiting, and new reviews.
  - Corrections are recorded with no model call.
  - The post-turn check runs in the background.
  - The hooks always exit 0, run the per-turn events only where workspace rules state exists, and print only the CLI's hook JSON.
- `/altimate-code:rules` answers stored proposals through `learn proposals reply`.
- Tests: a stub-CLI test for the hook script, and the resolver test covers the new command and `learn` calls.
- README, CHANGELOG and PRIVACY (what the hooks read and send), version 1.2.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment thread plugins/altimate-code/commands/rules.md Outdated
[ -n "$ALTIMATE_BIN" ] || { echo "altimate-code CLI not found (tried altimate-code, altimate)" >&2; exit 127; }
PROPOSAL_ID='<the proposal id>'
WORDING="$(cat <<'ALTIMATE_RULE'
<the new wording>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Heredoc body picks up the block's 3-space indent

The snippet sits inside a 3-space-indented list item, so this line renders as <the new wording>. cat <<'ALTIMATE_RULE' keeps leading whitespace, so WORDING starts with three spaces: the rule is stored with them and they count against the 140-character limit (possibly triggering invalid_text). Line 52 only says to move the closing ALTIMATE_RULE to column 0 — and if the agent misses that, the indented terminator is not recognised at all, so the heredoc runs to EOF, swallows the learn proposals reply call on line 50, and the script fails with a syntax error. Put the body at column 0 as well (or say "de-indent this whole block before running it"), and state it before the fence rather than after it.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845: flush left.

Comment thread plugins/altimate-code/commands/rules.md Outdated
```
Keep `--edit="$WORDING"` in one argument (a wording that starts with `-` is otherwise read as a flag), and start the closing `ALTIMATE_RULE` line at the beginning of its line. For any other choice, run the same command with that flag instead of `--edit="$WORDING"` (and without the here-doc).

The JSON answer is `{"ok": true, "message": …, "closed": …}` or `{"ok": false, "code": …, "error": …}`. Show the `message` or `error` to the user as it is. Then:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: Say which field each reply code lives in

Two shapes are given — {"ok": true, "message", "closed"} and {"ok": false, "code", "error"} — but the bullets below list closed: false, verification_flagged, invalid_text, refused, busy and not_open without saying whether they are code values or top-level keys. An agent that looks for verification_flagged as a top-level field will miss it and just print the error, instead of asking for the explicit confirmation that the follow-up --approve-anyway reply depends on. Spell it out: when ok is false, branch on code; when ok is true, check closed.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845: when ok is false, branch on code; when it is true, check closed.

Comment thread PRIVACY.md Outdated

- The plugin itself collects **no data**. It is a routing layer (a skill, a slash command, and a static session hook) that tells Codex when to delegate a task to the altimate-code CLI installed on your machine.
- The plugin itself collects **no data**. It is a routing layer (skills, slash commands, and session hooks) that tells Codex when to delegate a task to the altimate-code CLI installed on your machine.
- In a project linked to an Altimate workspace with learning on, its workspace-rules hooks hand your messages and the session transcript to the local altimate-code CLI, which keeps corrections on your machine and may send a digest to your LLM provider to word a proposed team rule. A proposal reaches your workspace only when you send or approve it. See [Workspace rules](#workspace-rules).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Effective date not revised for the new practices

This bullet and the new "Workspace rules" section add data flows (your messages, the session transcript, a redacted digest sent to your LLM provider, proposals and usage counts sent to the workspace), yet **Effective date:** July 18, 2026 stays unchanged. The policy's own "Changes to this policy" section says the effective date is revised "when our practices change", so the document now contradicts itself about which practices that date covers. Add a revision line (e.g. "Revised October 30, 2026") so users can see what changed and when.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845.

Comment thread plugins/altimate-code/README.md Outdated
- **Command** — `commands/review.md` — `/altimate-code:review [scope]` explicit-review slash command; scope can be empty (working tree), a commit SHA, a branch name, or a GitHub PR URL / number
- **Hook** — `hooks/hooks.json` + `hooks/altimate-code-session-start.sh` — SessionStart capability description (static text only; no side effects)
- **Command** — `commands/rules.md` — `/altimate-code:rules` to answer proposed team rules
- **Hooks** — `hooks/hooks.json` + `hooks/altimate-code-session-start.sh` — SessionStart capability description (static text only; no side effects); `hooks/altimate-code-workspace-rules.sh` — the [team rules](#team-rules) hooks (SessionStart, UserPromptSubmit, Stop), which call `altimate-code learn hook <event>` and never block or fail the session

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: "never block" is not true for session start

session-start is synchronous: hooks.json waits up to 15 s for altimate-code learn hook session-start before the session context is built (the script's own header calls it a "bounded sync"). Only user-prompt-submit and stop are detached. Say "the per-turn hooks never block; session start makes one bounded synchronous call", so a stalled session start from a slow or unreachable CLI is not a surprise.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845: the per-turn hooks never block; session start makes one bounded call (at most 15s).

Comment thread plugins/altimate-code/README.md Outdated
- **"Remember this as a team rule: …"** in a task handed to altimate-code is proposed the same way.
- **`/altimate-code:rules`** shows the proposals waiting for you, the team rules, and the status of the rules you proposed. For each proposal you choose: send it to the workspace owner's review (or approve it, if you are the owner), edit the wording, save it as a memory, or "Not a rule". Nothing reaches teammates until the owner approves it.

The same commands work in a terminal: `altimate-code learn proposals`, `altimate-code learn proposals reply <id> --send`. This needs an altimate-code release with workspace rules.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: altimate-code is not on PATH for curl installs

The Prerequisites section and the troubleshooting table both note that curl/PowerShell installs may expose only altimate. A user on that install gets command not found from altimate-code learn proposals. Use the same parenthetical as the rest of the README (altimate learn proposals on installs without altimate-code), or show the altimate form here.

Comment thread plugins/altimate-code/CHANGELOG.md Outdated
- Team rules from a linked Altimate workspace apply in Codex sessions. At session start the plugin gives Codex the workspace's approved rules for the repository, the number of proposed rules waiting for you, and the owner's reviews of your proposals since your last session.
- Corrections you make to Codex are recorded locally (UserPromptSubmit, no model call). After a turn, altimate-code checks them in the background (Stop) and keeps a proposed rule when you corrected the same topic in two sessions or corrected a team rule Codex was given.
- `/altimate-code:rules`: answer proposed rules (send for review, approve as owner, edit, save as memory, or "Not a rule"), and see the team rules and the review status of your proposals.
- The hooks run only in a linked project with learning on. They need an altimate-code release with `learn hook`; with an older one they do nothing.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: SessionStart is not gated on the linked project

"The hooks run only in a linked project with learning on" holds for the per-turn events, which gate on .altimate-code/learn/workspace-rules/rules.json. The session-start hook invokes altimate-code learn hook session-start in every project — it has to, in order to learn whether the project is linked — and the linked/learning gates are applied by the CLI, not before the call. Reword to match the code (PRIVACY.md already words this correctly).

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845.

esac
;;
user-prompt-submit|stop)
ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: The gate and the CLI invocation resolve different roots

The existence check uses git rev-parse --show-toplevel, but the CLI on line 40 is spawned with the current directory and no --dir. The two only agree if the CLI independently walks up from $PWD to the same root; if it does not, a session started in a subdirectory (or a dbt project nested inside a monorepo git root) either never fires the per-turn events or fires them somewhere without state. The new test's "works from a subdirectory" case passes only because the stub ignores its cwd. Pass --dir "$ROOT" (or cd "$ROOT" before the spawn) so the gate and the call agree, and have the stub assert the directory it ran in.

Comment thread tests/workspace-rules-hook.sh Outdated
[ "$(hook "$WORK/project" "$event" "$BIN:$SYS")" = "0|" ] || fail "$event without rules state did not exit quietly"
done
sleep 0.5
[ ! -s "$LOG" ] || fail "per-turn events ran the CLI without workspace rules state: $(cat "$LOG")"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: Fixed 0.5 s sleep makes the negative assertion racy

If the hook wrongly spawns the CLI without workspace-rules state, the stub may not have appended to $LOG within 0.5 s on a loaded machine, so this check passes anyway. Wait deterministically — e.g. have the stub touch a sentinel as its first action and poll for its absence over a longer bounded window, or reuse an await_log-style loop — instead of a single fixed sleep.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845: the stub records a sentinel as its first action, and the negative checks are made deterministic.

@kilo-code-bot

kilo-code-bot Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Code Review Summary

Status: 3 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 2
Issue Details (click to expand)

WARNING

File Line Issue
plugins/altimate-code/hooks/altimate-code-workspace-rules.sh 47 The link cache is read from ${XDG_STATE_HOME:-$HOME/.local/state}/altimate-code/, while the plugin's own troubleshooting table shows the CLI's global directory at ~/.local/share/altimate-code/, and macOS/Windows CLIs normally use the platform data dir. If the cache actually lives in a different root, session start silently runs nothing in every newly linked repository (the hook always exits 0), and the new test cannot catch it because it creates the cache at the path it sets itself.

SUGGESTION

File Line Issue
plugins/altimate-code/hooks/altimate-code-workspace-rules.sh 75 The per-turn gate only checks $STATE at the git toplevel, but a link may be for a folder inside the repository (a dbt project). If the CLI keeps workspace-rules state beside the linked folder, corrections are never recorded and the failure is silent; the stub test cannot catch it because it ignores cwd and only writes rules.json at the repo root. (Carried forward; the existing inline comment on this line still tracks it.)
tests/workspace-rules-hook.sh 155 The loop waits for more than one entry in $STARTED, but the next assertion requires exactly one, so it always burns two seconds on a correct run and cannot detect a stray call that arrives later. Replace it with the deterministic positive-call check that await_log already provides, or a bounded sentinel for stray calls.
Files Reviewed (10 files)
  • PRIVACY.md - 0 issues
  • README.md - 0 issues
  • SECURITY.md - 0 issues
  • plugins/altimate-code/CHANGELOG.md - 0 issues
  • plugins/altimate-code/README.md - 0 issues
  • plugins/altimate-code/commands/rules.md - 0 issues
  • plugins/altimate-code/hooks/altimate-code-workspace-rules.sh - 2 issues
  • plugins/altimate-code/hooks/hooks.json - 0 issues (re-checked)
  • tests/resolve-cli.sh - 0 issues (re-checked)
  • tests/workspace-rules-hook.sh - 1 issue

Reviewed increment adad91a9..1c548454. The previous heredoc-indent, reply-JSON field mapping, README CLI-name/bounded-session-start, CHANGELOG gating and test-race findings are resolved. The prefix-overmatch and Windows-key concerns are addressed by exact quoted/escaped key matching plus cygpath; the remaining risk is the cache's directory root, which the in-repo evidence and the self-seeded test do not establish. CLI-side behaviour (the bindings schema, ALTIMATE_DISABLE_WORKSPACE, learn rules, the not_available payload) still cannot be verified from this repository.

Fix these issues in Kilo Cloud

Previous Review Summaries (3 snapshots, latest commit adad91a)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit adad91a)

Status: 10 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 4
SUGGESTION 6
Issue Details (click to expand)

WARNING

File Line Issue
plugins/altimate-code/hooks/altimate-code-workspace-rules.sh 39 Session start now depends on an undocumented private cache file (altimate-workspace-bindings.json) whose path and bindings schema appear nowhere else in the repo and are never exercised by the test. If the CLI resolves its state directory differently (macOS/Windows conventions) or changes the file, session start silently stops running the CLI in every project, with no message because the hook always exits 0.
plugins/altimate-code/hooks/altimate-code-workspace-rules.sh 41 grep -qF "\"$REAL" accepts any quoted path that merely starts with REAL, so a binding for /work/acme-old also matches /work/acme (the CLI then runs in an unlinked project, up to the 15 s sync call this commit avoids). In the other direction REAL is pwd -P while the cache holds whatever the CLI recorded, so symlinked paths and worktrees miss and lose team rules silently. Needs a "// boundary and negative tests.
plugins/altimate-code/commands/rules.md 47 The step-4 heredoc body and its terminator sit at a 3-space indent, so the wording is stored with three leading spaces (they count against the 140-char limit) and, if the agent does not de-indent the terminator, the heredoc runs to EOF and swallows the learn proposals reply call. Only the terminator is called out, after the block.
PRIVACY.md 13 New data flows (messages, transcript, provider digest, workspace proposals/usage counts) are added while **Effective date:** July 18, 2026 is unchanged, contradicting the policy's own "revise the effective date when our practices change" clause.

SUGGESTION

File Line Issue
plugins/altimate-code/hooks/altimate-code-workspace-rules.sh 50 The new comment says a link may be for a folder inside the repository, but $STATE is always the git toplevel. If the CLI keeps workspace-rules state beside the linked folder, the per-turn hooks exit here and corrections are never recorded — silently. The stub test cannot catch it (it ignores cwd and only creates rules.json at the repo root).
plugins/altimate-code/commands/rules.md 62 New not_available bullet overlaps the queued-reply bullet: a queued reply is exactly an answer left "being answered with" an action, so "finish it with that action" can re-issue a --send that is already queued and must not be read as permission to repeat --approve-anyway without the verification_flagged confirmation.
plugins/altimate-code/commands/rules.md 54 Two reply JSON shapes are documented, then closed / verification_flagged / invalid_text / refused / busy / not_open are listed without saying which field each is in; an agent can miss verification_flagged and skip the --approve-anyway confirmation.
plugins/altimate-code/README.md 52 altimate-code learn proposals dead-ends for curl/PowerShell installs that expose only altimate (README lines 25 and 77 already carry that parenthetical).
plugins/altimate-code/README.md 94 "never block or fail the session" overstates the SessionStart path, which is a synchronous call under a 15 s timeout.
tests/workspace-rules-hook.sh 67 sleep 0.5 plus [ ! -s "$LOG" ] makes the "no CLI call without state" assertion racy, so a real regression can pass.
Files Reviewed (9 files)
  • PRIVACY.md - 1 issue
  • plugins/altimate-code/.codex-plugin/plugin.json - 0 issues
  • plugins/altimate-code/CHANGELOG.md - 0 issues (the "hooks run only in a linked project" wording is now accurate: session start is gated too)
  • plugins/altimate-code/README.md - 2 issues
  • plugins/altimate-code/commands/rules.md - 3 issues
  • plugins/altimate-code/hooks/altimate-code-workspace-rules.sh - 3 issues
  • plugins/altimate-code/hooks/hooks.json - 0 issues
  • tests/resolve-cli.sh - 0 issues
  • tests/workspace-rules-hook.sh - 1 issue

Reviewed increment 3f97ab68f486b54acaa61615ae3ec97b55c5caf0..adad91a9: the session-start pre-filter and its test, plus the README and commands/rules.md wording. The earlier CHANGELOG finding is resolved by the new gate. Findings on PRIVACY.md, commands/rules.md, README.md and the test were re-checked against current code and still apply. The CLI-side claims (queued replies, not_available payloads, the altimate-workspace-bindings.json path and schema, where workspace-rules state is written) cannot be verified from this repository; they depend on the paired altimate-code release.

Fix these issues in Kilo Cloud

Previous review (commit 3f97ab6)

Status: 9 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 2
SUGGESTION 7
Issue Details (click to expand)

WARNING

File Line Issue
plugins/altimate-code/commands/rules.md 47 The step-4 heredoc body and its terminator sit at a 3-space indent, so the wording is stored with three leading spaces (they count against the 140-char limit) and, if the agent does not de-indent the terminator, the heredoc runs to EOF and swallows the learn proposals reply call. Only the terminator is called out, after the block.
PRIVACY.md 13 New data flows (messages, transcript, provider digest, workspace proposals/usage counts) are added while **Effective date:** July 18, 2026 is unchanged, contradicting the policy's own "revise the effective date when our practices change" clause.

SUGGESTION

File Line Issue
plugins/altimate-code/commands/rules.md 62 New not_available bullet overlaps the new queued-reply bullet (line 59): a queued reply is exactly an answer left "being answered with" an action, so "finish it with that action" can re-issue a --send that is already queued (duplicate proposal) and must not be read as permission to repeat --approve-anyway without the verification_flagged confirmation.
plugins/altimate-code/commands/rules.md 54 Two reply JSON shapes are documented, then closed / verification_flagged / invalid_text / refused / busy / not_open are listed without saying which field each is in; an agent can miss verification_flagged and skip the --approve-anyway confirmation.
plugins/altimate-code/README.md 52 altimate-code learn proposals dead-ends for curl/PowerShell installs that expose only altimate; the rest of the README already carries that parenthetical.
plugins/altimate-code/README.md 94 "never block or fail the session" overstates the SessionStart path, which is a synchronous call under a 15 s timeout.
plugins/altimate-code/CHANGELOG.md 14 "The hooks run only in a linked project with learning on" is untrue for SessionStart, which always invokes the CLI and lets the CLI apply the gates.
plugins/altimate-code/hooks/altimate-code-workspace-rules.sh 38 The gate uses the git toplevel while the CLI on line 40 runs from $PWD with no --dir; the two only agree if the CLI re-resolves the root, and the subdirectory test passes only because the stub ignores cwd.
tests/workspace-rules-hook.sh 61 sleep 0.5 plus [ ! -s "$LOG" ] makes the "no CLI call without state" assertion racy, so a real regression can pass.
Files Reviewed (9 files)
  • PRIVACY.md - 1 issue
  • plugins/altimate-code/.codex-plugin/plugin.json - 0 issues
  • plugins/altimate-code/CHANGELOG.md - 1 issue
  • plugins/altimate-code/README.md - 2 issues
  • plugins/altimate-code/commands/rules.md - 3 issues
  • plugins/altimate-code/hooks/altimate-code-workspace-rules.sh - 1 issue
  • plugins/altimate-code/hooks/hooks.json - 0 issues
  • tests/resolve-cli.sh - 0 issues
  • tests/workspace-rules-hook.sh - 1 issue

Reviewed increment d713c51223d28f62c13492a9b03ac092a977e9b8..3f97ab68 (CHANGELOG, README, commands/rules.md); the other six files were re-checked only to confirm earlier findings still apply. The new claims that a sandboxed reply is queued and flushed by a later hook, that a missing drafting model is reported at the next session start, and the not_available code cannot be verified from this repository — they depend on the paired altimate-code release, so the CLI-side wording is a documentation gap rather than a verified defect.

Previous review (commit d713c51)

Status: 8 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 2
SUGGESTION 6
Issue Details (click to expand)

WARNING

File Line Issue
plugins/altimate-code/commands/rules.md 47 The step-4 heredoc sits at a 3-space indent, so <the new wording> becomes WORDING with three leading spaces (they count against the 140-char limit); if the indented ALTIMATE_RULE terminator is not de-indented the heredoc runs to EOF and swallows the learn proposals reply call. Only the terminator is called out, after the block.
PRIVACY.md 13 New data flows (messages, transcript, provider digest, workspace proposals/usage counts) are added while **Effective date:** July 18, 2026 is unchanged, contradicting the policy's own "revise the effective date when our practices change" clause.

SUGGESTION

File Line Issue
plugins/altimate-code/commands/rules.md 54 Two reply JSON shapes are documented, then closed / verification_flagged / invalid_text / refused / busy / not_open are listed without saying which field each is in; an agent can miss verification_flagged and skip the --approve-anyway confirmation.
plugins/altimate-code/README.md 94 "never block or fail the session" overstates the SessionStart path, which is a synchronous call under a 15 s timeout.
plugins/altimate-code/README.md 52 altimate-code learn proposals dead-ends for curl/PowerShell installs that expose only altimate; the rest of the README already carries that parenthetical.
plugins/altimate-code/CHANGELOG.md 13 "The hooks run only in a linked project with learning on" is untrue for SessionStart, which always invokes the CLI and lets the CLI apply the gates.
plugins/altimate-code/hooks/altimate-code-workspace-rules.sh 38 The gate uses the git toplevel while the CLI on line 40 runs from $PWD with no --dir; the two only agree if the CLI re-resolves the root, and the subdirectory test passes only because the stub ignores cwd.
tests/workspace-rules-hook.sh 61 sleep 0.5 plus [ ! -s "$LOG" ] makes the "no CLI call without state" assertion racy, so a real regression can pass.
Files Reviewed (9 files)
  • PRIVACY.md - 1 issue
  • plugins/altimate-code/.codex-plugin/plugin.json - 0 issues
  • plugins/altimate-code/CHANGELOG.md - 1 issue
  • plugins/altimate-code/README.md - 2 issues
  • plugins/altimate-code/commands/rules.md - 2 issues
  • plugins/altimate-code/hooks/altimate-code-workspace-rules.sh - 1 issue
  • plugins/altimate-code/hooks/hooks.json - 0 issues
  • tests/resolve-cli.sh - 0 issues
  • tests/workspace-rules-hook.sh - 1 issue

Verified sound: the per-turn background spawn genuinely returns immediately (( … & ) >/dev/null 2>&1 </dev/null redirects the subshell, so the caller's stdout pipe is not held), the resolver loop cannot pick a stale or non-executable binary, the '{'* filter correctly drops an old CLI's help output, event names match hooks.json, rules.md contains exactly two byte-identical resolver blocks as tests/resolve-cli.sh expects, and the new learn alternative in the bare-call regex matches nothing. The background process is only SIGHUP-immune (nohup), not fully detached from the hook's process group.

Fix these issues in Kilo Cloud


Reviewed by deepseek-v4.1-flash-1017 · Input: 65.5K · Output: 39.6K · Cached: 878.1K

…terrupted answer

- README and CHANGELOG: "Remember this as a team rule: …" said to the agent waits as a proposal, and rule drafting needs altimate-code's own model.
- `/altimate-code:rules`: handles an answer that stopped part-way (`not_available` … "was being answered with").
- Codex: the sandbox has no network, so a proposal sent from `/altimate-code:rules` is queued until the next turn.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment thread plugins/altimate-code/commands/rules.md Outdated
- A message saying the proposal was queued and not sent yet: normal inside Codex's sandbox, which has no network; it is sent after the user's next turn.
- `busy`: another session is answering it; skip it for now.
- `not_open`: it was already answered or closed; move on.
- `not_available` saying it "was being answered with" another action: an earlier answer stopped part-way; offer to finish it with that action.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: A queued reply is itself an answer that "stopped part-way"

The two new bullets overlap without saying which one wins. Line 59 says that inside Codex's sandbox a reply is accepted locally and queued, not sent. That is exactly a proposal left "being answered with" an action until the queue drains after the turn. An agent that hits not_available in that state and follows this bullet re-issues the same action (e.g. --send), so once the queued copy flushes the proposal can be queued twice or the owner sees a duplicate. This also matters for --approve: "finish it with that action" must not be read as permission to repeat --approve-anyway without the explicit confirmation required by line 56 for verification_flagged. Say to check for the queued case first and to re-apply the verification_flagged confirmation when finishing an approve.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845: a queued answer counts as answered and is never re-sent; --approve-anyway always needs fresh confirmation.

- Session start runs the CLI only where workspace rules state exists, or where the workspace link cache names the repository or a folder inside it. Elsewhere the hook costs nothing.
- The per-turn hooks share the same state check. The CLI still runs from the host's directory: a link can be for a folder inside the repository.
- README: direct "remember" needs "team rule" wording. `/altimate-code:rules`: a here-doc delimiter note.
- Hook test covers the pre-filter and a link for a folder inside the repository.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Only a repository with workspace rules state, or one the workspace link cache names (the repository or a folder
# inside it), can have team rules: elsewhere the CLI is not started at all.
if [ ! -f "$STATE" ]; then
CACHE="${XDG_STATE_HOME:-$HOME/.local/state}/altimate-code/altimate-workspace-bindings.json"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Session start now depends on an undocumented private cache file

This path and its bindings key schema are owned by the CLI and appear nowhere else in the repository (no README, PRIVACY or CHANGELOG mention), and the test writes the file itself, so the real location and format are never exercised. Node tooling commonly resolves its state directory to ~/Library/Application Support on macOS and %LOCALAPPDATA% on Windows rather than XDG, and a rename or schema change on the CLI side has the same effect: session start silently stops running the CLI in every project. The user then gets no team rules, no "check failed" notice and no diagnostic, because the hook always exits 0. Document the contract next to the plugin's version requirement, fall back to the CLI when .altimate-code/ exists, or assert the path in a test that does not create the file.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partly: see the matching thread on altimate-claude-plugin#13. The location is the CLI's xdg-basedir state path on every platform, now documented in PRIVACY.md and the hook comment.

if [ ! -f "$STATE" ]; then
CACHE="${XDG_STATE_HOME:-$HOME/.local/state}/altimate-code/altimate-workspace-bindings.json"
REAL="$(cd "$ROOT" 2>/dev/null && pwd -P)"
[ -n "$REAL" ] && grep -qF "\"$REAL" "$CACHE" 2>/dev/null || exit 0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: The path match has no boundary

grep -qF "\"$REAL" accepts any quoted path that merely starts with REAL, so a binding for /work/acme-old also matches REAL=/work/acme: the CLI is started at session start in an unlinked project and pays up to the 15 s synchronous timeout this commit exists to avoid. In the other direction the match is literal and REAL is pwd -P (symlinks resolved) while the cache holds whatever the CLI recorded, so a linked project reached through a symlink or a git worktree misses and loses its team rules with no message. Match "$ROOT"/"$REAL" only when followed by " or /, and add negative tests for a sibling directory sharing the prefix and for a link recorded on a parent folder.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845: exact key with both quotes, JSON-escaped, native paths on Windows. Negative tests added.

esac
;;
user-prompt-submit|stop)
[ -f "$STATE" ] || exit 0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: The per-turn gate and the CLI can still resolve different project roots

The new comment (lines 29-30) says a link may be for a folder inside the repository, and session start now accepts that through the cache; but $STATE is always <git toplevel>/.altimate-code/learn/workspace-rules/rules.json. If the CLI keeps workspace-rules state beside the linked folder (repo/dbt/.altimate-code/…) instead of at the git root, user-prompt-submit and stop exit here before recording anything: the session receives the team rules but corrections never become proposals, silently. The test cannot catch it, because the stub ignores its cwd and rules.json is only ever created at the repo root. Either state that the CLI always writes this state at the git root, or check the linked path as well.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No change needed: the CLI keeps workspace-rules state at the repository root (Instance.worktree), even for a link made for a subfolder, so the per-turn gate and the CLI agree. A comment in the hook now says so.

@hkaltai hkaltai left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Peer review: APPROVE (with minor comments)

Reviewers: lead (Claude), Claude (fresh claude -p session), Codex (gpt-6.1-sol), with one convergence round.

The hook wrapper is defensive: every path exits 0, only the CLI's JSON is passed through, per-turn calls are detached with every file descriptor closed, and repositories without rules state or a link start no CLI. The /altimate-code:rules flow offers at most 4 choices. Nothing blocks merge here. The minor comments are inline, and the PRIVACY.md wording should be settled before release.

Dependency: merge and release after AltimateAI/altimate-code#1626, which has an open MAJOR. Without a configured model, the background Stop check auto-registers for Altimate Base and sends the digest with no disclosure. That affects what this PRIVACY.md can promise.

A linked-worktree root mismatch was raised, then withdrawn in convergence: the CLI's Instance.worktree is the --show-toplevel checkout, which matches $ROOT here.

Nits (consolidated)

  • plugins/altimate-code/hooks/altimate-code-workspace-rules.sh:29-30: the comment "Run from the host's directory, not the repository root" sits right above the line that computes the repository root, so it reads as contradicting it. Suggest: "$ROOT only locates the state file; the CLI runs in the host's directory (no cd), because a link can be for a folder inside the repository."
  • plugins/altimate-code/hooks/altimate-code-workspace-rules.sh:41: grep -qF "\"$REAL" doesn't JSON-escape the path (a directory containing " or \ never matches) and is a prefix match (/x/app matches /x/app-old). The walk-up fix in the inline comment covers both.
  • Docs mix altimate learn … and altimate-code learn … for the same commands (README and PRIVACY). Pick one.
  • tests/workspace-rules-hook.sh: the slow stub's background processes outlive the test and are still sleeping when the trap deletes $WORK. Kill them before cleanup.
  • README: a new clone or worktree gets no team rules until altimate-code has run (or been linked) in that checkout, because both the gate and the CLI read only the directory-keyed bindings cache. Worth one line.

Scope vs ticket: cannot verify, because there's no ticket reference. Unrelated files: clean. Naming: clean, apart from the mixed command names above.

🤖 Generated with Claude Code

Comment on lines +38 to +42
if [ ! -f "$STATE" ]; then
CACHE="${XDG_STATE_HOME:-$HOME/.local/state}/altimate-code/altimate-workspace-bindings.json"
REAL="$(cd "$ROOT" 2>/dev/null && pwd -P)"
[ -n "$REAL" ] && grep -qF "\"$REAL" "$CACHE" 2>/dev/null || exit 0
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MINOR — The gate lets through a child-folder link that the CLI can't find from the repo root

if [ ! -f "$STATE" ]; then
  CACHE="${XDG_STATE_HOME:-$HOME/.local/state}/altimate-code/altimate-workspace-bindings.json"
  REAL="$(cd "$ROOT" 2>/dev/null && pwd -P)"
  [ -n "$REAL" ] && grep -qF "\"$REAL" "$CACHE" 2>/dev/null || exit 0
fi

When only dbt/ is linked and the session starts at the repository root, this check passes (the key starts with $REAL). But the CLI's RulesService.linked() (altimate-code rules/service.ts:59-67) only walks up from the cwd to the root, so it returns not linked. The CLI starts, waits up to the first-pull budget, and gives no rules. The comment ("or a folder inside it") and the test at tests/workspace-rules-hook.sh:50 ("started from the repository root: the CLI runs") pass only because the stub always answers.

Suggested fix: mirror the CLI. Walk from pwd -P up to $ROOT, matching "\"$DIR\"" with the closing quote at each step; that also removes the /x/app vs /x/app-old prefix overmatch. Or teach the CLI to look below the cwd. Then change the test to start inside project/dbt/models, and add a negative case for a root start with only a child folder linked.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845 (same walk as the Claude plugin).

Comment thread PRIVACY.md Outdated

## Workspace rules

These hooks act only in a project linked to an Altimate workspace, with learning on, workspaces on and you signed in to Altimate. Otherwise the session-start hook reads only local altimate-code state and sends nothing, and the per-turn hooks do not run the CLI at all in a project without workspace rules state.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MINOR — The learning-off guarantee is stronger than the code

These hooks act only in a project linked to an Altimate workspace, with learning on, workspaces on and you signed in to Altimate. Otherwise the session-start hook reads only local altimate-code state and sends nothing, ...

RulesHost.start() checks rulesEnabled() (the learn switch and workspaces) before the pull. But the workspace's "Learn from sessions" setting and capture (learn disable sets capture=false) are checked only afterwards, in on(). So with either opt-out from line 36, a signed-in, linked project can still pull from Altimate at session start. Also, the per-turn hooks pass every prompt and the transcript path to a local CLI process wherever rules.json exists, even after learn disable, sign-out or unlink. The CLI then drops them, so nothing leaves the machine, but the wording implies the hooks stop.

Separately, the digest goes to "your configured LLM provider" only if one is configured. Otherwise the CLI currently auto-registers Altimate Base (see the MAJOR on AltimateAI/altimate-code#1626).

Suggested fix: narrow the wording to what is gated: capture and drafting are off; a rules pull still happens unless ALTIMATE_LEARN=0. Or change the CLI to check the workspace setting before pulling. Optionally, skip the per-turn hooks early on ALTIMATE_LEARN=0.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845; see the matching thread on altimate-claude-plugin#13.

Comment thread PRIVACY.md Outdated

- The plugin itself collects **no data**. It is a routing layer (a skill, a slash command, and a static session hook) that tells Codex when to delegate a task to the altimate-code CLI installed on your machine.
- The plugin itself collects **no data**. It is a routing layer (skills, slash commands, and session hooks) that tells Codex when to delegate a task to the altimate-code CLI installed on your machine.
- In a project linked to an Altimate workspace with learning on, its workspace-rules hooks hand your messages and the session transcript to the local altimate-code CLI, which keeps corrections on your machine and may send a digest to your LLM provider to word a proposed team rule. A proposal reaches your workspace only when you send or approve it. See [Workspace rules](#workspace-rules).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MINOR — Effective date (line 3) unchanged after a material change, anchored here because line 3 isn't in the diff

**Effective date:** July 18, 2026

The policy now covers every prompt and the transcript, plus a digest sent to an LLM provider. The policy itself promises to revise the effective date when practices change. Set it to the 1.2.0 release date, and get the privacy sign-off the PR description asks for.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845.

Comment thread tests/workspace-rules-hook.sh Outdated
cd "$(dirname "$0")/.."
HOOK="$(find "$PWD/plugins/altimate-code" -name '*workspace-rules.sh' | head -n1)"
[ -f "$HOOK" ] || { echo "FAIL: no workspace-rules hook script"; exit 1; }
grep -q "$(basename "$HOOK")" plugins/altimate-code/hooks/hooks.json || { echo "FAIL: hooks.json does not run $(basename "$HOOK")"; exit 1; }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MINOR — hooks.json is only checked by grepping for the script name

grep -q "$(basename "$HOOK")" plugins/altimate-code/hooks/hooks.json || { echo "FAIL: hooks.json does not run $(basename "$HOOK")"; exit 1; }

A typo in an event name (UserPromptSubmit/Stop), an argument (user-prompt-submit, which the script's case silently ignores), or a timeout would still pass. Parse it with python3 -c 'import json…' or jq, and assert each event runs the script with its matching argument and the 15/5/5 timeouts.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845.

Comment thread PRIVACY.md Outdated
- In a project linked to an Altimate workspace with learning on, its workspace-rules hooks hand your messages and the session transcript to the local altimate-code CLI, which keeps corrections on your machine and may send a digest to your LLM provider to word a proposed team rule. A proposal reaches your workspace only when you send or approve it. See [Workspace rules](#workspace-rules).
- When a task **is** delegated, your task text is passed to the altimate-code CLI, which sends it to an LLM provider to plan and execute the work — the Altimate LLM Gateway by default, or a provider you configure (BYOK).
- Warehouse queries, dbt commands, and file edits run **locally on your machine, under your credentials**. Your warehouse credentials are never sent to Altimate.
- The plugin ships as opt-in. Adding the marketplace does not enable the plugin — you must explicitly install it from Codex's `/plugins` browser and approve its SessionStart hook before any delegation happens.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MINOR — Consent wording still names only the SessionStart hook

... you must explicitly install it from Codex's `/plugins` browser and approve its SessionStart hook before any delegation happens.

1.2.0 also installs UserPromptSubmit and Stop hooks, and those are the ones that see every prompt and the transcript. Say "approve its hooks (SessionStart, UserPromptSubmit, Stop)" here and at line 75. In the README, mention that Codex may ask again after upgrading from 1.1.0.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1c54845: PRIVACY (lines 16 and 75), SECURITY.md and the README's trust section now name SessionStart, UserPromptSubmit and Stop. The README also says Codex may ask again after upgrading from 1.1.0.

@ralphstodomingo ralphstodomingo left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes to PRIVACY.md, which the description asks to have reviewed. The code reads fine. These are the places where the policy doesn't match what altimate-code does:

  1. What the digest contains. The "session transcript" row says "a bounded, redacted digest". The digest altimate-code builds (packages/opencode/src/altimate/learn/digest.ts in altimate-code) holds the session's prompts, every tool call's input and output (up to 300 and 400 characters per call, so file contents, command output and warehouse rows), and the final reply, up to 24,000 characters in all. Redaction masks secrets only, not other data. The policy should say so.
  2. Where it goes. "Your configured LLM provider" reads as Codex's provider (OpenAI). It's actually altimate-code's own model: learn.model, else altimate-code's default (the Altimate LLM Gateway, or the provider configured for altimate-code). Name it, since for a Codex user it's a party that doesn't otherwise see the session.
  3. Telemetry. "does not phone home and does not collect analytics" is true of the plugin itself, but the CLI the hooks start sends rules telemetry: rules_sync, rules_delivered, rule_drafted and rule_proposal_shown (the last with the host session id). Add a row to the table, or point this section at "Usage telemetry" below.
  4. Who turns learning on. "with learning on" doesn't say that, in a linked project, the workspace's "Learn from sessions" setting turns capture on for a member who hasn't made a choice of their own. The policy lists that setting as an off switch; it should also say the workspace owner can switch capture on with it.
  5. Effective date. The data flows changed, and "Changes to this policy" says the date is revised when practices change.

Smaller:

  • In the description, stacked on #1605 links to this repository's own number 1605, not altimate-code's. Use AltimateAI/altimate-code#1605.
  • On Windows the session-start check of the link cache never matches. It greps for the Git Bash path (/c/Users/...), but altimate-code keys the cache by the native path, JSON-escaped (C:\\Users\\...). So on Windows, session start only runs the CLI where workspace-rules state already exists.
  • The edit here-doc in commands/rules.md is indented inside its list item. Copied as written, the closing delimiter doesn't end it, or the wording picks up leading spaces (Kilo's thread). Showing the block flush left avoids both.

As the description says, this must merge and ship after an altimate-code release that has learn hook, and also after the changes requested on AltimateAI/altimate-code#1626.

Appendix: complexity delta

No TypeScript or Python in this diff (a shell hook, Markdown and JSON), so there's nothing to measure.

- `hooks/altimate-code-workspace-rules.sh`: at session start, walk from
  the host's directory up to
  the repository root and match each folder as an exact JSON key of the
  link cache (escaped, native form via `cygpath -w` on Windows), as the
  CLI does. A link for a subfolder no longer starts the CLI from the
  repository root, and `/x/app` no longer matches `/x/app-old`.
- Skip every event with `ALTIMATE_LEARN=0` (or `false`).
- Correct the comments on `$ROOT`, blocking and model calls per `Stop`.
- `tests/workspace-rules-hook.sh`: parse `hooks.json` and check each
  event's argument and timeout; cover a start below a linked subfolder,
  a root start with only a subfolder linked, a sibling-prefix link,
  quote/backslash paths, Windows native keys and `ALTIMATE_LEARN`;
  replace the fixed sleep with a sentinel; stop the slow stub on exit.
- `commands/rules.md`: show the edit here-doc flush left, branch on
  `code` when `ok` is false and on `closed` when it is true, and never
  repeat `--approve-anyway` without fresh confirmation.
- `PRIVACY.md`, `README.md`: approving the plugin means approving its
  hooks (SessionStart, `UserPromptSubmit`, `Stop`); Codex may ask again
  after upgrading from 1.1.0.
- `commands/rules.md`: a sandbox-queued answer is treated as answered
  and never re-sent, including when a later `not_available` names it.
- `PRIVACY.md`: state what is gated by what, who can turn capture on,
  the digest's contents and caps, that it goes to altimate-code's own
  model rather than Codex's, and the rules telemetry the CLI sends; add a
  revision date.
- `README.md`, `CHANGELOG.md`: `altimate learn …` throughout, bounded
  session start, start in the linked folder, new clones and worktrees,
  where proposals are answered, and the corrected gating.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# paths written as JSON strings, so each folder is converted (`cygpath -w` on Windows) and escaped, and matched with
# both quotes, so `/x/app` never matches `/x/app-old`.
linked() {
local cache="${XDG_STATE_HOME:-$HOME/.local/state}/altimate-code/altimate-workspace-bindings.json"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: The link-cache directory is still an unverified, hard-coded XDG state path

linked() reads ${XDG_STATE_HOME:-$HOME/.local/state}/altimate-code/altimate-workspace-bindings.json, but nothing in this repository proves the CLI writes its link cache there. The plugin's own troubleshooting table documents the CLI's global directory as ~/.local/share/altimate-code/ (a data root, not a state root), and on macOS/Windows a Node CLI normally resolves to ~/Library/Application Support / %LOCALAPPDATA%. A data-vs-state or platform difference means grep never finds the cache, so session start starts nothing in every newly linked repository. Because the hook always exits 0, the user gets no team rules, no warning and no diagnostic.

The new test cannot catch this: link() writes the cache at exactly the path the test sets through XDG_STATE_HOME, so it only proves the hook can read a file it created itself. Verify the real location against the paired altimate-code release (or ask the CLI for the cache path), and add a test that expects the cache at the CLI's location rather than creating it in the hook's location.

done
[ "$(hook "$WORK/project" stop "$BIN:$SYS")" = "0|" ] || fail "stop with rules state did not exit quietly"
await_log "learn hook stop --host $HOST" || fail "stop with rules state did not run the CLI"
for _ in $(seq 20); do [ "$(grep -c . "$STARTED")" -gt 1 ] && break; sleep 0.1; done

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: This wait can only ever time out

The loop breaks when $STARTED has more than one line, but the next assertion requires exactly one (= "learn hook stop --host $HOST"). On a correct run it therefore always burns the full two seconds; on a broken run it breaks early only to fail the following line, so it does not wait for anything meaningful. await_log has already confirmed the positive stop landed (the stub appends to $STARTED before it reads stdin and writes $LOG), so the loop can be dropped. If the intent is to catch a stray background call, use a deterministic sentinel or a bounded await_absent that also covers calls arriving after the assertion instead of sleeping for a second line that must not exist.

@saravmajestic

Copy link
Copy Markdown
Author

Review round addressed in 1c54845 (it also names all three hooks in the consent wording, SECURITY.md and the README). Each inline thread has a reply.

PRIVACY.md, for ralphstodomingo's points 1–5 and hkaltai's comments:

  • the digest's contents and caps, and that only secrets are redacted;
  • that it goes to altimate-code's own model (learn.model, or altimate-code's default), not the host's, and that nothing is sent when no model is configured;
  • the rules telemetry events, including the host session id;
  • that the workspace owner's "Learn from sessions" setting can turn capture on for members with no choice of their own;
  • what is gated by what, including that team rules are pulled whatever the learning setting;
  • a "Last revised" date.

Legal sign-off is still pending.

Smaller points:

  • the #1605 link now points to altimate-code;
  • the link check uses Windows native, JSON-escaped keys (cygpath -w);
  • the here-doc is flush left.

hkaltai's nits:

  • the $ROOT comment is fixed;
  • link keys are matched exactly and escaped;
  • altimate learn … is used throughout;
  • the slow stub is killed on exit;
  • the README now covers new clones and worktrees.

Dependency: merge and release after altimate-code#1626 ships in a release; the no-model and gating fixes are there.

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants