Skip to content

Repository files navigation

Humanizer Grading

Best with fully local AI: Humanizer Grading works best when model inference and agent execution both happen on an instructor-controlled machine, without sending prompts or files to a remote model or telemetry service. Redaction stays on by default even in this fully local setup. A cloud model or cloud agent may be used only through the mandatory redaction path and when institutional policy permits it. This repository cannot verify the privacy behavior of a third-party model or agent runtime; the instructor must check that runtime separately.

Humanizer Grading is a package of agent skills and local Python tools. It is meant to be operated by an AI agent working with an instructor. It is not a hosted grading service, a standalone desktop app, or an autonomous grade publisher.

One-turn synthetic demo

The bundled PHIL 210 mock corpus supports one self-contained, narrated demo. Drop the grading_mock_papers folder into an agent conversation and say:

Run the Humanizer Grading demo using this folder.

The agent verifies the complete synthetic corpus before it creates a unique local run. It explains the calibration profile and rubric, redacts papers 6–10, grades only tokenized submissions, verifies every draft, checks batch consistency, rehydrates the synthetic feedback and reports the local draft path. Paper 10 is a useful primary example. The model makes the grading judgement; local scripts check evidence, arithmetic, required feedback sections and file bindings.

Automatic approval and redaction review apply only when every file matches the bundled synthetic manifest. The demo's profile carries a synthetic calibration approval, and its brief uses a demo-only review cadence, so the calibration, pilot, and consistency stops that every real course and batch require are skipped for that corpus alone. A changed or unknown folder is refused and returns to the supervised workflow. Demo output remains draft feedback, stays local and is never sent to an LMS. See references/demo.md for the agent procedure.

Instructor onboarding

Grading a course takes one calibration and then one supervised loop per assignment. Nothing in it runs unattended.

  1. Gather graded work. Four to ten papers you already graded, each with the essay, your comments, and your score, plus your rubric and roster.
  2. Build the packet. calibrate.py inputs keeps only your comments, scrubs every name, and writes blind copies of the one or two papers it holds back.
  3. Answer the interview. Where an A begins, what you never forgive, and three more. Your answers are recorded in the profile in your words.
  4. Grade the holdouts blind. The agent grades the held-back papers without seeing your feedback. calibrate.py holdout compares its grades and feedback with yours and writes a receipt.
  5. Read the report and approve. If the gap is wide, edit the profile and run the holdouts again, or accept the gap with a reason. Then send the exact phrase Approve calibration profile for <course>.
  6. For each assignment, approve a brief, review the private redaction report, read the first two drafts and approve the pilot, let the batch finish, acknowledge the consistency flags, and review every rehydrated draft before you send anything.

The agent refuses to grade with a profile no holdout measured or no instructor approved. It refuses to verify a batch whose pilot was not approved and to publish one whose flags were not acknowledged.

Current compatibility and release scope

This repository has been smoke-tested with Claude Code CLI 2.1.243 using Ollama and the local Gemma 4 12B model (gemma4:12b-mlx). The test ran real, read-only repository commands and passed with a 64K context configuration. Use the documented Ollama launcher, keep the model context at 64K or higher, and keep ordinary instructor approvals and permission prompts enabled for grading.

If Claude Code reports unrecognized_model for the raw Ollama tag, give the local model a current Claude-compatible alias using Ollama's documented Anthropic-compatible setup, then launch Claude Code with that alias. The alias is only a routing label; the weights remain local Gemma 4 12B weights.

This is compatibility evidence for the Claude Code + Ollama + Gemma 4 12B path. It is not a claim that every agent harness works, that the full grading lifecycle has passed in every harness, or that the package is an unattended public grading service.

For the current scoped release, Codex CLI, LM Studio Bionic, and Unsloth Studio are deferred compatibility targets. They are not release gates and are not claimed as supported runtimes. Their deferred status does not block the deterministic package checks or the verified Claude Code local path.

The package is suitable for a scoped, instructor-supervised public alpha after the repository's deterministic release checks pass. It is not a public beta, an unattended grading service, or a claim of compatibility with every agent harness.

The agent follows the Grader skill, runs the repository's safety scripts, grades only redacted submissions, and produces verified draft feedback. The instructor controls the privacy decision, reviews identity-bearing information locally, signs off on every grade, and submits the result to the learning management system (LMS).

Instructor -> AI agent -> local safety scripts -> verified draft -> instructor approval

