ruvnet/RuView · error · Error

Refusing CLI access: README does not identify a RuView check

Error message

Refusing CLI access: README does not identify a RuView checkout

What it means

The final repo-trust check reads the first 131072 bytes (128 KiB) of README.md and requires the case-insensitive word-boundary regex /\b(?:RuView|wifi[- ]densepose)\b/ to match. A README that never says 'RuView' or 'wifi densepose' as a standalone word, or only says it past 128 KiB, fails the gate.

Source

Thrown at harness/ruview/src/repo-trust.js:21

import { isAbsolute, join, relative } from 'node:path';
const REQUIRED_MARKERS = ['.git', 'README.md', 'v2'];
const RUVIEW_MARKERS = ['firmware', 'wifi_densepose'];
function isWithin(parent, child) {
  const rel = relative(parent, child);
  return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
}
export function assertTrustedRuViewRepo(repoRoot, { trustedRoot = repoRoot } = {}) {
  if (!repoRoot || !trustedRoot) throw new TypeError('repoRoot and trustedRoot are required');
  const root = realpathSync(repoRoot);
  const trustAnchor = realpathSync(trustedRoot);
  if (!isWithin(trustAnchor, root) || root !== trustAnchor) throw new Error('Refusing CLI access: repository does not match the configured trusted root');
  if (!statSync(root).isDirectory()) throw new Error('Refusing CLI access: trusted root is not a directory');
  const missing = REQUIRED_MARKERS.filter((marker) => !existsSync(join(root, marker)));
  if (missing.length || !RUVIEW_MARKERS.some((marker) => existsSync(join(root, marker)))) {
    throw new Error(`Refusing CLI access: RuView repository markers are missing${missing.length ? ` (${missing.join(', ')})` : ''}`);
  }
  const readme = readFileSync(join(root, 'README.md'), 'utf8').slice(0, 131_072);
  if (!/\b(?:RuView|wifi[- ]densepose)\b/i.test(readme)) throw new Error('Refusing CLI access: README does not identify a RuView checkout');
  return root;
}

View on GitHub (pinned to 4685618388)

Solutions

  1. Ensure README.md mentions 'RuView' (or 'wifi densepose'/'wifi-densepose') as a standalone word within its first 128 KiB.
  2. If you maintain a fork, add one line early in the README: 'Fork of RuView (WiFi-DensePose)'.
  3. Verify locally: head -c 131072 README.md | grep -icE '\b(RuView|wifi[- ]densepose)\b' should print >= 1.

Example fix

# before (README.md of your vendored copy starts with 'MyProduct docs...')
# after — add near the top of README.md:
# MyProduct — a fork of RuView (WiFi-DensePose).
Defensive patterns

Strategy: validation

Validate before calling

import { readFileSync } from 'node:fs';
const head = readFileSync(join(repoRoot, 'README.md'), 'utf8').slice(0, 131072);
if (!/\b(?:RuView|wifi[- ]densepose)\b/i.test(head)) {
  throw new Error('README does not identify a RuView checkout within the first 128 KiB');
}

Try / catch

try {
  await runCodex({ prompt, repoRoot });
} catch (e) {
  if (e instanceof Error && e.message.includes('README does not identify')) {
    throw new Error('trust gate: keep a standalone "RuView" or "wifi densepose" mention in the first 128 KiB of README.md');
  }
  throw e;
}

Prevention

When it happens

Trigger: A vendored/forked copy whose README was rebranded or replaced; the identity words appearing only beyond the first 128 KiB of a very long README; the words glued into a larger token (e.g. 'RuViewProject') so the \b boundary never matches.

Common situations: Rebranding the README without keeping the project identity; template READMEs that lead with badges/changelog for hundreds of KiB; downstream forks renaming the product everywhere.

Related errors


AI-assisted analysis of ruvnet/RuView@4685618388 (2026-08-16). Data as JSON: /api/errors/a8556916c50fdd28. Report an issue: GitHub.