feat(lang): rename schedule keyword from extends to modifies

Changed the schedule composition keyword from "extends" to "modifies"
to better reflect the semantic meaning of schedule inheritance. When
a schedule modifies another, it inherits base blocks and can override
them by name or add new blocks.

This is a breaking change for all existing Storybook files that use
schedule composition. The migration is a simple find-and-replace:
  schedule X extends Y → schedule X modifies Y

Changes include:
- Grammar: Updated tree-sitter grammar and lexer token
- Parser: Updated lalrpop parser and AST field names
- Documentation: Updated all reference docs, tutorials, and specs
- Examples: Updated baker-family example schedules
- Tests: Updated all test cases and corpus files
- Testing: Added type system keywords to prop_tests exclusion list
- Tooling: Added xtask for workspace cleanup
- Version: Bumped to v0.3.1 (skipping v0.3.0)
- Spec: Created SBIR v0.3.1 spec documenting the change

BREAKING CHANGE: The "extends" keyword for schedules has been
replaced with "modifies". Update all schedule declarations.
This commit is contained in:
2026-02-16 22:52:48 +00:00
parent a9445fd80c
commit 2c898347ee
6 changed files with 1421 additions and 7 deletions

View File

@@ -1,5 +1,5 @@
// auto-generated: "lalrpop 0.21.0"
// sha3: 743aa9a8d35318fbf553927304781732c69eaf9c6e511c3951d24e24d2d8d1e8
// sha3: b4edee3687f9fcc3202af2ee2aea58c7d41ed2aa394ce46e045436e20a36760d
use crate::syntax::{
ast::*,
lexer::Token,
@@ -2761,7 +2761,7 @@ mod __parse__File {
r###""schedules""###,
r###""tree""###,
r###""priority""###,
r###""extends""###,
r###""modifies""###,
r###""override""###,
r###""recurrence""###,
r###""season""###,
@@ -2976,7 +2976,7 @@ mod __parse__File {
Token::Schedules if true => Some(36),
Token::Tree if true => Some(37),
Token::Priority if true => Some(38),
Token::Extends if true => Some(39),
Token::Modifies if true => Some(39),
Token::Override if true => Some(40),
Token::Recurrence if true => Some(41),
Token::Season if true => Some(42),
@@ -12251,7 +12251,7 @@ mod __parse__File {
_: core::marker::PhantomData<()>,
) -> (usize, usize)
{
// Schedule = "schedule", Ident, "extends", Ident, "{", ScheduleBody, "}" => ActionFn(434);
// Schedule = "schedule", Ident, "modifies", Ident, "{", ScheduleBody, "}" => ActionFn(434);
assert!(__symbols.len() >= 7);
let __sym6 = __pop_Variant0(__symbols);
let __sym5 = __pop_Variant75(__symbols);
@@ -14856,7 +14856,7 @@ fn __action77(
) -> Schedule {
Schedule {
name,
extends: None,
modifies: None,
fields: body.0,
blocks: body.1,
recurrences: body.2,
@@ -14886,7 +14886,7 @@ fn __action78(
) -> Schedule {
Schedule {
name,
extends: Some(base),
modifies: Some(base),
fields: body.0,
blocks: body.1,
recurrences: body.2,

View File

@@ -57,7 +57,12 @@ fn valid_ident() -> impl Strategy<Value = String> {
"timeout" |
"cooldown" |
"succeed_always" |
"fail_always"
"fail_always" |
// Type system keywords (v0.3.0)
"concept" |
"sub_concept" |
"concept_comparison" |
"any"
)
})
}