feat(edit-writing-with-jev): add Jev writing-tell detection, calibration, and rewrite skill - #187
devin-ai-integration[bot] wants to merge 3 commits into
Conversation
…ion, and rewrite skill Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
Original prompt from Kenny
|
…ields, tighten stiff_register Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
Fresh-agent dry run of all six steps passed against live Jev and the default writer on 7eeae30, and the gaps it found are fixed in 3a50717. Fixed in 3a50717
Proof
|
…kipedia's Signs of AI writing Replace the blanket markdown_syntax pattern with bold_overuse, inline_header_list, thematic_break, title_case_heading, and placeholder_text. Add a structure section (title_heading, multiple_h1, skipped_heading_level, empty_heading, small_table) evaluated over the whole draft, including held-out tables. Widen citation_artifact to the Gemini, DeepSeek, Grok, Perplexity, and Copilot markers and the GPT-4o era vocabulary. Add elegant_variation and section_summary propositions. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Summary
Packages the Jev editing loop from openrouter-web#44634 (blog) and openrouter-web#44308 (cookbook) as an installable skill, and adds the human-in-the-loop calibration step those posts describe but do not automate.
SKILL.mdfollows the writing-for-agents structure (ordered steps, each ending on a Done when criterion, reference material behind pointers).Flow the agent runs
task), andrubric.jsonis copied into a working dir.evaluate.tsprints findings plusnear_misses(noul answers within--marginunder the threshold) and writes every raw probability toanswers.json.probe.tsasks Jev about one passage with--check <id>or an ad hoc--instructions(returned ascandidate) so wording is tested before it is saved. Re-evaluate, repeat until the user accepts the list.rewrite.tsruns the evaluate → writer → evaluate loop and reportsstopped: clean | rounds | length.Rubric coverage vs. Wikipedia: Signs of AI writing
The cookbook rubric covered the Content and Language sections. This PR adds the Style, Communication, and Markup signs that apply to a Markdown draft, and leaves out the wiki-only ones (wikitext, template and category names, citation validity, edit summaries, talk-page behavior, AfC).
puffed_significance,canned_notability,tacked_on_analysis,promotional_tone,weasel_attribution,challenges_boilerplate,neutralityai_vocabulary(list extended with the GPT-4o era words),copula_avoidance,vague_association,negative_parallelism,rule_of_three_flourishtitle_heading,title_case_heading,empty_heading,bold_overuse,inline_header_list,dash,emoji,small_table,curly_quotes,skipped_heading_level,multiple_h1,thematic_breakassistant_voice_leak,knowledge_gap_speculation,placeholder_textutm_source)markdown_syntaxpattern is gone.citation_artifactnow matches every listed marker andreferrer=grok.comsection_summary,elegant_variation,paddingDifferences from the cookbook code worth knowing
rubric.json), not constants, so calibration is a file edit. The scripts validate its shape and fail closed on missing or mistyped Jev answers.paragraph_scopepreamble prepended to every paragraph proposition. Without it Jev judged the wholearticlefor some checks; on the test draft a three-word lead-in paragraph firedpassive_voiceat 0.85 because a later paragraph was passive. With the preamble it read 0.06. The scoping sentence that lived only insidemannered_prosemoved here.structurerubric section for checks that need the whole draft:lintStructure(body, held, rubric)walks the heading list fortitle_heading(H1 equal to the front mattertitle),multiple_h1,skipped_heading_level,empty_heading(level 2+ followed by a heading or EOF), and inspects held-out tables forsmall_table(three or fewer non-separator rows). Itsfixnames the[[HELD_n]]line and carries the cells, and the writer prompt now allows replacing a held line when an instruction names it. The check stops firing once the token is gone from the body.[[HELD_n]]paragraphs (skipped by lint and Jev, told to the writer to copy through) and restored on output, so the length check counts prose only.<task>/<article>/<instructions>(user) per the cookbook's injection note. Findings are sorted by location since paragraph evaluation is concurrent (pool of 8).stiff_registeronly fires when the paragraph has a full form that could be contracted (the dry run showed it firing on plain past-tense narration).tsx-onlypackage.json.Validation
tsc --noEmit --strictclean on all four scripts.evaluate.tsproduced 18 findings and 4 near misses,probe.tsconfirmed the scope fix above,rewrite.tswithopenai/gpt-6-astrastoppedlengthafter 2 rounds (18 → 3 findings, held-out blocks restored byte-for-byte).npm install, including both calibration branches and four negative paths, reachedstopped=clean. Details and the fixes it prompted are in the PR comment below.stopped=roundswas not exercised.48465aa): a synthetic draft seeded with every new sign fired all 13 new checks at the expected locations offline. Probes onelegant_variationread 0.89 on a synonym-rotating paragraph and 0.08 on the same paragraph with pronouns, andsection_summaryread 0.90 on an "In summary" closer and 0.08 on a next-steps closer. A one-roundrewrite.tson the synthetic draft replaced the two-row table with a sentence and cleared the other 14 findings.Link to Devin session: https://openrouter.devinenterprise.com/sessions/c34d613248034f6b80365e2163bb2cfb
Open in Devin Desktop: https://openrouter.devinenterprise.com/desktop/session/c34d613248034f6b80365e2163bb2cfb?variant=devin