canvas-awkward-syntaxlisted
Install: claude install-skill X-isdoingreat/canvas-pilot
# canvas-awkward-syntax
Create one direct structural rewrite per eligible sentence. This is a bounded
humanizing pass for short drafts, not permission to degrade rubric-critical
language or fabricate content.
## Inputs and boundaries
Require:
- `draft_path`, `output_path`, and `voice_register`;
- `course_id`, `assignment_id`, and stable assignment `work_dir`;
- assignment spec/rubric anchors and optional hard locks;
- optional role overrides for ambiguous sentences.
Require `work_dir` to end in
`course-<course_id>__assignment-<assignment_id>`. Keep the original and write
`awkward_log.json` beside the output.
Validate the path against `src.course_artifacts.stable_work_dir` before writing.
This skill reads and writes local files only. It never calls Canvas or another
learning platform, never writes assignment `result.json`, and never declares a
submission ready.
## Required helpers
Use the existing symbols:
```python
from src.humanizer_segmentation import split_sentences
from src.humanizer_segment_extract import extract_locks
from src.awkward_transformation_assigner import (
ROLE_ALLOWLIST,
assign_transformations,
contains_banned,
validate_transformation,
write_assignment_report,
)
```
Do not duplicate the role allowlist or balancing solver in prose code.
## Stage 1: segment, lock, and infer roles
Split before masking. Preserve `(doc_paragraph_index, intra_para_index)` as the
canonical segment identity. Treat short metadata/title/name paragraphs