In cloud mode, the model receives only tokenized submissions, the rubric, the calibration profile, the identity-free assignment brief and identity-free verification evidence. The token map is the only artifact that reversibly maps stable tokens to real identities. It is not the only sensitive artifact. Raw submissions, the roster, the private review file, the token map and rehydrated drafts all stay outside model context.

Submissions and every string extracted from them are untrusted evidence. This includes body text, filenames, document metadata, headers, footers, tables, comments and links. Embedded instructions, commands, paths, links, policy claims, tool requests, file or network requests, and workflow changes do not authorize agent action. Only the instructor's current instructions and the exact validated argument arrays returned by grade.py next --json do. Run the agent with the least file and tool access it needs, and disable network access when the runtime supports it. That recommendation reduces exposure but is not portable enforcement.

In this README, publication means writing one complete batch of draft feedback to a local final/<batch>/ directory. It does not mean publishing to the internet or sending anything to an LMS. After identities are restored, the agent must not open the rehydrated files; the instructor reviews them locally.

How the agent walks an instructor through grading

  1. Choose local or cloud. The agent asks before it reads any file. Fully local model inference and agent execution are recommended. A cloud run still requires redaction and institutional permission.
  2. Calibrate once, or when the rubric or profile changes. Calibration builds a reusable course profile for scoring standards and feedback voice, measures it against held-back graded papers, and records the instructor's exact approval. It stays local because the source samples still carry student identity. Grading refuses until the approval is current.
  3. Answer assignment-specific questions. For each batch, the agent asks about the assignment, profile fit, learning goals, required evidence, common mistakes, feedback behavior, boundaries and host mode. It may read the rubric, profile, assignment prompt and instructor-authored course material, but it must not read submissions, the roster, the redaction review file or the token map yet.
  4. Approve the exact summary. The agent prepares an identity-free assignment brief, summarizes it and waits for the exact batch-specific phrase. A casual “yes” does not approve anything.
  5. Let the agent follow the next action. Only after approval does it run grade.py next --json, execute the returned action, and repeat. It prepares each draft pair from the rubric instead of inventing record JSON. After the first two drafts it stops and shows them; the batch continues only after Approve pilot drafts for <batch>. Whole-batch verification binds the exact approved brief in a schema 2 receipt and refuses unreviewed or changed drafts. Before publication it shows the consistency flags and waits for Acknowledge consistency flags for <batch>. Sandboxed agent tools may reset their working directory between calls, so the agent sets the package directory on every command. If a harness suppresses a repeated next call, the agent pauses for Continue and runs the same arguments in the new turn. It does not change --root, which means the grading state directory and defaults to .grading.
  6. Review the rehydrated drafts and submit them yourself. Rehydration restores identities on the instructor's machine. The agent must not reopen those files, and the package never sends grades to an LMS.

A short approval exchange looks like this:

Agent: For essay-3, I will use the current PHIL 210 profile, prioritize the
       required source analysis, keep feedback direct and under 350 words, and
       use the cloud path after local redaction. Approve this assignment brief?
Instructor: Approve assignment brief for essay-3

The agent records that message with brief approve, then confirms it with brief check. Approval is workflow evidence, not a signature, human authentication or privacy permission. The instructor must approve again if the brief body, course, batch, host mode, purpose, review cadence, pilot size, rubric or calibration profile changes.

Who does what

AI agent Instructor
Loads the Grader or Humanizer skill Chooses local or cloud operation
Builds the calibration packet and grades the holdouts blind Supplies graded work, answers the interview, reads the holdout report, approves the profile
Prepares and checks an identity-free assignment brief Approves the exact batch summary and chooses the review cadence
Stops after the pilot drafts Reads the tokenized pilot drafts and approves them
Runs consistency and shows every flag Acknowledges the flags for the exact receipt
Runs next --json and only the returned grading actions Inspects the private review file outside the AI conversation
Reads only tokenized submissions from redacted/ Decides whether institutional policy permits cloud processing
Writes draft feedback and structured grade records Reviews, edits and signs off on every draft
Rehydrates a verified batch through the local script Submits approved grades or feedback to the LMS

Nothing in this repository logs into an LMS or sends a grade automatically. Every rehydrated feedback file remains a draft until the instructor approves it. It will not grade a batch without an approved calibration profile, a reviewed pilot or per-draft approvals, and an acknowledged consistency pass. The synthetic demo is the only exception.

