From de27d6519e958bdddd4a653709497454a7396f2f Mon Sep 17 00:00:00 2001 From: Dylan Garvis Date: Tue, 11 Aug 2026 17:07:13 -0400 Subject: [PATCH] docs(design): define Tree Feller user stories --- design/index.md | 12 ++++++ design/log.md | 17 +++++++++ design/user-stories/index.md | 11 ++++++ .../us-001-earn-tree-type-unlocks.md | 31 ++++++++++++++++ .../user-stories/us-002-view-tree-progress.md | 29 +++++++++++++++ .../us-003-fell-unlocked-trees.md | 36 ++++++++++++++++++ .../us-004-control-personal-tree-felling.md | 30 +++++++++++++++ .../us-005-undo-the-last-felled-tree.md | 34 +++++++++++++++++ .../us-006-announce-tree-unlocks.md | 28 ++++++++++++++ .../us-007-administer-tree-feller.md | 36 ++++++++++++++++++ ...s-008-configure-and-persist-tree-feller.md | 37 +++++++++++++++++++ .../us-009-build-and-release-tree-feller.md | 32 ++++++++++++++++ 12 files changed, 333 insertions(+) create mode 100644 design/index.md create mode 100644 design/log.md create mode 100644 design/user-stories/index.md create mode 100644 design/user-stories/us-001-earn-tree-type-unlocks.md create mode 100644 design/user-stories/us-002-view-tree-progress.md create mode 100644 design/user-stories/us-003-fell-unlocked-trees.md create mode 100644 design/user-stories/us-004-control-personal-tree-felling.md create mode 100644 design/user-stories/us-005-undo-the-last-felled-tree.md create mode 100644 design/user-stories/us-006-announce-tree-unlocks.md create mode 100644 design/user-stories/us-007-administer-tree-feller.md create mode 100644 design/user-stories/us-008-configure-and-persist-tree-feller.md create mode 100644 design/user-stories/us-009-build-and-release-tree-feller.md diff --git a/design/index.md b/design/index.md new file mode 100644 index 0000000..3936976 --- /dev/null +++ b/design/index.md @@ -0,0 +1,12 @@ +--- +okf_version: "0.1" +--- + +# Tree Feller Design + +This bundle documents Tree Feller, a Spigot 26.2 plugin through which players earn per-species automatic tree felling, watch trees break progressively, and safely undo their most recent felling. + +## Explore + +- [User stories](user-stories/index.md) +- [Design log](log.md) diff --git a/design/log.md b/design/log.md new file mode 100644 index 0000000..fe9a36c --- /dev/null +++ b/design/log.md @@ -0,0 +1,17 @@ +# Tree Feller Design Log + +## 2026-08-11 + +### Initial tree-felling design + +- Players earn automatic felling separately for each supported tree species by manually mining qualifying tree blocks in Survival with an axe. +- Each species defaults to a 100-block unlock threshold; lowered thresholds are evaluated on the player's next qualifying block, while earned unlocks are permanent unless an administrator resets them. +- Supported species cover Spigot 26.2 overworld trees, crimson and warped fungi, and giant red and brown mushrooms; bamboo is excluded. +- The prior `../yetanothertreefeller/` search strategy informs detection: connected trunk blocks are searched laterally and upward, never downward, and associated foliage or caps establish that the structure is a tree. The new implementation will use bounded iteration rather than unbounded recursion. +- Unlocked trees break from bottom to top, one trunk block every two ticks by default. Leaves and caps are not automatically removed. +- Sneaking bypasses automatic felling. Players may also persistently enable or disable it with `/treefeller enabled `. +- The player's latest felling may be undone for six minutes by default. Undo preflights the complete operation, reclaims all required replacement materials from inventory, and reports shortages without making partial changes. +- Unlock progress is shown through `/treefeller unlocked` and a temporary boss bar. Unlocks produce a title and a chat explanation of sneaking and undo. +- Player commands use `/treefeller`; administration uses the separate `/treefelleradmin` command and `treefeller.admin` permission. +- Administrators can inspect players, grant or reset species, lock all automatic felling for a player, and persistently change species thresholds. Administrative locking does not stop manual progress. +- Build and release conventions follow `../spigot-getgud/`, including Spigot API `26.2-R0.1-SNAPSHOT`, Java 17, Gradle, strict compilation, tests, and Gitea automation. diff --git a/design/user-stories/index.md b/design/user-stories/index.md new file mode 100644 index 0000000..1c49f41 --- /dev/null +++ b/design/user-stories/index.md @@ -0,0 +1,11 @@ +# Tree Feller User Stories + +1. [US-001: Earn tree-type unlocks](us-001-earn-tree-type-unlocks.md) +2. [US-002: View tree progress](us-002-view-tree-progress.md) +3. [US-003: Fell unlocked trees](us-003-fell-unlocked-trees.md) +4. [US-004: Control personal tree felling](us-004-control-personal-tree-felling.md) +5. [US-005: Undo the last felled tree](us-005-undo-the-last-felled-tree.md) +6. [US-006: Announce tree unlocks](us-006-announce-tree-unlocks.md) +7. [US-007: Administer Tree Feller](us-007-administer-tree-feller.md) +8. [US-008: Configure and persist Tree Feller](us-008-configure-and-persist-tree-feller.md) +9. [US-009: Build and release Tree Feller](us-009-build-and-release-tree-feller.md) diff --git a/design/user-stories/us-001-earn-tree-type-unlocks.md b/design/user-stories/us-001-earn-tree-type-unlocks.md new file mode 100644 index 0000000..e1a069e --- /dev/null +++ b/design/user-stories/us-001-earn-tree-type-unlocks.md @@ -0,0 +1,31 @@ +--- +type: User Story +title: "US-001: Earn tree-type unlocks" +description: Let players earn permanent automatic felling separately for each supported tree species. +status: backlog +--- + +# US-001: Earn tree-type unlocks + +As a **survival player**, I want to unlock Tree Feller by practicing with each tree species so that automatic felling feels earned and species-specific. + +## Acceptance criteria + +- [ ] Progress is tracked independently for oak, spruce, birch, jungle, acacia, dark oak, mangrove, cherry, pale oak, crimson fungi, warped fungi, giant red mushrooms, and giant brown mushrooms as represented by Spigot 26.2 materials. +- [ ] Azalea-grown oak logs contribute to oak progress, and bamboo does not contribute to any tree species. +- [ ] A block contributes progress only when a player manually breaks it in Survival mode, with an axe, from a structure that passes Tree Feller's tree validation. +- [ ] Creative-mode breaks, non-axe breaks, cancelled breaks, and blocks removed by automatic felling do not contribute progress. +- [ ] Each qualifying manually mined block contributes exactly one point to its species. +- [ ] Each species has an independently configurable unlock threshold that defaults to 100 blocks. +- [ ] Reaching the active threshold permanently unlocks automatic felling for that species. +- [ ] A threshold lowered below a player's saved progress grants the unlock when that player next mines a qualifying block of the species, not immediately when configuration changes. +- [ ] Raising a threshold never removes an earned unlock. +- [ ] A player whose automatic felling is disabled or administratively locked may continue earning progress through qualifying manual mining. +- [ ] Progress and unlocks survive logout and server restart. + +## Related + +- [US-002: View tree progress](us-002-view-tree-progress.md) +- [US-003: Fell unlocked trees](us-003-fell-unlocked-trees.md) +- [US-007: Administer Tree Feller](us-007-administer-tree-feller.md) +- [US-008: Configure and persist Tree Feller](us-008-configure-and-persist-tree-feller.md) diff --git a/design/user-stories/us-002-view-tree-progress.md b/design/user-stories/us-002-view-tree-progress.md new file mode 100644 index 0000000..cfebe84 --- /dev/null +++ b/design/user-stories/us-002-view-tree-progress.md @@ -0,0 +1,29 @@ +--- +type: User Story +title: "US-002: View tree progress" +description: Show players which species are unlocked and their progress toward the remaining unlocks. +status: backlog +--- + +# US-002: View tree progress + +As a **player**, I want clear unlock and progress information so that I know which trees I can fell and what to work on next. + +## Acceptance criteria + +- [ ] `/treefeller unlocked` lists every supported species in a readable locked or unlocked state. +- [ ] Each locked species includes the player's current qualifying-block count and active threshold. +- [ ] Each unlocked species is clearly distinguished and is not presented as needing further progress. +- [ ] Mining a qualifying block for a locked species displays or updates a boss bar with the species name and numeric progress toward its active threshold. +- [ ] The boss bar reflects a changed threshold the next time qualifying progress is recorded. +- [ ] The boss bar disappears after no qualifying block has been mined for five seconds by default. +- [ ] Mining another qualifying block before timeout restarts the configured visibility period. +- [ ] Boss-bar visibility duration, text, color, and style are configurable. +- [ ] Progress feedback is not displayed for cancelled, ineligible, automatically felled, or already-unlocked blocks. +- [ ] `/treefeller unlocked` and its autocomplete expose no administrative functionality. + +## Related + +- [US-001: Earn tree-type unlocks](us-001-earn-tree-type-unlocks.md) +- [US-006: Announce tree unlocks](us-006-announce-tree-unlocks.md) +- [US-008: Configure and persist Tree Feller](us-008-configure-and-persist-tree-feller.md) diff --git a/design/user-stories/us-003-fell-unlocked-trees.md b/design/user-stories/us-003-fell-unlocked-trees.md new file mode 100644 index 0000000..6f11dcb --- /dev/null +++ b/design/user-stories/us-003-fell-unlocked-trees.md @@ -0,0 +1,36 @@ +--- +type: User Story +title: "US-003: Fell unlocked trees" +description: Safely and visibly break an unlocked tree's trunk from the mined block upward. +status: backlog +--- + +# US-003: Fell unlocked trees + +As a **player with an unlocked species**, I want its trees to break progressively from the point I chop so that felling is useful, understandable, and visually satisfying. + +## Acceptance criteria + +- [ ] Automatic felling is considered only for a non-cancelled Survival-mode block break made with an axe against a species the player has unlocked. +- [ ] Sneaking when the initiating block is broken always bypasses automatic felling and leaves the ordinary single-block break intact. +- [ ] A disabled or administratively locked player receives the ordinary single-block break without automatic felling. +- [ ] Tree detection follows connected blocks of the initiating trunk family laterally and upward, including diagonal branches, but never follows trunk blocks below the initiating block. +- [ ] Detection requires foliage, wart blocks, or mushroom caps appropriate to the candidate species so that an unsupported log structure is not automatically felled. +- [ ] Detection is iterative and bounded by configurable block and search-distance limits; reaching a safety limit aborts automatic felling without preventing the initiating ordinary break. +- [ ] Neighbor visitation is deterministic and does not process a location more than once. +- [ ] Only trunk, stem, or mushroom-stem blocks are felled; leaves, wart blocks, mushroom caps, roots, vines, and decorations remain for normal game behavior. +- [ ] The initiating block is handled by the original break, and remaining discovered trunk blocks break bottom-to-top at a configurable delay of two server ticks per block by default. +- [ ] Each additional block is checked through the applicable Bukkit block-break event path, and a cancellation prevents that block and any unsafe continuation from being broken. +- [ ] Each successfully felled block produces drops and experience according to its block state, the active axe, enchantments, and the Spigot API rather than duplicating the initiating block's drops. +- [ ] Axe durability, including Unbreaking behavior, is applied for every successfully felled block without double-charging the initiating break. +- [ ] Felling stops safely before another block is processed when the axe breaks, is removed, or is no longer an eligible axe. +- [ ] Logging out, plugin disablement, world unload, or another invalidated runtime condition cancels the remaining animation without breaking queued blocks. +- [ ] A player cannot start overlapping automatic fellings that could double-break or double-drop the same blocks. +- [ ] Only blocks actually removed by this felling are recorded for undo. + +## Related + +- [US-001: Earn tree-type unlocks](us-001-earn-tree-type-unlocks.md) +- [US-004: Control personal tree felling](us-004-control-personal-tree-felling.md) +- [US-005: Undo the last felled tree](us-005-undo-the-last-felled-tree.md) +- [US-008: Configure and persist Tree Feller](us-008-configure-and-persist-tree-feller.md) diff --git a/design/user-stories/us-004-control-personal-tree-felling.md b/design/user-stories/us-004-control-personal-tree-felling.md new file mode 100644 index 0000000..23c09fa --- /dev/null +++ b/design/user-stories/us-004-control-personal-tree-felling.md @@ -0,0 +1,30 @@ +--- +type: User Story +title: "US-004: Control personal tree felling" +description: Let players persistently enable or disable their own automatic tree felling. +status: backlog +--- + +# US-004: Control personal tree felling + +As a **player**, I want to turn automatic felling on or off independently of my unlocks so that I remain in control of how I mine. + +## Acceptance criteria + +- [ ] `/treefeller enabled ` enables or disables automatic felling for the issuing player. +- [ ] `/treefeller enabled` without a value reports the player's current preference and whether an administrative lock currently overrides it. +- [ ] The preference defaults to enabled for a player with no saved value. +- [ ] Changing the preference does not alter species progress or earned unlocks. +- [ ] Repeating the currently saved value is idempotent and reports that no change was needed. +- [ ] The player receives clear confirmation after a successful change. +- [ ] The saved preference survives logout and server restart. +- [ ] `/treefeller` provides concise usage for `enabled`, `unlocked`, and `undo` without advertising inaccessible administrative commands. +- [ ] Position-aware autocomplete suggests player subcommands and valid `on` or `off` values. +- [ ] Player commands use player permissions that are distinct from `treefeller.admin`; possession of player permissions does not grant `/treefelleradmin` access. + +## Related + +- [US-002: View tree progress](us-002-view-tree-progress.md) +- [US-003: Fell unlocked trees](us-003-fell-unlocked-trees.md) +- [US-007: Administer Tree Feller](us-007-administer-tree-feller.md) +- [US-008: Configure and persist Tree Feller](us-008-configure-and-persist-tree-feller.md) diff --git a/design/user-stories/us-005-undo-the-last-felled-tree.md b/design/user-stories/us-005-undo-the-last-felled-tree.md new file mode 100644 index 0000000..3f1d9af --- /dev/null +++ b/design/user-stories/us-005-undo-the-last-felled-tree.md @@ -0,0 +1,34 @@ +--- +type: User Story +title: "US-005: Undo the last felled tree" +description: Safely restore the player's most recent automatic felling without creating replacement materials. +status: backlog +--- + +# US-005: Undo the last felled tree + +As a **player**, I want to undo my latest automatically felled tree so that I can recover from an accidental chop without duplicating its materials. + +## Acceptance criteria + +- [ ] `/treefeller undo` targets only the issuing player's most recent automatic felling. +- [ ] An undo record contains only blocks successfully removed by the operation, including the initiating trunk block when its original state can be captured safely. +- [ ] Each record retains the world, block coordinates, original block material, and original block data needed to restore orientation and other supported state. +- [ ] Only one undo record is retained per player; a later felling replaces the earlier record after the later operation has removed at least one eligible tree block. +- [ ] An undo remains available for six minutes after the felling by default, with a configurable duration. +- [ ] Undo performs a complete preflight before changing the world or inventory. +- [ ] Preflight requires every target world and chunk to be available and every target position to remain safely restorable; an occupied or otherwise unsafe position fails the whole undo. +- [ ] Preflight calculates the exact replacement materials required to reconstruct all recorded trunk states and requires those aggregate materials in the issuing player's inventory. +- [ ] If inventory is insufficient, no item or block changes occur and the error lists every missing material with its missing quantity. +- [ ] On success, required materials are removed exactly once and all recorded blocks are restored as one logical operation. +- [ ] If an unexpected restoration failure occurs after preflight, the implementation avoids a silent partial result and reports the recovery action needed to administrators. +- [ ] A successful undo consumes the record so that it cannot be repeated. +- [ ] An expired, absent, already-used, or invalid undo produces a clear message and makes no changes. +- [ ] Undo restores trunk blocks only; it does not restore foliage, caps, roots, drops, experience, or axe durability. +- [ ] Undo has a distinct player permission and never grants access to `/treefelleradmin`. + +## Related + +- [US-003: Fell unlocked trees](us-003-fell-unlocked-trees.md) +- [US-004: Control personal tree felling](us-004-control-personal-tree-felling.md) +- [US-008: Configure and persist Tree Feller](us-008-configure-and-persist-tree-feller.md) diff --git a/design/user-stories/us-006-announce-tree-unlocks.md b/design/user-stories/us-006-announce-tree-unlocks.md new file mode 100644 index 0000000..ba5d40c --- /dev/null +++ b/design/user-stories/us-006-announce-tree-unlocks.md @@ -0,0 +1,28 @@ +--- +type: User Story +title: "US-006: Announce tree unlocks" +description: Celebrate each newly earned species and explain how to control or undo automatic felling. +status: backlog +--- + +# US-006: Announce tree unlocks + +As a **player**, I want visible and actionable feedback when I unlock a species so that I notice the achievement and understand Tree Feller's safety controls. + +## Acceptance criteria + +- [ ] Earning a species unlock displays a configurable on-screen title and subtitle naming the species. +- [ ] Earning a species unlock also sends a configurable chat message that explains that sneaking prevents automatic felling and names `/treefeller undo`. +- [ ] Title text, subtitle text, fade-in time, display time, fade-out time, and chat text are configurable. +- [ ] Messages support the project's chosen Spigot formatting convention and a documented species placeholder. +- [ ] The boss bar for the newly unlocked species is removed when its unlock announcement is shown. +- [ ] An earned species produces its unlock announcement exactly once unless an administrator later resets that species and the player earns it again. +- [ ] An administrative grant clearly informs an online target that access was granted but does not falsely present it as a mined-block achievement. +- [ ] Invalid or cancelled breaks never generate an unlock announcement. + +## Related + +- [US-001: Earn tree-type unlocks](us-001-earn-tree-type-unlocks.md) +- [US-002: View tree progress](us-002-view-tree-progress.md) +- [US-007: Administer Tree Feller](us-007-administer-tree-feller.md) +- [US-008: Configure and persist Tree Feller](us-008-configure-and-persist-tree-feller.md) diff --git a/design/user-stories/us-007-administer-tree-feller.md b/design/user-stories/us-007-administer-tree-feller.md new file mode 100644 index 0000000..c69e958 --- /dev/null +++ b/design/user-stories/us-007-administer-tree-feller.md @@ -0,0 +1,36 @@ +--- +type: User Story +title: "US-007: Administer Tree Feller" +description: Give administrators separate, structured commands for player access, progress, and species thresholds. +status: backlog +--- + +# US-007: Administer Tree Feller + +As a **server administrator**, I want a dedicated administrative command tree so that I can manage Tree Feller without granting ordinary players administrative authority. + +## Acceptance criteria + +- [ ] All administrative operations are rooted at `/treefelleradmin` rather than `/treefeller`. +- [ ] Administrative commands require `treefeller.admin`, which server operators receive by default and ordinary player permissions never imply. +- [ ] `/treefelleradmin player status` reports identity, saved enabled preference, administrative lock, and each species' progress, threshold, and unlock state. +- [ ] `/treefelleradmin player tree grant` grants that species permanently without altering unrelated species. +- [ ] `/treefelleradmin player tree reset` removes that species' unlock and resets its progress to zero without altering unrelated species. +- [ ] A reset player can earn the species again and receive its normal earned-unlock announcement. +- [ ] `/treefelleradmin player locked ` controls an override that prevents all automatic felling for the player without changing their preference, progress, or unlocks. +- [ ] An administratively locked player may continue accruing qualifying manual progress and receives a clear explanation when automatic felling is suppressed. +- [ ] `/treefelleradmin threshold ` validates and persistently changes the named species' unlock threshold. +- [ ] Lowering a threshold does not scan or immediately mutate all player records; each affected player unlocks on their next qualifying block of that species. +- [ ] Raising a threshold never revokes existing unlocks. +- [ ] Player targets resolve exact online names, previously known names, and UUIDs without confusing players who have used the same name. +- [ ] Tree-type arguments use stable documented identifiers covering every supported species. +- [ ] Autocomplete is permission-aware and suggests valid subcommands, known player targets, properties, tree types, actions, and values for the current argument position. +- [ ] Every successful mutation reports exactly what changed to the administrator and, when online, the affected player. +- [ ] Invalid or unauthorized requests make no partial state or configuration changes. + +## Related + +- [US-001: Earn tree-type unlocks](us-001-earn-tree-type-unlocks.md) +- [US-004: Control personal tree felling](us-004-control-personal-tree-felling.md) +- [US-006: Announce tree unlocks](us-006-announce-tree-unlocks.md) +- [US-008: Configure and persist Tree Feller](us-008-configure-and-persist-tree-feller.md) diff --git a/design/user-stories/us-008-configure-and-persist-tree-feller.md b/design/user-stories/us-008-configure-and-persist-tree-feller.md new file mode 100644 index 0000000..de0ca9a --- /dev/null +++ b/design/user-stories/us-008-configure-and-persist-tree-feller.md @@ -0,0 +1,37 @@ +--- +type: User Story +title: "US-008: Configure and persist Tree Feller" +description: Provide validated configuration and durable player state for predictable tree-felling behavior. +status: backlog +--- + +# US-008: Configure and persist Tree Feller + +As a **server operator**, I want Tree Feller's behavior and player progression stored safely so that upgrades and restarts do not cause surprises or lost progress. + +## Acceptance criteria + +- [ ] Configuration defines supported species and their thresholds, each defaulting to 100 qualifying blocks. +- [ ] Configuration defines an animation delay defaulting to two server ticks per felled block. +- [ ] Configuration defines a progress boss-bar timeout defaulting to five seconds and an undo window defaulting to six minutes. +- [ ] Configuration includes bounded tree-search limits, boss-bar presentation, title timing, and all player-facing messages. +- [ ] Numeric settings reject zero, negative, overflowing, or operationally unsafe values using documented bounds. +- [ ] Invalid required configuration prevents partial plugin initialization and produces a clear server log message identifying the setting. +- [ ] Runtime threshold changes made through `/treefelleradmin` are persisted before becoming active and survive restart. +- [ ] A failed runtime configuration write leaves the active threshold unchanged. +- [ ] UUID-keyed player state persists latest known name, enabled preference, administrative lock, per-species progress, and earned unlocks. +- [ ] Player identity resolution safely retains previously known names while UUID remains authoritative. +- [ ] Player state is written atomically where supported so that a failed write does not replace valid state with a partial document. +- [ ] Corrupt or invalid player records are handled defensively and cannot silently grant unlocks or administrative privileges. +- [ ] Progress that exceeds a currently configured threshold is retained, and counters cannot overflow. +- [ ] Unknown forward-compatible configuration and player-state fields are preserved where practical. +- [ ] Undo records are runtime safety records and do not survive a server restart unless a later approved design explicitly adds durable undo. + +## Related + +- [US-001: Earn tree-type unlocks](us-001-earn-tree-type-unlocks.md) +- [US-002: View tree progress](us-002-view-tree-progress.md) +- [US-003: Fell unlocked trees](us-003-fell-unlocked-trees.md) +- [US-005: Undo the last felled tree](us-005-undo-the-last-felled-tree.md) +- [US-007: Administer Tree Feller](us-007-administer-tree-feller.md) +- [US-009: Build and release Tree Feller](us-009-build-and-release-tree-feller.md) diff --git a/design/user-stories/us-009-build-and-release-tree-feller.md b/design/user-stories/us-009-build-and-release-tree-feller.md new file mode 100644 index 0000000..a1313c9 --- /dev/null +++ b/design/user-stories/us-009-build-and-release-tree-feller.md @@ -0,0 +1,32 @@ +--- +type: User Story +title: "US-009: Build and release Tree Feller" +description: Give maintainers repeatable Spigot builds, automated verification, and versioned Gitea releases. +status: backlog +--- + +# US-009: Build and release Tree Feller + +As a **plugin maintainer**, I want automated builds and releases modeled on `spigot-getgud` so that tested, correctly versioned Tree Feller artifacts can be distributed consistently. + +## Acceptance criteria + +- [ ] The Gradle project compiles against Spigot API `26.2-R0.1-SNAPSHOT` using a Java 17 toolchain. +- [ ] Compiler lint warnings fail the build. +- [ ] Automated JUnit 5 tests run as part of the Gradle check lifecycle. +- [ ] Pushes and pull requests build and test Tree Feller in Gitea Actions. +- [ ] Pull requests validate conventional commit messages. +- [ ] CI stores a development Tree Feller JAR as a workflow artifact. +- [ ] Main-branch conventional commits drive semantic versioning. +- [ ] A successful release builds a versioned Tree Feller JAR and attaches it to the corresponding Gitea release. +- [ ] Build files, Gradle wrapper, workflows, release behavior, and Java dependency versions follow `../spigot-getgud/` where applicable while using Tree Feller names and identifiers. +- [ ] Plugin metadata declares the player and administrative command trees with separate permissions. +- [ ] The approved user-story bundle is committed before implementation begins. +- [ ] Subsequent implementation follows test-driven development where practical and keeps story statuses and acceptance criteria synchronized with verified behavior. +- [ ] No remote push is performed until the maintainer confirms that the Gitea repository and release token secret are ready. + +## Related + +- [US-007: Administer Tree Feller](us-007-administer-tree-feller.md) +- [US-008: Configure and persist Tree Feller](us-008-configure-and-persist-tree-feller.md) +- [User-story catalog](index.md)