§9 acceptance: grep-zero sweep — every internal x.ai/grok identifier renamed

The PRD's first acceptance gate now holds: grep -RinE '\bx\.ai\b|grok'
crates/ --include='*.rs' → 0 matches (exempt: NOTICE and third-party
license archives, README provenance, and the required 'Based on Grok
Build Open Source' attribution, now sourced from version_attribution.txt).

Wire-visible renames (both sides in this repo, changed in lockstep):
- Auth method id 'grok.com' → 'kimi-code' (AuthMethodKind::KimiCode).
- Every x.ai/* and _x.ai/* ACP ext method and meta key → kigi/* /
  _kigi/* (~200 names; grokShell → kigiShell). Session-file replay keeps
  a read-side alias for the legacy '_x.ai/session/update' method so
  existing updates.jsonl histories load; writes emit only the new name
  (both directions test-pinned).
- Agent types grok-build* → kigi* with a documented legacy-prefix alias
  at resolution time so persisted sessions keep resolving.
- ToolNamespace/BuiltinAgentName GrokBuild* → Kigi* (wire snake_case
  kigi/kigi_concise/kigi_hashline; schema regenerated); grok_build
  implementation dirs renamed to kigi*.
- x-grok-* headers → x-kigi-*, __GROK_* sentinels → __KIGI_*, themes
  grokday/groknight → kigiday/kiginight (old persisted values fall back
  to the default theme), web_fetch allowlist xAI hosts → kimi.com +
  moonshot platforms, changelog CDN → this repo, grok-build changelog
  archives deleted.
- BYOK default endpoint removed: [endpoints] api_base_url is now truly
  optional with NO default — consumers fail fast with the flag name when
  unset (no silent x.ai egress). Mock harnesses inject it explicitly.
- System-prompt identity fixed: 'released by xAI' → 'an unofficial
  community CLI for Kimi' (template + regenerated encrypted form).

Also repaired pre-existing grok-era test debt found by the sweep: the
stale trace_classify default-model pin, the grok-pager UA label test,
pty-harness stale-binary reuse and non-hermetic moonshot routing (a PTY
test could previously reach the real api.moonshot.cn), and the outdated
oauth fixture scope key.

Gates: §9 grep 0; fmt clean; workspace check/clippy 0/0 (-D warnings);
FULL cargo test --workspace: 234 suites, 21,961 passed, 0 failed;
deny advisories ok.
This commit is contained in:
2026-07-18 02:48:46 -04:00
parent 86e3724310
commit 6f31415ed6
1056 changed files with 8410 additions and 18307 deletions
@@ -908,7 +908,7 @@ async fn update_sampling_config_is_queryable() {
let h = TestHarness::new();
let new_config = SamplingConfig {
base_url: "https://new.example.com".to_string(),
model: "grok-3".to_string(),
model: "kigi-3".to_string(),
max_completion_tokens: Some(4096),
temperature: Some(0.5),
top_p: None,
@@ -921,7 +921,7 @@ async fn update_sampling_config_is_queryable() {
h.handle.update_sampling_config(new_config.clone());
let config = h.handle.get_sampling_config().await.unwrap();
assert_eq!(config.model, "grok-3");
assert_eq!(config.model, "kigi-3");
assert_eq!(config.context_window, NonZeroU64::new(200_000).unwrap());
}
@@ -1155,8 +1155,8 @@ async fn build_request_includes_all_messages() {
.await
.unwrap();
assert_eq!(request.items.len(), 2);
assert_eq!(request.x_grok_conv_id, Some("conv-1".to_string()));
assert_eq!(request.x_grok_req_id, Some("req-1".to_string()));
assert_eq!(request.x_kigi_conv_id, Some("conv-1".to_string()));
assert_eq!(request.x_kigi_req_id, Some("req-1".to_string()));
}
#[tokio::test]
@@ -1293,7 +1293,7 @@ async fn build_request_with_tool_definitions() {
async fn build_request_uses_sampling_config() {
let config = SamplingConfig {
base_url: "https://api.example.com".to_string(),
model: "grok-3".to_string(),
model: "kigi-3".to_string(),
max_completion_tokens: Some(8192),
temperature: Some(0.7),
top_p: Some(0.9),
@@ -1311,7 +1311,7 @@ async fn build_request_uses_sampling_config() {
.await
.unwrap();
assert_eq!(request.model, Some("grok-3".to_string()));
assert_eq!(request.model, Some("kigi-3".to_string()));
assert_eq!(request.temperature, Some(0.7));
assert_eq!(request.max_output_tokens, Some(8192));
assert_eq!(request.top_p, Some(0.9));
@@ -1484,7 +1484,7 @@ async fn parallel_tool_calls_accept_first_reject_second_skip_third() {
arguments: r#"{"command":"cargo test"}"#.into(),
},
],
model_id: Some("grok-3".to_string()),
model_id: Some("kigi-3".to_string()),
model_fingerprint: None,
reasoning_effort: None,
});
@@ -1770,7 +1770,7 @@ async fn dangling_tool_calls_after_crash_are_repaired_on_load() {
arguments: r#"{"command":"cargo test"}"#.into(),
},
],
model_id: Some("grok-3".to_string()),
model_id: Some("kigi-3".to_string()),
model_fingerprint: None,
reasoning_effort: None,
}),
@@ -3365,13 +3365,13 @@ async fn get_last_model_metadata_returns_both_fields() {
ConversationItem::Assistant(kigi_sampling_types::AssistantItem {
content: "hello".into(),
tool_calls: vec![],
model_id: Some("grok-4.5".into()),
model_id: Some("kigi-4.5".into()),
model_fingerprint: Some("fp_abc123".into()),
reasoning_effort: None,
}),
]);
let meta = h.handle.get_last_model_metadata().await;
assert_eq!(meta.resolved_model_id.as_deref(), Some("grok-4.5"));
assert_eq!(meta.resolved_model_id.as_deref(), Some("kigi-4.5"));
assert_eq!(meta.model_fingerprint.as_deref(), Some("fp_abc123"));
}
@@ -3396,7 +3396,7 @@ async fn sampling_config_survives_compaction_replacement() {
let config = SamplingConfig {
base_url: "https://api.example.com".to_string(),
model: "grok-build".to_string(),
model: "kigi".to_string(),
max_completion_tokens: None,
temperature: Some(0.7),
top_p: Some(0.95),
@@ -3414,7 +3414,7 @@ async fn sampling_config_survives_compaction_replacement() {
ConversationItem::Assistant(kigi_sampling_types::AssistantItem {
content: "I'll fix it.".into(),
tool_calls: vec![],
model_id: Some("grok-4.5".into()),
model_id: Some("kigi-4.5".into()),
model_fingerprint: Some("fp_abc123".into()),
reasoning_effort: None,
}),
@@ -3424,12 +3424,12 @@ async fn sampling_config_survives_compaction_replacement() {
// Pre-compaction: everything correct.
let pre = h.handle.get_sampling_config().await.unwrap();
assert_eq!(pre.model, "grok-build");
assert_eq!(pre.model, "kigi");
assert_eq!(pre.context_window.get(), 500_000);
assert_eq!(pre.api_backend, ApiBackend::Responses);
let pre_meta = h.handle.get_last_model_metadata().await;
assert_eq!(pre_meta.resolved_model_id.as_deref(), Some("grok-4.5"));
assert_eq!(pre_meta.resolved_model_id.as_deref(), Some("kigi-4.5"));
assert_eq!(pre_meta.model_fingerprint.as_deref(), Some("fp_abc123"));
// Simulate compaction: replace conversation with compacted history.
@@ -3441,10 +3441,7 @@ async fn sampling_config_survives_compaction_replacement() {
// Post-compaction: SamplingConfig MUST be preserved.
let post = h.handle.get_sampling_config().await.unwrap();
assert_eq!(
post.model, "grok-build",
"BUG: model changed after compaction"
);
assert_eq!(post.model, "kigi", "BUG: model changed after compaction");
assert_eq!(
post.context_window.get(),
500_000,
@@ -3471,7 +3468,7 @@ async fn sampling_config_survives_compaction_replacement() {
/// After compaction, the `build_session_info` display path uses
/// `get_sampling_config().model` as the source-of-truth model slug.
/// If that model slug is e.g. "grok-build" and not in the ModelState
/// If that model slug is e.g. "kigi" and not in the ModelState
/// catalog with a display name, the pager shows the raw slug. This
/// test verifies the pager's `current_model_name()` behavior when the
/// model ID doesn't match any catalog entry.
@@ -3479,7 +3476,7 @@ async fn sampling_config_survives_compaction_replacement() {
async fn model_metadata_lost_after_compaction_then_recovered_on_next_turn() {
let config = SamplingConfig {
base_url: "https://api.example.com".to_string(),
model: "grok-build".to_string(),
model: "kigi".to_string(),
max_completion_tokens: None,
temperature: Some(0.7),
top_p: Some(0.95),
@@ -3497,7 +3494,7 @@ async fn model_metadata_lost_after_compaction_then_recovered_on_next_turn() {
ConversationItem::Assistant(kigi_sampling_types::AssistantItem {
content: "done".into(),
tool_calls: vec![],
model_id: Some("grok-4.5".into()),
model_id: Some("kigi-4.5".into()),
model_fingerprint: Some("fp_acd3142484d3ad6f".into()),
reasoning_effort: None,
}),
@@ -3507,7 +3504,7 @@ async fn model_metadata_lost_after_compaction_then_recovered_on_next_turn() {
// Before compaction: metadata present.
let meta = h.handle.get_last_model_metadata().await;
assert_eq!(meta.resolved_model_id.as_deref(), Some("grok-4.5"));
assert_eq!(meta.resolved_model_id.as_deref(), Some("kigi-4.5"));
assert_eq!(
meta.model_fingerprint.as_deref(),
Some("fp_acd3142484d3ad6f")
@@ -3532,7 +3529,7 @@ async fn model_metadata_lost_after_compaction_then_recovered_on_next_turn() {
kigi_sampling_types::AssistantItem {
content: "working on it".into(),
tool_calls: vec![],
model_id: Some("grok-4.5".into()),
model_id: Some("kigi-4.5".into()),
model_fingerprint: Some("fp_acd3142484d3ad6f".into()),
reasoning_effort: None,
},
@@ -3540,7 +3537,7 @@ async fn model_metadata_lost_after_compaction_then_recovered_on_next_turn() {
// Metadata recovered.
let meta = h.handle.get_last_model_metadata().await;
assert_eq!(meta.resolved_model_id.as_deref(), Some("grok-4.5"));
assert_eq!(meta.resolved_model_id.as_deref(), Some("kigi-4.5"));
assert_eq!(
meta.model_fingerprint.as_deref(),
Some("fp_acd3142484d3ad6f")
@@ -3564,10 +3561,10 @@ async fn model_metadata_lost_after_compaction_then_recovered_on_next_turn() {
async fn context_window_downgrade_triggers_auto_compact() {
use kigi_sampling_types::ApiBackend;
// Initial config: 500k context, Responses backend (matches grok-4.5)
// Initial config: 500k context, Responses backend (matches kigi-4.5)
let config = SamplingConfig {
base_url: "https://api.x.ai/v1".to_string(),
model: "grok-4.5".to_string(),
base_url: "https://byok.example/v1".to_string(),
model: "kigi-4.5".to_string(),
max_completion_tokens: None,
temperature: Some(0.7),
top_p: Some(0.95),
@@ -3606,7 +3603,7 @@ async fn context_window_downgrade_triggers_auto_compact() {
128_000,
"context_window should be overwritten by update_sampling_config"
);
assert_eq!(post.model, "grok-4.5", "model slug must not change");
assert_eq!(post.model, "kigi-4.5", "model slug must not change");
assert_eq!(
post.api_backend,
ApiBackend::Responses,
@@ -3934,7 +3931,7 @@ async fn prefix_stable_after_model_switch() {
.push_user_message(ConversationItem::user("continue"));
let new_config = SamplingConfig {
model: "grok-3-mini".to_string(),
model: "kigi-3-mini".to_string(),
..test_config()
};
h.handle.update_sampling_config(new_config);
@@ -4317,7 +4314,7 @@ async fn prefix_stable_after_session_resume() {
}
// ============================================================================
// Out-of-band history repair (x.ai/session/repair)
// Out-of-band history repair (kigi/session/repair)
// ============================================================================
/// Bricked-session shape: an orphaned tool result survives load (the eager