Grading example

An instructor can ask an agent:

Grade the submissions in submissions/essay-2 with the PHIL 210 profile and rubric.
This is a cloud-model run.

The agent then follows this sequence:

  1. Confirm the course profile still matches the rubric.
  2. Ask the assignment-specific questions, prepare the identity-free brief and wait for Approve assignment brief for essay-2. Run brief approve and brief check only after that exact message.
  3. Run grade.py next --json and execute only its returned action. Repeat this after every action and after every non-zero lifecycle exit. Set the package directory for every command-tool call. If the harness deduplicates a repeated next, end the turn and rerun the same arguments after the instructor sends Continue; do not alter path values to make the command look different.
  4. Run local redaction when returned. Names, IDs and emails in submission text become stable tokens such as STUDENT_03, and output filenames use the attributed student token. Document metadata may help match a submission to the roster locally, but it is removed from model-visible output rather than converted into a model-visible token. The owner-only private review records the removed metadata. The first command runs without --reviewed and writes schema 3 evidence for the exact source, output, token map and private review file.
  5. Pause while the instructor inspects the private review file locally. The agent must never read that identity-bearing file. After confirmation, run the identical redaction command with --reviewed added and no --force. This approves the existing evidence without rereading the roster or submissions and without running redaction again.
  6. For each returned prepare-record action, generate the draft pair, read only that pending token under redacted/, and edit the generated Markdown and grade-record/1 JSON.
  7. Stop at review-pilot. Show the instructor the first two tokenized drafts and wait for Approve pilot drafts for essay-2. Run the returned review approve command only after that message. Under per-draft review, stop after every draft instead.
  8. Verify the whole grading batch. A missing, unapproved or stale brief, an unapproved or changed pilot draft, a failed quote, total, letter grade, feedback section, density measurement or file binding blocks publication.
  9. Stop at review-consistency. Run consistency, show the instructor every flag, wait for Acknowledge consistency flags for essay-2, then run the same command again with --acknowledge and that phrase.
  10. Rehydrate the verified drafts locally. Real names return only after the schema 2 receipt, approved brief, acknowledgement, redaction manifest, token map and output set all match.

For the repository's five-submission synthetic example, verification reports:

STUDENT_01: 0 errors, 0 warnings
STUDENT_02: 0 errors, 0 warnings
STUDENT_03: 0 errors, 0 warnings
STUDENT_04: 0 errors, 0 warnings
STUDENT_05: 0 errors, 0 warnings

All 5 drafts verified. Offsets and verification receipt written.

One rehydrated draft from that synthetic batch contains:

[This sentence carries the paragraph. Lead with it. (Evan Ramirez)]

**The Bottom Line**

Your argument holds. You named the mechanism instead of gesturing at it,
and the evidence you chose does real work.

**What Worked**

* Paragraph 2 does the analytical work the thesis promises.

**What to Work On**

* Give the strongest counterargument a full paragraph, not a clause.
* Name the statute or the case rather than describing it.

Come see me in office hours if you want to push this further.

— Dr. Vance

The instructor receives five rehydrated feedback drafts plus an identity-free publication marker. Grade-record JSON is not copied into the publication. The verified grade records remain under .grading/drafts/<batch>/, where the instructor can review the numeric scores and their supporting evidence. The rehydrated feedback files are local Markdown files under final/<batch>/. Their filenames stay tokenized, while real names are restored inside the feedback. The instructor reads each draft, makes any final edits, approves the numeric grade, signs off, and submits it.

Verified does not mean correct or approved. Verification proves that the draft follows the required structure and that its quotes, arithmetic, rubric, profile, density evidence and file bindings agree. The instructor still owns the academic judgement and final decision.

The other skill: Humanizer

Humanizer rewrites AI-sounding text so it reads like a person wrote it, without changing what it says. Because its skill instructions are Markdown, it works with any agent that supports skills. Its writing-focused before-and-after example appears later in this README.

This package builds on Siqi Chen's Humanizer, preserves its MIT license, and adds the identity-safe Grader skill.

Two skills in one package

This repo ships two skills. Humanizer rewrites AI-sounding text. Grader scores student work against an instructor's rubric and drafts feedback in that instructor's voice, using Humanizer's 35 patterns as its finishing pass.

