|
14 | 14 | - Never commit unverified mass changes—compile or test first. |
15 | 15 | - Do not use Perl or sed for multi-line structural edits; rely on Python 3.2-friendly heredocs. |
16 | 16 |
|
| 17 | +## Markdown-Driven-Development (MDD) |
| 18 | +We practice **Markdown-Driven-Development** where documentation precedes implementation: |
| 19 | + |
| 20 | +1. **Create GitHub issue** with clear problem statement and goals |
| 21 | +2. **Update user documentation** (README.md) with new behavior/semantics |
| 22 | +3. **Update agentic documentation** (AGENTS.md) with implementation guidance |
| 23 | +4. **Update specialist documentation** (**/*.md, e.g., ARCHITECTURE.md) as needed |
| 24 | +5. **Create implementation plan** (PLAN_${issue_id}.md) documenting exact changes |
| 25 | +6. **Implement code changes** to match documented behavior |
| 26 | +7. **Update tests** to validate the documented behavior |
| 27 | +8. **Verify all documentation** remains accurate after implementation |
| 28 | + |
| 29 | +This ensures: |
| 30 | +- Users understand behavior changes before code is written |
| 31 | +- Developers have clear implementation guidance |
| 32 | +- Documentation stays synchronized with code |
| 33 | +- Breaking changes are clearly communicated |
| 34 | + |
| 35 | +When making changes, always update documentation files before modifying code. |
| 36 | + |
17 | 37 |
|
18 | 38 | ## Testing & Logging Discipline |
19 | 39 |
|
@@ -222,11 +242,21 @@ The property test logs at FINEST level: |
222 | 242 | ### Issue Management |
223 | 243 | - Use the native tooling for the remote (for example `gh` for GitHub). |
224 | 244 | - Create issues in the repository tied to the `origin` remote unless instructed otherwise; if another remote is required, ask for its name. |
225 | | -- Tickets and issues must state only “what” and “why,” leaving “how” for later discussion. |
| 245 | +- Tickets and issues must state only "what" and "why," leaving "how" for later discussion. |
226 | 246 | - Comments may discuss implementation details. |
227 | 247 | - Label tickets as `Ready` once actionable; if a ticket lacks that label, request confirmation before proceeding. |
228 | 248 | - Limit tidy-up issues to an absolute minimum (no more than two per PR). |
229 | 249 |
|
| 250 | +### Creating GitHub Issues |
| 251 | +- **Title requirements**: No issue numbers, no special characters, no quotes, no shell metacharacters |
| 252 | +- **Body requirements**: Write issue body to a file first, then use --body-file flag |
| 253 | +- **Example workflow**: |
| 254 | + ```bash |
| 255 | + echo "Issue description here" > /tmp/issue_body.md |
| 256 | + gh issue create --title "Brief description of bug" --body-file /tmp/issue_body.md |
| 257 | + ``` |
| 258 | +- **Never use --body flag** with complex content - always use --body-file to avoid shell escaping issues |
| 259 | + |
230 | 260 | ### Commit Requirements |
231 | 261 | - Commit messages start with `Issue #<issue number> <short description>`. |
232 | 262 | - Include a link to the referenced issue when possible. |
@@ -488,6 +518,16 @@ IMPORTANT: Never disable tests written for logic that we are yet to write we do |
488 | 518 | * Virtual threads for concurrent processing |
489 | 519 | * **Use try-with-resources for all AutoCloseable resources** (HttpClient, streams, etc.) |
490 | 520 |
|
| 521 | +## RFC 8927 Compliance Guidelines |
| 522 | + |
| 523 | +* **{} must compile to the Empty form and accept any JSON value** (RFC 8927 §2.2) |
| 524 | +* **Do not introduce compatibility modes that reinterpret {} with object semantics** |
| 525 | +* **Specs from json-typedef-spec are authoritative for behavior and tests** |
| 526 | +* **If a test, doc, or code disagrees with RFC 8927 about {}, the test/doc/code is wrong** |
| 527 | +* **We log at INFO when {} is compiled to help users who come from non-JTD validators** |
| 528 | + |
| 529 | +Per RFC 8927 §3.3.1: "If a schema is of the 'empty' form, then it accepts all instances. A schema of the 'empty' form will never produce any error indicators." |
| 530 | + |
491 | 531 | ## Package Structure |
492 | 532 |
|
493 | 533 | * Use default (package-private) access as the standard. Do not use 'private' or 'public' by default. |
|
0 commit comments