# How Humanizer Detects Passive Voice and Missing Subjects Using Pattern 11

> Humanizer uses Pattern 11 to detect passive voice and missing subjects with prompt-based matching, offering corrections without external parsers. Learn how.

- Repository: [Siqi Chen/humanizer](https://github.com/blader/humanizer)
- Tags: deep-dive
- Published: 2026-09-13

---

**Humanizer detects passive voice and missing subjects through Pattern 11 in its SKILL.md catalog, using prompt-based pattern matching rather than external parsers to identify constructions like "are/was...by..." and subjectless sentences.**

The blader/humanizer repository treats robotic text patterns as declarative rewrite rules that work consistently across CLI tools, Claude plugins, and OpenAI-compatible agents. When the system encounters passive constructions or omitted subjects, it applies Pattern 11's watch-for cues to generate active-voice alternatives with explicit actors.

## Detection of Passive Voice and Missing Subjects

Humanizer does not rely on grammatical analysis libraries or separate parsing engines. Instead, detection logic is encoded directly in the skill prompt metadata within [`SKILL.md`](https://github.com/blader/humanizer/blob/main/SKILL.md).

### Pattern 11 Implementation in SKILL.md

In [`SKILL.md`](https://github.com/blader/humanizer/blob/main/SKILL.md), Pattern 11 is explicitly described as "Passive voice and missing subjects" between lines 86-92. Each pattern in the catalog contains three components:

- **Watch-for**: Descriptions of target constructions (e.g., hidden actors, "are/was ... by ..." phrases, sentences starting with verbs but lacking explicit subjects)
- **Problem**: A statement explaining why the pattern represents an "AI tell"
- **Before/After examples**: Concrete transformations showing the rewrite target

When the skill receives text, it scans every sentence against the *Watch-for* criteria defined in Pattern 11. Because this logic lives in the prompt itself, the detection works identically whether invoked via CLI, embedded tool, or API.

### Watch-For Cues and Pattern Matching

The system identifies passive voice by scanning for specific linguistic markers that obscure the actor. These include constructions where the subject is hidden behind auxiliary verbs, sentences using "by" phrases to introduce actors indirectly, and fragments that begin with verbs but lack explicit subjects. This pattern matching occurs without external dependencies, leveraging the declarative rules stored in the skill definition.

## Generating Corrections for Passive Constructions

Once Pattern 11 identifies a match, Humanizer generates corrections by applying the transformation rules defined in the pattern's *After* examples.

### Active Voice Rewrites

The correction mechanism transforms passive constructions to make the actor explicit. For example, when processing the text "The results are preserved automatically," Humanizer identifies the hidden actor and produces: "The system preserves the results automatically."

This transformation occurs as part of the final edited output, alongside any other detected tells from the catalog.

### Cross-Platform Consistency

Since the detection and correction logic resides in [`SKILL.md`](https://github.com/blader/humanizer/blob/main/SKILL.md) rather than code dependencies, Pattern 11 functions consistently across:

- **CLI usage**: Direct command-line invocation
- **Claude plugin**: Integration with Claude desktop applications
- **OpenAI agents**: Compatible agents loading via [`agents/openai.yaml`](https://github.com/blader/humanizer/blob/main/agents/openai.yaml)

## Implementation Files and Validation

The repository includes [`scripts/validate-package.py`](https://github.com/blader/humanizer/blob/main/scripts/validate-package.py) to ensure pattern numbering in [`SKILL.md`](https://github.com/blader/humanizer/blob/main/SKILL.md) remains synchronized with the skill metadata. This validation prevents drift in Pattern 11's definition across releases. The [`README.md`](https://github.com/blader/humanizer/blob/main/README.md) at line 186 documents the addition of passive-voice support in the version history, while [`agents/openai.yaml`](https://github.com/blader/humanizer/blob/main/agents/openai.yaml) provides the metadata structure for AI service integration.

## Practical Usage Examples

### Direct Skill Invocation

When using Humanizer with OpenAI-compatible agents, passive voice detection triggers automatically:

```text
User:
"The results are preserved automatically."

Humanizer response:
"You do not need a configuration file. The system preserves the results automatically."

```

### Claude Plugin Integration

```json
{
  "prompt": "Rewrite the following text to remove AI tells:\n\nNo configuration file needed. The results are preserved automatically.",
  "model": "humanizer"
}

```

Result:

```text
You do not need a configuration file. The system preserves the results automatically.

```

### CI Pipeline Embedding

You can verify Pattern 11 application in automated workflows:

```bash
npx skills add . --list | grep "Passive voice"

# → Pattern 11 will be applied to any matching sentences in the scanned files.

```

## Summary

- Humanizer detects passive voice and missing subjects through **Pattern 11** in [`SKILL.md`](https://github.com/blader/humanizer/blob/main/SKILL.md), not external parsers or NLP libraries.
- The system uses **watch-for cues** in the prompt metadata to identify constructions like "are/was...by..." and subjectless sentences.
- Corrections follow **before/after examples** to transform passive voice into active voice with explicit actors.
- Detection works consistently across **CLI, Claude plugins, and OpenAI agents** without additional runtime dependencies.
- [`scripts/validate-package.py`](https://github.com/blader/humanizer/blob/main/scripts/validate-package.py) ensures pattern numbering integrity across releases, while [`agents/openai.yaml`](https://github.com/blader/humanizer/blob/main/agents/openai.yaml) defines the agent interface.

## Frequently Asked Questions

### How does Humanizer detect passive voice without a grammatical parser?

Humanizer encodes detection rules directly in the SKILL.md prompt as Pattern 11. The system scans for specific linguistic cues—such as "are/was...by..." constructions or sentences lacking explicit subjects—defined in the **Watch-for** clause. This prompt-based approach eliminates the need for external NLP libraries or syntactic parsers.

### Where is Pattern 11 defined in the source code?

Pattern 11 occupies lines 86-92 in [`SKILL.md`](https://github.com/blader/humanizer/blob/main/SKILL.md), where it is formally described as "Passive voice and missing subjects." The [`scripts/validate-package.py`](https://github.com/blader/humanizer/blob/main/scripts/validate-package.py) file ensures this pattern number remains synchronized with the skill's metadata catalog, preventing detection drift across versions.

### Can Pattern 11 be used in continuous integration pipelines?

Yes. Humanizer supports CI integration through the `npx skills add` command. Running `npx skills add . --list | grep "Passive voice"` confirms Pattern 11 is active, and the skill automatically applies corrections to matching sentences in scanned files during automated checks.

### Does Humanizer require additional dependencies for passive voice detection?

No additional runtime dependencies are required. Because Pattern 11's logic lives entirely within the SKILL.md prompt, the detection and correction capabilities work wherever the skill is invoked—whether via CLI, embedded tools, or AI service plugins—without installing grammatical analysis libraries.