Grader keeps student identity out of a cloud model's context. It replaces names, IDs and emails in submission text with stable tokens on your machine and names each output with the attributed student token. Document metadata may contribute to local roster attribution, but the model-visible copy does not contain that metadata or a tokenized version of it. The removed metadata is recorded only in the owner-only private review. Grader reattaches real names locally at the end.

Verification covers the whole grading batch and writes an identity-free schema 2 receipt. The receipt binds the exact approved assignment brief, redacted submissions, drafts, grade records, rubric, profile, redaction manifest and pattern reference that passed. Rehydration uses either a complete trusted context, including the brief path, or the complete context recovered from that receipt. It reruns semantic verification instead of trusting hashes alone and requires the token map's redaction-run ID to match the receipt-bound manifest. It stages every draft before publishing and leaves the destination unchanged if staging fails. Every rehydrated feedback file remains a draft pending instructor sign-off. --force only replaces an unchanged publication recognized by its identity-free marker; it refuses changed, unrelated or unrecognized output and uses a recoverable staged swap.

The short rehydration command may omit all six context options when a current schema 2 receipt can recover them. Otherwise pass the complete trusted context, including the assignment brief path. Do not mix a partial explicit context with receipt recovery.

/grade calibrate --course phil210      # learn the instructor's standards
/grade submissions/essay-3 --course phil210

For each batch, the agent runs the local assignment-brief commands before redaction. The human-readable course name can contain spaces (PHIL 210), but commands use its path-safe course key (phil210). The prepared CLI file is the only valid starting shape; an agent must confirm command success, file existence, and replacement of every answer marker before claiming the draft is saved.

python3 scripts/grade.py brief prepare \
  --batch essay-3 --course phil210 --mode local
# The agent fills the draft and waits for the exact instructor message.
python3 scripts/grade.py brief approve \
  --batch essay-3 --course phil210 --rubric grading_rubric.md \
  --approval "Approve assignment brief for essay-3"
python3 scripts/grade.py brief check \
  --batch essay-3 --course phil210 --rubric grading_rubric.md

After approval, the agent uses one executable loop:

python3 scripts/grade.py next \
  --batch essay-3 --course phil210 --rubric grading_rubric.md \
  --submissions submissions/essay-3 --roster roster.csv \
  --instructor "Dr. Vance" --publication final/essay-3 --json

When --publication is omitted, next uses that same batch-specific default: final/essay-3.

The result names one legal action and gives commands as argument arrays rather than shell strings:

{
  "schema": "grading-next-action/2",
  "batch": "essay-3",
  "course": "phil210",
  "stage": "drafting",
  "action": "prepare-record",
  "message": "Prepare the draft pair for STUDENT_01.",
  "token": "STUDENT_01",
  "tokens": [],
  "commands": [["python3", "scripts/grade.py", "record", "prepare"]],
  "findings": []
}

The displayed array is shortened here; the live command includes the exact batch, course, rubric, source and path options. The agent executes only the returned action, then runs next --json again. record prepare creates a valid, unfinished feedback-and-record pair together. Exit 12 means the current state requires repair; verification failures cannot advance to consistency or publication.

Redaction manifests now use redaction-batch/3. Schema 3 binds the exact source inventory, redacted outputs, token map and private review file by digest, along with the final redaction exit code and review state. The first run omits --reviewed. After the instructor privately reviews the bound review file, the identical command with --reviewed added approves that existing evidence. Do not add --force: approval does not reread the roster or submissions and does not run redaction again. A changed source, output, map, review file or command context blocks approval. Legacy schema 1 and schema 2 manifests are treated as unreviewed and are ineligible for grading; run a new schema 3 redaction first. Other non-zero exits return repair-redaction, and review cannot make a failed redaction advance. Starting a new safe attempt first invalidates any regular same-batch clean manifest, so roster or input failures cannot leave earlier success eligible for grading. It rechecks the bound manifest immediately before atomic replacement, so a late replacement or hard link is left untouched. If invalidation cannot be completed, redaction stops with an unsafe-path failure before it loads the roster or processes submissions.

docs/using-the-grader.md is the full walkthrough — calibration, a graded batch end to end, the core command and exit-code reference, and what the tool deliberately does not do. Synthetic runs covered calibrate.py inputs, holdout, approve and check; grade.py profile, brief, next, record prepare, review, status, verify and consistency; plus redact.py and rehydrate.py. The lifecycle output shown comes from that synthetic work. The conformance run and audit commands have been exercised only against the synthetic trial fixture.

