pstack-design
/pstack-design
Pomaga wybrać architekturę, modele danych, granice modułów i kształt nowej funkcji, kwestionując założenia i porównując alternatywy przed kodem.
- Autor
- abotanicality ↗
- Repozytorium
- vault-skills ↗
- Licencja
- MIT
- Ostatnia zmiana repozytorium
- 12.11.2026
Ocena i bezpieczeństwo
- Pliki w paczce
- 1
- Skrypty
- 0
- Komentarze HTML
- 0
- Adresy URL w SKILL.md
- 0
Brak sygnałów. Repozytorium zmienione 12.11.2026, bez odwołań do wycofanych modeli i API.
MIT, otwarta: można używać i zmieniać, z zachowaniem informacji o autorze.
Co robi i kiedy
Pomaga wybrać architekturę, modele danych, granice modułów i kształt nowej funkcji, kwestionując założenia i porównując alternatywy przed kodem.
Oryginalny opis (EN)
Use when choosing architecture, data models, module boundaries, or the shape of a new feature. Challenge the premise and compare alternatives before writing code.
Jak działa
- Attack the Premise
- Foundational Thinking
- Redesign From First Principles
- Exhaust the Design Space
- Model the Domain
- Boundary Discipline
- Separate Before Serializing Shared State
- Experience First
Podgląd SKILL.md
--- name: pstack-design description: "Use when choosing architecture, data models, module boundaries, or the shape of a new feature. Challenge the premise and compare alternatives before writing code." --- # Design Apply these rules when deciding how a system or feature should be shaped, before writing the logic. ## Attack the Premise When two or more fixes that share one premise have failed the same gate, suspect the premise, not the fixes. **Why:** Each failed fix is evidence against the belief it assumed. A third fix on the same premise spends effort where the evidence already says the cause is not. **Pattern:** - **Write the premise down.** The premise is the one sentence that every failed fix assumed. - **Test the premise before the next fix.** Find an observation that would come out differently if the premise were false, and make it. Look at how the failures are distributed, not only at how large they are. - **Follow the evidence.** If it contradicts the premise, the cause is elsewhere. Look for what the failures have in common that the premise did not predict. If it confirms the premise, ask the next "why". The earlier fixes may have treated a consequence instead of the cause. - **Remove the condition instead of compensating for it**, per the Laziness Protocol. If the evidence shows that one part always lands on the losing side, change what puts it there. A mechanism that cleans up after it leaves the cause in place and adds work on every run. **Stop:** Do not start the next fix before the premise is written down and tested. ## Foundational Thinking **Structural decisions** protect option value. **Code-level decisions** protect simplicity. **Data structures first.** Get the data shape right before writing logic. Define core types early, trace every access pattern, and choose structures that match the dominant paths. At code level, DRY the structure, not every line. Types and data models should converge. Three similar statements still beat a premature abstraction. Prefer explicit over clever. Test behavior and edge cases, not line counts. **Concurrency corollary.** Before sharing state between actors, ask "what happens if another actor modifies this concurrently?" If not "nothing", isolate. **Scaffold first.** If something helps every later phase, do it first. Ask "does every subsequent phase benefit from this existing?" CI, linting, test infrastructure, and shared types are scaffold. Sequence for option value: setup before features, tests before fixes. Keep commits small and single-purpose. Each increment should land a coherent abstraction or deepen one that exists. Do not spread a new capability across callers as special-case coordination. Subtraction comes before scaffolding. Remove dead code first, then lay foundations. ## Redesign From First Principles When integrating a change, don't bolt it onto the existing design. Redesign as if the requirement had been a foundational assumption from the start. - Read all affected files and understand the current design - Ask: "if we were writing this from scratch with this new requirement, what would we build?" - Propagate the change through every reference: types, docs, examples, rationale sections - Think about the whole redesign, then deliver it incrementally ## Exhaust the Design Space Build 2-3 competing prototypes and compare side by side before committing. It also applies to product design decisions where user experience depends on feel, not logic. ## Model the Domain Encode the real domain in a data structure instead of scattering it across conditionals. A structure that matches the domain makes invalid states unrepresentable and deletes branches. Choosing it at write time is cheap. Recovering it later reads as a refactor and gets deferred. Reach for: - A state machine instead of scattered booleans, phases, or lifecycle checks. - A typed model instead of loose parameters or repeated shape assumptions. - A map, registry, lookup table, or discriminated union instead of branching spread across files. - A reducer or command/event model instead of ad hoc state mutations. - A module organized around one body of domain knowledge instead of a sequence such as load, validate, transform, and save. Execution order is not ownership. - A small module boundary that gathers repeated behavior, ownership, or invariants. - A queue, cache, index, graph, tree, or normalized collection where the access pattern calls for it. - Any other structure that fits. When none fits, work out what the code must never allow and how the data gets read, then find the structure that encodes exactly that. Do not force an abstraction. Prefer boring code if the current shape is already clear, local, and unlikely to grow. Be skeptical of an abstraction that adds indirection without removing branches, duplicated rules, invalid states, or lifecycle risk. The sign that you skipped this is a new feature that grows an existing if/else chain by one more branch, or a second boolean that must stay in sync with the first. Temporal decomposition is another sign. Phase-named modules repeat the same domain rules across steps. ## Boundary Discipline Place validation, type narrowing, and error handling at system boundaries. Trust internal code unconditionally. Business logic lives in pure functions. The shell is thin and mechanical. **The pattern:** - **At boundaries** (CLI args, config files, external APIs, network protocols): validate, return errors, handle defensively. - **Inside the system:** typed data, error propagation, no re-validation. Trust the types. - **Across the boundary.** Expose domain concepts, not the boundary's private representation. Keep general-purpose mechanism inside and special-purpose policy at the edge. **Applications:** Validation and error handling: - Validate config at parse time (the boundary), not inside business logic - Parse raw data into domain types at the boundary - Do not re-export transport, storage, framework, or wire types through the public surface - No redundant nil checks deep in call chains if the boundary already validated Code organization: - Business logic in pure functions with no framework dependencies - Parse functions: pure transforms from raw bytes to typed state - Prompt construction: structured state in, string out - Scoring and assessment: pure transforms from state to results **The tests:** - "Is this data crossing a system boundary right now?" If not, validation is redundant. - "Can this be a pure function that the shell just calls?" If yes, extract it. ## Separate Before Serializing Shared State When concurrent actors might share mutable state, first ask whether they need the same mutable object. If not, eliminate the sharing. When sharing is real, enforce serialization structurally: lockfiles, sequential phases, exclusive ownership. Instructions and conventions are not concurrency control. **Pattern:** 1. **Identify shared mutable state** (files both read and write, branches both push to, APIs both define and consume). 2. **Default: eliminate the shared write target.** Ask: do these actors need one canonical object, or are they publishing independent facts? Give each actor its own owned file, key, branch, or state directory, and merge only at the read/reporting boundary. Two workers writing their own `lastX` field into one `state.json` is still shared mutation. `indexer-state.json` + `metrics-state.json` is not. 3. **Only when one shared write target is a real invariant, serialize access structurally** (lockfiles, sequential phases, single-writer actor, or atomic compare-and-swap). Treat "we need a lock" as a design smell to check, not as the default answer. ## Experience First When implementation convenience conflicts with user delight, choose delight. - Every feature, control, and option must be justified - Ship less, ship better (polished experience with three features beats rough one with ten) - Prototype before committing (design decisions are cheaper in throwaway HTML than production code) - Get the details right (transitions, alignment, spacing, feedback, error states) - Tighten the core loop (every feature should serve the central workflow or get out of the way) The user is whoever consumes the work. For a UI that is the end user. For a library or an internal API it is the colleague who imports it. The engineer who maintains the code next is a user too. Weigh their experience the same way, and explain impact from their perspective.
Wersje
W bazie nie ma innych skilli o nazwie pstack-design.
Migawka bazy z 13.11.2026 · wersja paczki 8a9bd8ea0e91 (skrót SHA-256 całej paczki)
Pobrania w ostatnich 30 dniach: 0 · ranking
Zgłoś problem z tym skillem: szkodliwa treść, błędny opis albo prośba autora o usunięcie.
Podobne skille
- 100architect
Analizuje architekturę systemu, strukturę modułów, kontrakty API, modele danych i wzorce kodu, także przy projektowaniu systemów i architekturze frontendu. - 100pstack-feature
Zamienia wymaganie w dostarczoną zmianę: przegląda podsystem, porównuje dwa projekty i buduje w małych, sprawdzonych krokach. - 95setup-pstack
Wykrywa aktywnego agenta i zapisuje w pliku models.md w katalogu domowym, które modele wybiera każda rola. - 95setup-pstack
Ustawia, które role i modele pstack używa w każdym przepływie, i zapisuje tę konfigurację w projekcie. - 90poteto-mode
Uruchamia playbooki inżynierskie pstack do badania, implementacji, przeglądu i weryfikacji. - 95pstack-bug-fix
Prowadzi naprawę błędu według metody pstack: odtwarza usterkę, znajduje przyczynę, dodaje nieprzechodzący test i weryfikuje poprawkę.