Repository navigation
v4.53.0
Added
kj initoffers to enroll the phone (KJC-TSK-1046, ADR 0020): with a person at the terminal and no phone enrolled, the wizard offers to enroll it and collects the public key from karajancode.com/sign; once the wizard is closed, the identity command enrolls it with all its checks, roster and recovery code. Without a terminal init only informs.kj review --publish-pr <n>(KJC-TSK-0913): the approved verdict of each commit of a PR, found by the diff it brought, is published on it as one GitHub review (event COMMENT), so the review counts inreviews.totalCount; a commit without one fails it, and a review already published for the same head is not repeated.kj reviewwarns of dependencies published under 72 hours ago (KJC-TSK-0722): it reads what apackage-lock.jsondiff installs, asks npm how old each version is and hands the young ones to the reviewer;supply_chain.cooldown_hoursmoves the threshold, and a regenerated lockfile is said in one line.kj hardensays how to make the method's checks required (KJC-TSK-0928): on a GitHub remote it reads the base branch protection and gives the exact step (the full command for an unprotected branch, the additive one for missing checks, or the settings page where a command could undo existing protection). It never applies it.- Starting a card reserves it (KJC-TSK-1047, team Karajan):
kj hu move <id> runningreserves the card to who works the clone; a running card reserved by someone else moves only with--release;kj hu listshows it. - Per-HU measurement for model routing (KJC-TSK-0702, KJC-TSK-1057): each HU records the coder's provider and model, tokens out and the reviewer's rejections, and
kj reportadds up cost and first-time failures per coder model, with earlier HUs as the baseline. kj worktree prunealso deletes loosekj-hu-*branches with no commits of their own, and measures againstorigin/<base>(KJC-TSK-1037, ADR 0019).kj reviewwarns when another branch in progress touches the same files (KJC-TSK-1052, team Karajan): remote branches with commits outside the base, active in the last 14 days, that share files with the commit, with their author.- The supply-chain cooldown can block (KJC-TSK-1056): with
method_gates.dep_cooldown: block, a dependency published under the threshold stopskj reviewbefore any reviewer token; only a human grant onmethod.dep_cooldownlifts it, and what cannot be verified never blocks. kj checkwarns of young dependencies andkj release checkof old npm tokens (KJC-TSK-1059): the branch's lockfile against the merge base, and each long-lived npm token older thansupply_chain.npm_token_max_days(90), named only by an id prefix.kj checksays when the audit is due by work cycles (KJC-TSK-0719): distinct cards and work commits since the last scored audit, againstaudit_cycle.every_cards(10) andevery_commits(60), with the counter in view.- Each HU leaves the decomposition with its tier and why (KJC-TSK-0698): trivial, standard or deep, judged in the same answer and checked against a deterministic signal; the higher wins, and a sensitive zone is always deep.
- Named model profiles (KJC-TSK-0699):
kj run --profile frugal|standard|deep(ormodel_profilein the config) fills the model of every role nothing else sets; the reviewer never goes below standard, andkj confignames the profile. - EXTEND, REWORK or REBUILD per HU, and REWORK only with a licence (KJC-TSK-0717, KJC-TSK-1061): the planner classifies each change to existing code with its criterion;
kj plan license <plan> <hu> --module <path>scores the module withkj mutate, and undermethod_gates.rework_mutation_min(0.8) the plan needs an HU that hardens the module first. - The prompt-injection patterns are a versioned, portable catalog (KJC-TSK-0703):
src/utils/injection-patterns.json, which Python'srereads too, so karajan-radar can share it.
Changed
-
claude runs on
claude-opus-5-5unless the user declares a model (KJC-TSK-0914). -
One table of default models, with ids verified on 2026-10-16 (KJC-TSK-0699): codex takes gpt-5.6-luna, terra and sol; gemini, qwen, copilot, opencode and aider leave the model to their CLI, since none of their ids could be verified.
-
The pipeline stamp proves Sonar coverage per staged source (KJC-TSK-0839), as
kj review --stageddoes, and the method report judges it by that coverage. -
kj doctorchecks the team's SonarQube (KJC-TSK-1051): withsonarqube.externalit no longer advises a local Docker, and withsonarqube.quality_profileit checks the project runs on that profile. -
The Sentinel treats
.karajan/security-level.jsonas a governance file (KJC-TSK-1054): onlykj securitywrites it. -
The injection guard no longer flags a long JSDoc of tags (KJC-TSK-0743), and its two source exclusions are gone.
-
With no phone anywhere, a person lowers the level at the terminal (KJC-TSK-1045, ADR 0020): at the default max level and with no phone enrolled, lowering to normal demanded the very phone that was missing. Now the human layers and the typed code lower it; the record says it is unsigned and reads as max again once a phone is enrolled. An agent session is still refused.
Fixed
kj doctorno longer calls the phone optional at the max level (KJC-BUG-0360): without a phone the seal, rule approvals and enrolling another phone are refused at max, the default; doctor listed the phone as optional and its text spoke of a typed code, true only at the normal level. The check now fails at max and names what is refused.- A blocking Sonar gate hands the coder each issue (KJC-BUG-0359, #2158): the coder got only severity counts and guessed until
sonar_repeat; the feedback now lists severity, rule, file, line and message, capped at 25. - An opencode failure reaches kj with its message (KJC-BUG-0358): with
--format jsonopencode reports the failure as an error event on stdout, and kj showed it without a reason. - The Spanish word «todo» is not a TODO tag (KJC-TSK-1042): Sonar's S1135 matches the word regardless of case; kj suppresses it, with its reason, when the line holds no uppercase TODO.
Infrastructure
- Contract tests replay real CLI answers (KJC-TSK-1039, KJC-TSK-1043, KJC-TSK-1044):
scripts/record-agent-fixtures.mjsrecords what claude (with and without hooks), codex, copilot, agy, gemini and opencode really emit, as reviewer and as coder; the contract test replays each through the path kj reads them by, and demands a failure's own reason. - The contract with claude is checked on the maintainer's machine (KJC-TSK-1063):
npm run contract:clauderecords again with the installed claude when its version differs from the recordings, andkj release checkis red until it matches. - The audit command tests no longer write to the repo's audit history (KJC-BUG-0361).
- The root prettier covers
packages/watchwith its own config (KJC-TSK-0744), anddocs/family-contracts.mdlists the family's published contracts (KJC-TSK-0782).