affaan-m/ECC · warning
Skipping missing keys for
Error message
Skipping missing keys for [${tablePath}] because it has no standalone header and could not be safely updated What it means
appendToTable in merge-codex-config.js tries to append missing keys to a TOML table. When the table has no standalone header line in the file (so the safe in-place edit and the implicit-table fallback both fail), it warns and returns the file content unchanged, leaving the missing keys unmerged.
Solutions
- Open the Codex config file and manually add the missing keys under the named table
- Normalize the table so it has a standalone `[table.path]` header line on its own line
- Re-run the merge script to let it apply the keys automatically
- If the file is badly mangled, back it up, regenerate a minimal config, and re-run the merge
Example fix
# before (inline/ambiguous layout)
mcp_servers = { context7 = {...} }
# after (standalone header)
[mcp_servers.context7]
command = "npx"
args = ["-y", "@upstash/context7-mcp"] Defensive patterns
Strategy: validation
Validate before calling
// verify the target table header exists standalone before running the merge
if (!/^\[mcp_servers\.[\w.-]+\]\s*$/m.test(configText)) {
console.error('table header missing or inline; fix layout first');
} Prevention
- Use standard TOML layout with each table on its own [header] line
- Avoid inline tables ({...}) for sections the merge script manages
- Back up the config before manual restructuring
- Re-run the merge after edits to confirm no skip warnings
When it happens
Trigger: main calls appendToTable for a tablePath whose header cannot be located as a standalone line in the raw TOML text, and appendImplicitTable also returns falsy (e.g. the table path is nested or written in an unusual layout the safe editor cannot handle).
Common situations: A Codex config where the table is defined inside another structure or with inline syntax, a heavily hand-edited config, or a config generated by another tool with non-standard formatting.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- [ecc-codex] WARNING
- [ecc-mcp] WARNING
- mcp_servers. differs from ECC recommendation (run with…
- mcp_servers. is a legacy name for (run with --update-mcp to…
- Missing Codex PLUGIN_ROOT
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/af6cfb175535c58f.
Report an issue: GitHub.
Appendix: source
Thrown at scripts/codex/merge-codex-config.js:174
return null;
}
}
function appendToTable(raw, tablePath, block, missingKeys = null) {
const range = findTableRange(raw, tablePath);
if (!range) {
if (missingKeys) {
const inlineUpdated = updateInlineTableKeys(raw, tablePath, missingKeys);
if (inlineUpdated) {
return inlineUpdated;
}
const appendedTable = appendImplicitTable(raw, tablePath, missingKeys);
if (appendedTable) {
return appendedTable;
}
}
warn(`Skipping missing keys for [${tablePath}] because it has no standalone header and could not be safely updated`);
return raw;
}
const before = raw.slice(0, range.bodyEnd).trimEnd();
const after = raw.slice(range.bodyEnd).replace(/^\n*/, '\n');
return `${before}\n${block.trimEnd()}\n${after}`;
}
function stringifyRootKeys(keys) {
return TOML.stringify(keys).trim();
}
function stringifyTable(tablePath, value) {
const scalarOnly = {};
for (const [key, entryValue] of Object.entries(value)) {
if (entryValue && typeof entryValue === 'object' && !Array.isArray(entryValue)) {
continue;
}View on GitHub (pinned to 8321021c54)