Read references/redaction.md before sending anything to a cloud model. Pseudonymization is not anonymization, and your institution's policy decides whether student work may leave your machine.

The optional hook

Grader's read rules are instructions in SKILL.md, and a model can violate an instruction. hooks/block-raw-reads.json is a PreToolUse hook that blocks common direct reads of submissions/, the token map, the review file, and the roster. It is defense against accidents and instruction drift, not an adversarial sandbox.

It is opt-in. Merge it into .claude/settings.json yourself:

cat hooks/block-raw-reads.json   # then merge the "hooks" key into your settings

It is Claude Code specific, and Grader works without it. Its Bash check matches command strings, so it stops accidents and instruction drift, not a determined bypass.

Synthetic agent conformance

scripts/agent_conformance.py can launch a command-line agent against the shipped synthetic fixture or audit an existing synthetic workspace:

python3 scripts/agent_conformance.py run \
  --runtime local-agent \
  --command-json '["local-agent", "--prompt", "{prompt}"]' \
  --timeout 300

python3 scripts/agent_conformance.py audit \
  --runtime local-agent \
  --workspace /tmp/humanize-grading-agent-e2e

Read references/agent-conformance.md before a trial. Reports use grading-agent-conformance/1 and score commands, time, artifacts, lifecycle exits and available read traces. Deterministic artifacts cannot prove what an agent read. A trial without a usable read trace is UNVERIFIED, even when every artifact and lifecycle check passes. These interfaces do not claim support for any agent runtime or model before a live retest records that exact combination.

How it works

Humanizer uses 35 patterns from Wikipedia's "Signs of AI writing", maintained by WikiProject AI Cleanup. It makes a first pass without treating the original structure as fixed. Then it checks the draft against those patterns and the original claims before rewriting whatever still needs work.

"LLMs use statistical algorithms to guess what should come next. The result tends toward the most statistically likely result that applies to the widest variety of cases."

It does not make things up. A name, number, date, quote, citation, or other factual detail must come from the source or the writer. For personal writing, Humanizer keeps the writer's style. Technical and reference prose stays neutral and plain. If you provide a writing sample, Humanizer follows that sample instead of its default style rules.

When you paste text, Humanizer shows its work before giving you the final version. You see the first rewrite and a short critique of anything that still sounds artificial. Point it at a file and it changes only the prose, leaving code, data, frontmatter, and link targets alone.

Usage

Call the skill directly:

/humanizer

[paste your text here]

Or ask in plain language:

Please humanize this text: [your text]

To rewrite a file, give Humanizer its path:

Humanize the prose in docs/launch-post.md

Match your voice

If you want the rewrite to sound more like you, include a sample:

/humanizer

Here's a sample of my writing for voice matching:
[paste 2-3 paragraphs of your own writing]

Now humanize this text:
[paste AI text to humanize]

Humanizer follows the sample's rhythm, word choice, punctuation, and deliberate quirks.

The 35 patterns

Content patterns

# Pattern Before After
1 Inflated importance and legacy "marking a pivotal moment in the evolution of..." "was established in 1989 as part of a wider decentralization"
2 Name-dropping to prove importance "cited in NYT, BBC, FT, and The Hindu" Keep only useful, sourced context
3 Shallow -ing analysis "symbolizing... reflecting... showcasing..." Keep only what the source supports
4 Sales language "nestled within the breathtaking region" "is a town in the Gonder region"
5 Vague sources "Experts believe it plays a crucial role" Name a real source or remove the claim
6 Formulaic challenges and outlook "Despite challenges... continues to thrive" Keep the facts and remove the sales pitch

Language and grammar patterns

# Pattern Before After
7 Overused AI words "Actually... additionally... gated on... quietly... testament... landscape... showcasing" "also... needs... remain common"
8 Avoiding is and are "serves as... features... boasts" "is... has"
9 Not X but Y and clipped endings "It's not just X, it's Y", "..., no guessing" State the point directly
10 Forced groups of three "innovation, inspiration, and insights" Use the number of items the meaning needs
11 Changing names and repeated openings "protagonist... main character... hero" or "She noted... She noted... She filed..." Use one name or merge the repeated sentences
12 False from X to Y ranges "from the Big Bang to dark matter" List the topics directly
13 Passive voice and missing subjects "No configuration file needed" Name the actor when that helps

Style patterns

