feat(lang): complete extends to modifies keyword migration

This commit completes the migration started in the previous commit,
updating all remaining files:

- Lexer: Changed token from Extends to Modifies
- Parser: Updated lalrpop grammar rules and AST field names
- AST: Renamed Schedule.extends field to modifies
- Grammar: Updated tree-sitter grammar.js
- Tree-sitter: Regenerated parser.c and node-types.json
- Examples: Updated baker-family work schedules
- Tests: Updated schedule composition tests and corpus
- Docs: Updated all reference documentation and tutorials
- Validation: Updated error messages and validation logic
- Package: Bumped version to 0.3.1 in all package manifests

All 554 tests pass.
This commit is contained in:
2026-02-16 22:55:04 +00:00
parent 2c898347ee
commit 47fafdc2bf
109 changed files with 5045 additions and 41939 deletions

View File

@@ -16,15 +16,15 @@ Schedule: BakerySchedule
├─ Block: 06:00 - 08:00 → prepare_dough
├─ Block: 08:00 - 14:00 → serve_customers
├─ Recurrence: Market Day (on Earthday) → special_market_hours
└─ Extends: BaseBusiness (inherits closing hours)
└─ Modifies: BaseBusiness (inherits closing hours)
```
## Syntax
```bnf
<schedule-decl> ::= "schedule" <identifier> <extends-clause>? <body>
<schedule-decl> ::= "schedule" <identifier> <modifies-clause>? <body>
<extends-clause> ::= "extends" <identifier>
<modifies-clause> ::= "modifies" <identifier>
<body> ::= "{" <schedule-item>* "}"
@@ -79,7 +79,7 @@ schedule BakeryBase {
}
}
schedule EarlyBaker extends BakeryBase {
schedule EarlyBaker modifies BakeryBase {
block work { // Override by name
05:00 - 13:00
action: baking::early_shift
@@ -369,9 +369,9 @@ schedule FarmSchedule {
## Schedule Composition
Schedules can extend other schedules using `extends`, inheriting and overriding blocks.
Schedules can extend other schedules using `modifies`, inheriting and overriding blocks.
### Extends Clause
### Modifies Clause
```storybook
schedule Base {
@@ -381,7 +381,7 @@ schedule Base {
}
}
schedule Extended extends Base {
schedule Extended modifies Base {
block work { // Override inherited block
05:00 - 13:00
action: work::early_shift
@@ -409,14 +409,14 @@ schedule BaseWork {
}
}
schedule BakerWork extends BaseWork {
schedule BakerWork modifies BaseWork {
block work {
05:00 - 13:00 // Earlier hours
action: baking::work
}
}
schedule MasterBaker extends BakerWork {
schedule MasterBaker modifies BakerWork {
block work {
03:00 - 11:00 // Even earlier!
action: baking::master_work
@@ -553,7 +553,7 @@ schedule BaseShopkeeper {
}
}
schedule BlacksmithSchedule extends BaseShopkeeper {
schedule BlacksmithSchedule modifies BaseShopkeeper {
block open { // Override
06:00 - 18:00 // Longer hours
action: smithing::work
@@ -686,8 +686,8 @@ On Wednesday at 11:00, `specialized` block is selected (more specific constraint
1. **Time format**: Times must be valid HH:MM or HH:MM:SS (24-hour)
2. **Time order**: Start time must be before end time (unless spanning midnight)
3. **Extends exists**: If using `extends`, base schedule must be defined
4. **No circular extends**: Cannot form circular dependency chains
3. **Modifies exists**: If using `modifies`, base schedule must be defined
4. **No circular modifies**: Cannot form circular dependency chains
5. **Named blocks unique**: Block names must be unique within a schedule
6. **Action exists**: Action references must resolve to defined behaviors
7. **Constraint values**: Temporal constraint values must reference defined enums
@@ -699,14 +699,14 @@ On Wednesday at 11:00, `specialized` block is selected (more specific constraint
**Avoid:**
```storybook
schedule Extended extends Base {
schedule Extended modifies Base {
block { 05:00 - 13:00, action: work } // Appends instead of overriding
}
```
**Prefer:**
```storybook
schedule Extended extends Base {
schedule Extended modifies Base {
block work { 05:00 - 13:00, action: early_work } // Overrides by name
}
```
@@ -746,8 +746,8 @@ recurs MarketDay on day saturday {
**Prefer:**
```storybook
schedule WorkerBase { ... }
schedule EarlyWorker extends WorkerBase { ... }
schedule NightWorker extends WorkerBase { ... }
schedule EarlyWorker modifies WorkerBase { ... }
schedule NightWorker modifies WorkerBase { ... }
```
### 5. Use Temporal Constraints for Clarity
@@ -770,7 +770,7 @@ block summer_hours {
## Related Concepts
- **Time-based AI**: Schedules drive time-dependent behavior
- **Template inheritance**: `extends` enables schedule reuse
- **Template inheritance**: `modifies` enables schedule reuse
- **Temporal constraints**: Filter blocks by season, day, month
- **Recurrence patterns**: Define repeating events
- **Composition**: Build complex schedules from simple parts

View File

@@ -163,8 +163,8 @@ life_arc HasOrphan {
| Rule | Description | Severity |
|------|-------------|----------|
| Time format | Times must be valid HH:MM or HH:MM:SS | Error |
| Extends exists | Base schedule must be defined | Error |
| No circular extends | Schedule chains cannot form cycles | Error |
| Modifies exists | Base schedule must be defined | Error |
| No circular modifies | Schedule chains cannot form cycles | Error |
| Named blocks unique | Block names must be unique within a schedule | Error |
| Action references valid | Action references must resolve to defined behaviors | Error |
| Constraint values valid | Temporal constraint values must reference defined enums | Error |
@@ -182,10 +182,10 @@ schedule Bad {
}
```
**Circular extends:**
**Circular modifies:**
```storybook
schedule A extends B { }
schedule B extends A { } // Error: circular schedule extension detected
schedule A modifies B { }
schedule B modifies A { } // Error: circular schedule extension detected
```
## Relationship Validation
@@ -359,7 +359,7 @@ character Good {
| Template | Unique name, valid includes, valid ranges, strict enforcement |
| Behavior | Non-empty, valid composites, valid decorators, valid subtrees |
| Life Arc | Non-empty, unique states, valid transitions, reachable states |
| Schedule | Valid times, valid extends chain, unique block names |
| Schedule | Valid times, valid modifies chain, unique block names |
| Relationship | >= 2 participants, valid references |
| Species | Unique name, valid includes, no cycles |
| Enum | Unique name, unique variants, non-empty |