Skip to the content.

CNL Authoring Rules for Weak Models

AgentFS was developed and tested primarily with Claude Opus 4.6. Weaker models (Granite 8B, Qwen3-14B) show degraded rule compliance — not from misunderstanding rules, but from rules that require too much parsing effort before the model can act on them.

Controlled Natural Language (CNL) principles — drawn from ASD-STE100 (Simplified Technical English) — reduce parsing ambiguity and lower the cognitive bar for instruction following.

The Three Authoring Rules

These are codified in skill-gen SKILL.md Principle 1 checklist (v3.7.1+) and the AGENTS.md rule format mandate in design-spec.md (v7.3.5+).

1. One Instruction Per Sentence

Each sentence in a procedural step states exactly one action.

Before (compound):

On session start, read .agents/memories/USER.md if it exists — apply preferences.

After (split):

  1. Read .agents/memories/USER.md. Apply any preferences found.

Split sentences that contain “and”, “then”, or “also” into separate lines. No compound instructions.

2. Active Imperative Voice

All action steps use active imperative mood.

❌ Avoid ✅ Use
“The canary should be emitted” (passive) “Write a random two-word canary” (imperative)
“You may want to call search_nodes” (modal hedging) “Call search_nodes with the keywords” (direct)
“A plan needs to be stated” (passive) “State what you will do” (imperative)

3. Single Vocabulary

One term per concept throughout a skill or rule set. Do not mix synonyms.

❌ Mixed ✅ Consistent
rules / guardrails rules
emit / produce / generate write
session / conversation session
Session begins / session start / turn 1 Turn 1

Structural Rule: Numbered Do: Blocks

When an AGENTS.md rule’s Do: block contains two or more distinct actions, express them as a numbered list. No multi-action prose paragraphs.

Before:

**Do:** On session start, read USER.md if it exists — apply
preferences. Start your response with a random two-word canary.
The canary is ephemeral — do not write it anywhere. Re-verify
every 10 turns.

After:

**Do:**
1. Read `.agents/memories/USER.md`. Apply any preferences found.
2. Write a random two-word canary at the top of your response.
   Use this format: `🐦 word-word` (example: `🐦 cobalt-heron`).
3. Keep the canary in memory for this session. Do not write it
   to any file.
4. On every 10th turn and after every compaction: re-read
   `MEMORY.md` and `USER.md`. Run a silent self-check against
   all rules. Report only if you find a violation.

What CNL Fixes vs. What It Doesn’t

CNL Fixes CNL Does Not Fix
Ambiguous instructions with multiple valid readings Attention degradation at context depth
Synonyms that split the model’s probability mass Generation prior conflicts (e.g., social greeting overriding canary rule)
Complex sentences with embedded conditionals Competing priors from pretraining
Hedging language that weakens imperative force Model executing instructions it understands but doesn’t attend to

CNL is a parsing intervention. Generation prior conflicts require structural interventions (hooks, prefill, role separation).

Where to Apply (Priority Order)

Priority Target Rationale
High AGENTS.md rules with known failure rates Direct measurable impact on compliance
High SKILL.md procedural steps Weaker models over-tool when prose is ambiguous
Medium SOUL.md principles Already close to CNL; structured bullet format helps
Low Memory files, logs Agent-authored; model is reader and writer

Harvested From

Project Source Entry
context-eng Session: AgentFS Evolution Analysis of Session Canary rule failure on Qwen3-14B; CNL rewrite of rule 4; codification in skill-gen v3.7.1 and design-spec v7.3.5
context-eng Session: AgentFS Evolution ASD-STE100 assessment: full compliance adds 20-40% token overhead; selective application recommended
goofing-around Session: Test qw14b-40k Baseline violation data showing the prose rule was parseable but not acted on

Implications