# Pattern Before After
14 Em/en dashes "institutions—not the people—yet this continues—" Cut them: periods, commas, colons, or parentheses
15 Too much bold text "OKRs, KPIs, BMC" "OKRs, KPIs, BMC"
16 Lists with bold mini-headings "Performance: Performance improved" Use prose when a list adds no value
17 Title case in headings "Strategic Negotiations And Partnerships" "Strategic negotiations and partnerships"
18 Emojis "🚀 Launch Phase: 💡 Key Insight:" Remove emojis
19 Curly quotes said “the project” said "the project"
26 Too many hyphenated word pairs “cross-functional, data-driven, client-facing” Keep only the hyphens grammar needs
27 A fake deeper truth "At its core, what matters is..." State the point directly
28 Announcing the next point "Let's dive in", or "one thing that bit me" Start with the content
29 A heading repeated below itself "## Performance" + "Speed matters." Let the heading do the work
30 Writing about the old version "This function was added to replace..." Describe what it does now
31 Forced punchlines and fragments "It had no preference. No prior. No nostalgia." Use natural sentence lengths and specific claims
32 Formulaic sayings "Symmetry is the language of trust" State the specific claim
33 Fake-candid openings "Honestly? It depends..." State the answer directly
34 Answering objections no one raised "This isn't mainly about prompt length..." Remove the unsupported defense and keep any real claim
35 Rejecting fake alternatives "A tempting option would be to..., but" Remove the fake option and keep real choices

Chatbot patterns

# Pattern Before After
20 Chatbot text left in the answer "I hope this helps! Let me know if..." Remove it
21 Knowledge-limit disclaimers and guesses "While details are limited in available sources..." State what is known or remove the claim
22 Overly agreeable tone "Great question! You're absolutely right!" Answer directly

Filler and hedging

# Pattern Before After
23 Filler phrases "In order to", "Due to the fact that" "To", "Because"
24 Too many qualifiers "could potentially possibly" "may"
25 Generic positive endings "The future looks bright" End with a fact or a sourced plan

Full example

For this synthetic example, assume the writer supplied separate notes that are not shown here. Those notes contain every factual and personal detail that appears only in the After text, including the dates, neighborhoods, hotel, tram ride, pastry stop, street scene, castle queue and preferred return season. Humanizer does not infer those details from the Before text. Without the notes, it would have to ask instead of making them up.

Before (AI-sounding):

I recently spent five unforgettable days in Lisbon, and let me tell you — this city completely stole my heart. From the moment I arrived, I knew I was somewhere truly special.

Nestled along the banks of the Tagus River, Lisbon stands as a vibrant testament to Portugal's enduring spirit, where rich history and modern energy intertwine at every turn. Yes, the famous hills are challenging — my legs certainly felt it! — but every climb rewards you with breathtaking, panoramic views that make it all worthwhile.

No trip would be complete without riding the iconic Tram 28, winding through the city's most historic neighborhoods. And the food? Simply divine. The original pastéis de nata at Pastéis de Belém are a beloved national treasure, and savoring one still warm was a moment I will never forget.

But what truly makes Lisbon special isn't just the sights — it's the feeling. Wander a few steps off the main squares and you'll discover a quieter, more authentic side: sun-drenched alleys, charming tiled facades, and friendly locals going about their daily lives, inviting you to slow down and savor every moment.

Of course, the must-see São Jorge Castle offers stunning views over the rooftops below. The queues can be long, but the experience is absolutely worth it for any history buff or curious traveler.

Would I go back? Absolutely. Lisbon isn't just a place to visit — it's a place to fall in love with, again and again. If you're dreaming of your next getaway, this is one destination that promises memories to last a lifetime. ✨

After:

I spent five days in Lisbon last October and still have mixed feelings about it. Beautiful, yes. Also harder on the knees than anyone warned me.

The hills are the whole story and somehow never make the brochures. My hotel was up in Alfama, which photographs beautifully and translates, in practice, to climbing what felt like a six-story staircase every time I wanted coffee. By the second day my calves had opinions. I started planning each walk around which way was downhill, which is a strange way to see a city but probably an honest one.

Everyone says to ride Tram 28, so I did, wedged against a stranger's backpack for forty minutes while three tour groups filmed the same corner. I would walk the route next time, or go before breakfast. The custard tarts, though, earn the fuss. I had one at a plain little place in Graça, still warm, and for about thirty seconds I understood why people build trips around pastry.

What I did not expect was how quiet the city gets away from the main squares. Two blocks uphill from any plaza it turns into laundry lines, chipped tile, open windows, and old men watching football with the sound turned up. That is the Lisbon I keep thinking about, not the castle.

The castle is fine. The view is great, the queue is long, and I spent more time shuffling toward the entrance than looking at anything once I got inside. If I had only two days, I would trade it for an afternoon of getting lost.

I would go back, but in spring and with better shoes. Lisbon does not bend over backward to make things easy for you. I think I liked that, even when my legs disagreed.

Sources

Version history

Show release notes
  • 3.6.0 — Calibration is now a gate. calibrate.py inputs holds back one or two graded samples, and two when six or more are supplied, and writes blind copies for a holdout batch. calibrate.py holdout measures every holdout against the profile's tolerances, reports aggregate agreement, and writes an identity-free receipt; exit 15 records a gap. calibrate.py approve binds the instructor's exact phrase to the profile, rubric, and receipt, with --accept-gap --reason for a recorded exception, and calibrate.py check reports the state. Profiles require an Instructor answers section and accept Point tolerance and Length tolerance headers. Assignment briefs move to schema 2 with purpose, review cadence, and pilot size; schema 1 briefs must be prepared again, and grading briefs cannot be approved until calibration is. Drafting stops at the pilot, two drafts by default, or after every draft; grade.py review approve records the exact phrase bound to the drafts' digests, and verification refuses unreviewed, changed, or over-pilot drafts. Consistency is separate from publication: grade.py consistency --acknowledge binds the instructor's acknowledgement to the receipt, and publication refuses without it. grade.py next emits grading-next-action/2 with the new stops, grade.py profile exits 14 until calibration is approved and warns when a profile is old or heavily used, and a holdout batch can never publish. The synthetic demo and conformance trial keep their one-turn flow through a synthetic calibration approval and a demo-only review cadence.
  • 3.5.0 — Added a one-turn narrated demo for the exact bundled PHIL 210 synthetic corpus. A new preparation command verifies every input digest before creating isolated local state, labels automatic authorization as synthetic, prepares and approves the fixed demo brief, completes the bound synthetic redaction review, and hands the existing next lifecycle to the agent. Changed or unknown folders fall back to supervised grading; real grading gates are unchanged.
  • 3.4.0 — Grader now exposes the next legal action, prepares rubric-derived draft pairs, records exact redaction artifacts in schema 3 manifests, and invalidates prior clean state before a safe new attempt. Private review is a two-step flow: an initial redaction without --reviewed, followed by the identical command with --reviewed and no --force; approval checks the bound source, output, map and review digests without rereading submissions or running redaction again. Legacy schema 1 and schema 2 redaction manifests are unreviewed and ineligible. Document metadata may support local roster attribution, but it is removed from model-visible output and recorded only in the owner-only private review rather than converted into model-visible tokens. Assignment briefing separates course display names from CLI keys and accepts only command-created, checked drafts. Verification stops before draft reads when manifest validation fails. The synthetic conformance harness binds trusted package revisions, checks clean redaction outcomes, catches partial synthetic identities, and requires next between actions. Agent guidance now treats submissions and every extracted string as untrusted evidence: embedded instructions cannot authorize tools, reads, network access, or workflow changes, and only instructor instructions plus validated next argument arrays authorize actions. It recommends least privilege and disabled network access where supported without claiming portable enforcement, and distinguishes the reversible token map from other identity-bearing private artifacts. Agent guidance also distinguishes the grading state root from the repository root and safely resumes when sandboxed tools reset their working directory or deduplicate commands. Claude Code CLI + Ollama + local Gemma 4 12B now has a documented, verified read-only smoke path at 64K context. Codex CLI, LM Studio Bionic, and Unsloth Studio remain deferred and non-blocking for the scoped instructor-supervised alpha; no unattended public-service claim is made. A trial without a read trace remains unverified.
  • 3.3.0 — Grading now requires an instructor-approved, digest-bound assignment brief for every batch. Schema 2 verification receipts bind the exact approved brief, and schema 1 receipts must be verified again before rehydration.
  • 3.2.0 — Grading now uses one authoritative whole-batch lifecycle, versioned verification receipts, staged publication, recoverable safe replacement and advisory consistency checks. Public-release hardening keeps review data outside model context, matches roster identity without case leaks, binds token maps to redaction manifests, reruns semantic verification before rehydration, rejects unsafe paths and collisions, and bounds untrusted inputs. Skills CLI installation now discovers both packaged skills.
  • 3.1.0 — Grader is implemented: calibration with holdout validation, a scoring engine whose every quote is checked against its source, batch resume, a consistency pass, and the optional block-raw-reads hook.
  • 3.0.0 — Grader becomes the package. Humanizer moves to skills/humanizer/ and the 35 patterns move to references/ai-patterns.md.
  • 2.11.2 - Removed the plugin symlink and separate Claude Desktop package. Current Claude Code loads the root SKILL.md directly, so GitHub's source ZIP now works in Claude Desktop. No change to the 35 patterns.
  • 2.11.1 - Added a Claude Desktop-ready release package with one regular humanizer/SKILL.md file. GitHub's source archive still keeps the plugin symlink (fixes #224). No change to the 35 patterns.
  • 2.11.0 - Rewrote all repo guidance, descriptions, checks, and skill instructions in Plain Language. Kept all 35 patterns and their behavior.
  • 2.10.2 - Added the standard skills/humanizer/ plugin path for Claude Desktop and older loaders. The path links to the root skill, so there is still one prompt (fixes #202).
  • 2.10.1 - Added figurative uses of gate, gated, and gating to §7. Kept real technical uses, such as feature gating and CI quality gates.
  • 2.10.0 - Added patterns #34 and #35 for old drafting ideas left in final text. Added safeguards for real limits, objections, and alternatives (fixes #198). Also improved §24 and the final rewrite step. 35 patterns total.
  • 2.9.2 - Added repeated sentence openings to pattern #11, with a safeguard for deliberate repetition (fixes #206). Expanded §28 to cover casual announcements. 33 patterns total.
  • 2.9.1 - Improved installation and package checks. Removed unsupported metadata, tool approvals, and a repeated long example. 33 patterns total.
  • 2.9.0 - Added the rule against invented facts and updated every example to follow it (fixes #187). Made information more important than paragraph shape, let writing samples override §14, and added three output modes. 33 patterns total.
  • 2.8.3 - Moved the version to metadata.version for Agent Skills compatibility. 33 patterns total.
  • 2.8.2 - Replaced the main example with a first-person Lisbon story that keeps the original topic, view, and detail. 33 patterns total.
  • 2.8.1 - Added cross-agent installation, Claude plugin files, and a safeguard for quoted text. 33 patterns total.
  • 2.8.0 - Added patterns #31-33 and expanded pattern #20 to catch chatbot offers. 33 patterns total.
  • 2.7.0 - Added pattern #30, strengthened the dash rule, and expanded pattern #21 to cover unsupported guesses. 30 patterns total.
  • 2.6.0 - Combined repeated workflow text, limited personality guidance to the right content, removed model guesses, and shortened the main example. 29 patterns total.
  • 2.5.1 - Added passive voice and missing subjects. 29 patterns total.
  • 2.5.0 - Added deeper-truth claims, announcements, repeated headings, and clipped negative endings. Tightened the dash rule and corrected the frontmatter. 28 patterns total.
  • 2.4.0 - Added writing-sample matching.
  • 2.3.0 - Added hyphenated word pairs.
  • 2.2.0 - Added a draft check and second rewrite.
  • 2.1.1 - Corrected the curly-quote example.
  • 2.1.0 - Added before/after examples for all 24 patterns.
  • 2.0.0 - Rewrote the skill from the Wikipedia source.
  • 1.0.0 - First release.

License

MIT

Installation

Install Grader and Humanizer with the Skills CLI:

npx skills add johnnyrobot/humanize-grading --full-depth --global

The root Grader skill otherwise shadows the nested Humanizer skill during discovery, so this two-skill package requires --full-depth. Leave off --global to install the skills only in the current project. Add --skill grader or --skill humanizer to install one of them. Add --agent <name> or --agent '*' to choose which agents receive them, then reload their skills.

Claude Code 2.1.142 or newer can install the plugin instead:

/plugin marketplace add johnnyrobot/humanize-grading
/plugin install humanizer@humanizer

The plugin command is /humanizer:humanizer.

In Claude Desktop, download this repository as a ZIP and upload it as a skill.

For a manual install, keep the repository layout and load both SKILL.md and skills/humanizer/SKILL.md so they can share the reference files.

About

Humanizer prose rewriting and identity-safe rubric grading agent skills

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages