rhachet-roles-ehmpathy 1.13.6 → 1.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/logic/roles/architect/.briefs/criteria.given_when_then.[seed].v3.md +87 -0
- package/dist/logic/roles/architect/.briefs/practices/prefer.env_access.prep_over_dev.md +12 -0
- package/dist/logic/roles/architect/.briefs/ubiqlang.ambiguous-from-overload.md +1 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog000.overview.and.premise.md +115 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog021.coordinates.spherical.md +69 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog021.metaphor.cauliflorous.md +44 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog021.metaphor.galactic_spacetravel.[article].md +42 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog021.metaphor.galactic_spacetravel.[lesson].md +60 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog021.structs.catalog.md +51 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog021.structs.treestruct.md +85 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog021.structs.vector.md +112 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog101.concept.definition.md +115 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog101.concept.treestruct._.md +112 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog101.concept.treestruct.coords.1.spherical.md +80 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog101.concept.treestruct.coords.2.abstractive.md +59 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog101.concept.treestruct.coords.3.descriptive.md +64 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog101.concept.treestruct.persp.1.perspectives.md +88 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog101.concept.treestruct.persp.2.universal.md +82 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog101.concept.treestruct.persp.3.relative.md +106 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog101.concept.treestruct.persp.4.fractal.md +83 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog151.concept.treestruct.gravity.md +89 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog201.cortal.focus.p1.definition.md +231 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog201.cortal.focus.p1.examples.cont.md +82 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog201.cortal.focus.p2.acuity.md +134 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog201.cortal.focus.p2.breadth.md +151 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog201.cortal.focus.p2.depth.md +147 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog251.cortal.focus.p3.fabric.md +96 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog251.cortal.focus.p3.mode.md +68 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog251.cortal.focus.p3.rythm.md +56 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog251.cortal.focus.p3.usecases.md +76 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog301.traversal.1.motion.primitives._.md +155 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog301.traversal.1.motion.primitives.acuity.md +94 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog301.traversal.1.motion.primitives.breadth.md +114 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog301.traversal.1.motion.primitives.breadth.vary.md +105 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog301.traversal.1.motion.primitives.depth.md +132 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog301.traversal.2.motion.composites._.md +106 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog301.traversal.2.motion.composites.grammar.md +105 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog401.questions.._.md +209 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog401.questions.1.persp.as.berries.md +168 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog401.questions.1.persp.as.vectors.md +74 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog401.questions.1.persp.has.precision.tunable.md +80 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog401.questions.2.1.primitives.rough._.md +99 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog401.questions.2.1.primitives.rough.interrogative.md +108 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog401.questions.2.1.primitives.rough.why.[article].md +55 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog401.questions.2.2.composite.smooth._.md +83 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog401.questions.2.2.composite.smooth.examples.md +101 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog501.cortal.assemblylang.1.primitives._.md +134 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog501.cortal.assemblylang.1.primitives.recall.md +149 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog501.cortal.assemblylang.1.primitives.steer.md +146 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog501.cortal.assemblylang.1.primitives.think.md +141 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog501.cortal.assemblylang.2.composites.zoom.md +127 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog501.cortal.assemblylang.3.catalogs.md +107 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog501.cortal.assemblylang.3.grammar.md +124 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/cog501.cortal.assemblylang_.md +0 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/inflight/concept.vs.idea.md +70 -0
- package/dist/logic/roles/bhrain/.briefs/cognition/inflight/core.concept.adjectives.md +8 -0
- package/dist/logic/roles/bhrain/.briefs/distilisys.grammar.compressed.md +19 -0
- package/dist/logic/roles/bhrain/.briefs/grammar/gerunds.1.why.common.[article].md +32 -0
- package/dist/logic/roles/bhrain/.briefs/grammar/gerunds.1.why.term_smells.[article].md +36 -0
- package/dist/logic/roles/bhrain/.briefs/grammar/gerunds.1.why.term_smells.detection.[lesson].md +73 -0
- package/dist/logic/roles/bhrain/.briefs/grammar/gerunds.2.tactic.eliminate.[article].md +55 -0
- package/dist/logic/roles/bhrain/.briefs/grammar/gerunds.2.tactic.eliminate.[lesson].md +41 -0
- package/dist/logic/roles/bhrain/.briefs/grammar/gerunds.3.eliminator.[trait]._.md +66 -0
- package/dist/logic/roles/bhrain/.briefs/grammar/gerunds.3.eliminator.[trait].balance.md +36 -0
- package/dist/logic/roles/bhrain/.briefs/grammar/gerunds.3.eliminator.[trait].bane.md +34 -0
- package/dist/logic/roles/bhrain/.briefs/grammar/gerunds.3.eliminator.[trait].boon.md +35 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno101.primitives.1.ontology.[article].frame.docs_as_materializations.md +63 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno101.primitives.1.ontology.[article].frame.docs_as_references.md +45 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno101.primitives.2.rel.many_to_many.[article].md +37 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno101.primitives.3.instances.[article].md +39 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno101.primitives.4.documents.[article].md +37 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno101.primitives.5.concepts.[article].md +39 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno201.documents._.[article].md +48 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno201.documents._.[catalog].md +52 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno201.documents.articles.[article].md +40 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno201.documents.catalogs.[article].md +41 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno201.documents.demos.[article].md +42 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno201.documents.lessons.[article].md +42 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.compression.1.refs._.[article].md +41 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.compression.2.kernels._.[article].i1.md +50 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.compression.3.briefs._.[article].md +40 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.compression._.[article].md +90 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.compression._.[catalog].persp.garden.md +64 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.1.from_instances.[article].md +45 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.1.from_instances.[demo].algorithm.md +54 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.1.from_instances.[demo].color.md +56 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.1.from_instances.[demo].empathy.md +54 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.1.from_instances.[demo].entropy.md +54 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.1.from_instances.[demo].gravity.md +54 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.1.from_instances.[demo].joke.md +56 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.1.from_instances.[demo].value.md +54 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.2._.[catalog].md +43 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.2.articulate.[article].md +27 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.2.articulate.[lesson].md +49 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.2.catalogize.[article].md +27 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.2.catalogize.[lesson].md +54 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.2.demonstrate.[article].md +26 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.2.demonstrate.[lesson].md +49 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.2.lessonize.[article].md +26 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.enbrief.2.lessonize.[lesson].md +54 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.kernelize._.[article].md +58 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno301.doc.kernelize._.[lesson].md +88 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno351.docs.are_instances.[article].md +34 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno351.docs.recursion.[catalog].md +44 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno401.actors.1.role.author.[article].md +36 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno401.actors.1.role.librarian.[article].md +40 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno401.actors.2.interdependence.[article].md +52 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno501.doc.enbrief.catalog.structure1.[article].md +53 -0
- package/dist/logic/roles/bhrain/.briefs/knowledge/kno501.doc.enbrief.catalog.structure1.[lesson].template.md +101 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.context/article.variant.vision.[article].md +60 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.context/term.expectation.vs_assumption._.md +60 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.context/term.frame.vs_perspective.[article].md +96 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.context/term.invariant.[article].md +29 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.context/term.lesson._vs_article.[article].md +36 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.context/term.ref._vs_brief.md +90 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.context/term.referent.[article].md +43 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.context/usage.lesson_vs_article.[lesson].md +31 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.context/usage.lesson_vs_article_vs_demo.[lesson].md +37 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/.readme.md +12 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>._.[article].frame.cognitive.md +33 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>._.[article].frame.tactical.md +45 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>.tactic.[catalog].md +83 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>.tactic.concept_dimension.examples.[article][seed].md +4 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>.tactic.concept_dimension.invariants.[article].md +36 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>.tactic.from.examples.md +44 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>.tactic.from.seed.md +48 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>.tactic.with.templates.[article].md +57 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>.tactic.with.templates.[gallery][review].effective.md +1 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<articulate>.tone.bluecollar.[article][seed].md +5 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<catalogize>._.[article][seed].md +3 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<catalogize>.observation.via_clusterage_over_via_imagination.[seed].md +6 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<catalogize>.vs_diverge.[article].persp.save_compute.md +46 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>._.[article].frame.colloquial.i2.by_grok.md +64 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.[catalog].md +106 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.contrast.[demo].usecase.vs_userjourney.by_chatgpt.md +45 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.counter.[demo].usecase.flyer.by_chargpt.md +38 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.counter.[demo].walkability.phoenix.by_chargpt.md +41 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.example.[demo].shear_force.scissors.by_grok.md +52 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.example.[demo].tea.darjeeling.by_grok.md +50 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.example.[demo].usecase.book_flight.by_grok.md +54 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.example.[demo].usecase.order_food.by_chatgpt.md +40 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.example.[demo].walkability.portland.by_chatgpt.i3.md +42 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.example.[demo].walkability.portland.by_grok.i2.md +49 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.example.[lesson].howto.md +28 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.example.structure.[article].i2.md +73 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.narrative.[demo].usecase.order_online.by_chatgpt.md +34 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/<demonstrate>.variants.walkthrough.[demo].usecase.book_online.by_chatgpt.md +47 -0
- package/dist/logic/roles/bhrain/.briefs/librarian.tactics/[brief].verbiage.outline.over.narrative.md +55 -0
- package/dist/logic/roles/bhrain/.briefs/logistics/term.logistics.[article].md +21 -0
- package/dist/logic/roles/bhrain/.briefs/logistics/term.logistics.of_information.[article].md +22 -0
- package/dist/logic/roles/bhrain/.briefs/logistics/term.logistics.of_knowledge.[article].md +29 -0
- package/dist/logic/roles/bhrain/.briefs/physics/optics.focal.acuity.md +77 -0
- package/dist/logic/roles/bhrain/.briefs/physics/optics.focal.breadth.md +74 -0
- package/dist/logic/roles/bhrain/.briefs/physics/optics.focal.depth.md +77 -0
- package/dist/logic/roles/bhrain/.briefs/physics/optics.focal.distance.md +92 -0
- package/dist/logic/roles/bhrain/.briefs/physics/optics.focal.tradeoffs.md +107 -0
- package/dist/logic/roles/bhrain/.briefs/tactician/tactics.compose.traits_and_skills.[article].md +76 -0
- package/dist/logic/roles/bhrain/.briefs/tactician/trait.articulation.[article].md +67 -0
- package/dist/logic/roles/bhrain/.briefs/tactician/trait.purpose.[article].md +56 -0
- package/dist/logic/roles/bhrain/.briefs/tactician/trait.vs_skill.[article].md +55 -0
- package/dist/logic/roles/bhrain/.briefs/tactician/trait.vs_tactic.[article].md +70 -0
- package/dist/logic/roles/bhrain/.briefs/terms.motive.intent.goal.md +46 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<cluster>._.[article].frame.tactical._.md +85 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<cluster>.vs_<diverge>.duality.[article].md +43 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<diverge>._.[article].frame.cognitive.[seed].md +4 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<diverge>._.[article].frame.tactical.md +89 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<elaborate>_vs_<elucidate>.[seed].md +1 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<enquestion>._.[article].md +113 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<enquestion>._.[gallery].plumber.diagnose.md +130 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<enquestion>._.[gallery].thinker.enquestion.md +125 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<enquestion>.tactic.perspectives.[article].md +36 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<triage>._.[article].frame.tactical.md +85 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<triage>.persp.grades_from_context.[article].md +48 -0
- package/dist/logic/roles/bhrain/.briefs/thinker.tactics/<triage>.persp.implicit_question.[article].md +65 -0
- package/dist/logic/roles/bhrain/.briefs/trait.chillnature.md +14 -0
- package/dist/logic/roles/bhrain/.briefs/trait.ocd.md +5 -0
- package/dist/logic/roles/bhrain/.briefs/worders/core.matmuls_vecmuls_elemuls.md +93 -0
- package/dist/logic/roles/bhrain/.briefs/worders/core.transformers.as_origin.md +62 -0
- package/dist/logic/roles/bhrain/.briefs/worders/core.transformers.self_attention.[article].md +93 -0
- package/dist/logic/roles/bhrain/.briefs/worders/core.transformers.self_attention.[demo].ambig.bank.md +80 -0
- package/dist/logic/roles/bhrain/.briefs/worders/core.transformers.self_attention.[demo].cat_sat.md +67 -0
- package/dist/logic/roles/bhrain/.briefs/worders/force.repeat_input_structures.md +48 -0
- package/dist/logic/roles/bhrain/.briefs/worders/knowledge.interdependence.[article].md +37 -0
- package/dist/logic/roles/bhrain/.briefs/worders/knowledge.interdependence.[demo].domain.physics.md +30 -0
- package/dist/logic/roles/bhrain/.briefs/worders/knowledge.internal_vs_external.[article].artist_vs_librarian.md +44 -0
- package/dist/logic/roles/bhrain/.briefs/worders/knowledge.internal_vs_external.[demo].artist_vs_librarian.md +37 -0
- package/dist/logic/roles/bhrain/.briefs/worders/knowledge.internal_vs_external.[demo].domain.physics.md +39 -0
- package/dist/logic/roles/bhrain/.briefs/worders/knowledge.internalized.[article].md +35 -0
- package/dist/logic/roles/bhrain/.briefs/worders/knowledge.internalized.[demo].artist.md +36 -0
- package/dist/logic/roles/bhrain/.briefs/worders/knowledge.internalized.[demo].neural.md +37 -0
- package/dist/logic/roles/bhrain/.briefs/worders/knowledge.internalized.[demo].pianist.md +34 -0
- package/dist/logic/roles/bhrain/.briefs/worders/limits.rhyme.md +46 -0
- package/dist/logic/roles/bhrain/.briefs/worders/limits.spell.md +49 -0
- package/dist/logic/roles/bhrain/.briefs/worders/teach.via.library.examples.md +28 -0
- package/dist/logic/roles/bhrain/.briefs/worders/teach.via.library.explanations_vs_examples.md +40 -0
- package/dist/logic/roles/bhrain/.briefs/worders/trend.prefer_reuse.[seed].md +10 -0
- package/dist/logic/roles/bhrain/brief.articulate/stepArticulate.template.md +120 -0
- package/dist/logic/roles/bhrain/brief.demonstrate/stepDemonstrate.template.md +135 -0
- package/dist/logic/roles/bhrain/khue.cluster/stepCluster.template.md +134 -0
- package/dist/logic/roles/bhrain/khue.diverge/stepDiverge.template.md +110 -0
- package/dist/logic/roles/bhrain/khue.instantiate/stepInstantiate.template.md +73 -0
- package/dist/logic/roles/bhrain/khue.triage/stepTriage.template.md +128 -0
- package/dist/logic/roles/coach/.briefs/claude.context-caching.md +76 -0
- package/dist/logic/roles/designer/.briefs/declarative-over-imperative.md +79 -0
- package/dist/logic/roles/designer/.briefs/declarative-over-imperative.stub.md +14 -0
- package/dist/logic/roles/designer/.briefs/pit-of-success.md +70 -0
- package/dist/logic/roles/designer/.briefs/pit-of-success.stub.md +3 -0
- package/dist/logic/roles/designer/outlineDistilisys/stepOutlineDistilisys.template.md +173 -0
- package/dist/logic/roles/designer/outlineRoadmap/stepOutlineRoadmap.template.md +88 -0
- package/dist/logic/roles/designer/outlineVision/stepOutlineVision.template.md +47 -0
- package/dist/logic/roles/ecologist/.briefs/.readme.md +17 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys101.distilisys.grammar.md +221 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys201.actor.motive._.summary.md +82 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys201.actor.motive.p1.reversibility.entropy.md +39 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys201.actor.motive.p2.option.chance.choice.md +140 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys201.actor.motive.p3.chance.motive.polarity.threat.md +72 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys201.actor.motive.p4.motive.horizon.md +101 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys201.actor.motive.p5.motive.grammar.md +131 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys211.actor.resources._.primitives.summary.md +108 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys211.actor.resources.pt1.primitive.time.md +56 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys211.actor.resources.pt2.primitive.energy.md +69 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys211.actor.resources.pt3.primitive.space.md +85 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys211.actor.resources.pt4.primitive.claim.md +113 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys211.actor.resources.pt5.composites.md +146 -0
- package/dist/logic/roles/ecologist/.briefs/distilisys/sys231.actor.claims.p1.primitive.exchange.md +130 -0
- package/dist/logic/roles/ecologist/.briefs/ecology/.eco001.origin.prompt.md +11 -0
- package/dist/logic/roles/ecologist/.briefs/ecology/eco001.overview.md +44 -0
- package/dist/logic/roles/ecologist/.briefs/ecology/eco101.core-system-understanding.md +70 -0
- package/dist/logic/roles/ecologist/.briefs/ecology/eco101.p1.ecosystem-structure.md +62 -0
- package/dist/logic/roles/ecologist/.briefs/ecology/eco101.p2.trophic-dynamics.md +59 -0
- package/dist/logic/roles/ecologist/.briefs/ecology/eco101.p3.population-ecology.md +71 -0
- package/dist/logic/roles/ecologist/.briefs/ecology/eco101.p4.community-interactions.md +78 -0
- package/dist/logic/roles/ecologist/.briefs/ecology/eco505.systems-thinking.md +62 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ001.overview.md +65 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ101.core-mechanics.md +65 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ101.p1.supply-and-demand.md +76 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ101.p2.opportunity-cost.md +106 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ101.p3.marginal-analysis.md +79 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ101.p4.rational-choice.md +81 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ201.market-structures-and-failures.md +81 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ301.production-and-growth.md +71 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ401.macro-systems.md +92 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ501.global-and-institutional.md +85 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ501.p1.game-theory.md +142 -0
- package/dist/logic/roles/ecologist/.briefs/economy/econ501.p4.behavioral-economics.md +146 -0
- package/dist/logic/roles/ecologist/.briefs/product/user.journey._.[article].i1.md +68 -0
- package/dist/logic/roles/ecologist/.briefs/product/user.journey._.[article].md +0 -0
- package/dist/logic/roles/ecologist/.briefs/product/user.journey.purpose.[article].i1.md +52 -0
- package/dist/logic/roles/ecologist/.briefs/product/user.journey.purpose.[article].md +52 -0
- package/dist/logic/roles/ecologist/.briefs/term.distillation.md +93 -0
- package/dist/logic/roles/mechanic/.briefs/architecture/bounded-contexts.md +61 -0
- package/dist/logic/roles/mechanic/.briefs/architecture/directional-dependencies.md +82 -0
- package/dist/logic/roles/mechanic/.briefs/architecture/domain-driven-design.md +61 -0
- package/dist/logic/roles/mechanic/.briefs/architecture/ubiqlang.md +37 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/_mech.compressed.md +57 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/_mech.compressed.prompt.md +5 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/flow.failfast.md +37 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/flow.idempotency.md +63 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/flow.immutability.md +48 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/flow.narratives.md +74 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/flow.single-responsibility.md +67 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/flow.transformers_over_conditionals.[lesson].md +97 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/mech.args.input-context.md +61 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/mech.args.input-inline.md +63 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/mech.arrowonly.md +47 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/mech.clear-contracts.md +53 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/mech.tests.given-when-then.md +62 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/mech.what-why.md +88 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/mech.what-why.v2.md +98 -0
- package/dist/logic/roles/mechanic/.briefs/codestyle/pit-of-success.via.minimize-surface-area.md +58 -0
- package/dist/logic/roles/mechanic/.briefs/criteria.practices/never.term.script.md +7 -0
- package/dist/logic/roles/mechanic/.briefs/criteria.practices/prefer.emojis.chill_nature.md +24 -0
- package/dist/logic/roles/mechanic/.briefs/criteria.practices/prefer.jq.over_alt.[demo].md +29 -0
- package/dist/logic/roles/mechanic/.briefs/criteria.practices/prefer.terraform.[criteria].md +4 -0
- package/dist/logic/roles/mechanic/.briefs/criteria.practices/prefer.terraform.[seed].md +17 -0
- package/dist/logic/roles/mechanic/.briefs/criteria.practices/require.dependency.pinned_versions.md +3 -0
- package/dist/logic/roles/mechanic/.briefs/criteria.practices/require.idempotency.md +33 -0
- package/dist/logic/roles/mechanic/.briefs/criteria.practices/require.knowledge.externalized.md +17 -0
- package/dist/logic/roles/mechanic/.briefs/engineer/dependency-injection.md +118 -0
- package/dist/logic/roles/mechanic/.briefs/engineer/dependency-injection.stub.md +11 -0
- package/dist/logic/roles/mechanic/.briefs/lessons/code.prod.typescript.types/bivariance_vs_contravariance.[lesson].md +95 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.contract.inputs.nameargs/bad-practice/forbid.positional-args.md +43 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.contract.inputs.nameargs/best-practice/require.namedargs.md +6 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.declarative/.readme.md +0 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.declarative/best-practice/declastruct.[demo].md +485 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.domain.objects/bad-practices/blocker.has.attributes.nullable.md +13 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.domain.objects/bad-practices/blocker.has.attributes.undefined.md +15 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.domain.objects/bad-practices/blocker.refs.immuatble.md +9 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.domain.objects/best-practice/ref.package.domain-objects.[readme].md +585 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.domain.operations/best-practice/require.sync.names.md +14 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.errors.failfast/bad-practices/forbid.failhide.md +19 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.errors.failfast/bad-practices/forbid.hide_errors.md +13 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.errors.failfast/best-practice/prefer.HelpfulError.wrap.md +54 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.errors.failfast/best-practice/require.fail_fast.[demo].shell.md +17 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.errors.failfast/best-practice/require.fail_fast.md +28 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.narrative/bad-practices/forbid.else.md +54 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.narrative/best-practice/early-returns.named-checks.[demo].md +181 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.repo.structure/bad-practices/forbid.barrel.exports.ts.md +41 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.repo.structure/bad-practices/forbid.index.ts.md +3 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.repo.structure/best-practice/directional-dependencies.md +82 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.repo.structure/best-practice/dot-test-and-dot-temp.md +20 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.prod.typescript.utils/best-practice/ref.package.as-command.[tips].md +7 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.acceptance/best-practice/blackbox.md +5 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/howto.diagnose.[lesson].md +14 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/howto.run.[lesson].md +18 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/howto.use.[lesson].md +20 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/howto.write.[lesson].md +3 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/howto.write.[lesson].on_scope.for_integ.md +8 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/howto.write.[lesson].on_scope.for_units.md +9 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/howto.write.bdd.[lesson].md +280 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/prefer.datadriven.md +41 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/ref.test-fns.[readme].md +185 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/code.test.howto/best-practice/whento.snapshots.[lesson].md +23 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/lang.terms/.readme.md +1 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/lang.terms/bad-practices/forbid.term=existing.md +10 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/lang.terms/best-practice/require.order.noun_adj.md +39 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/lang.terms/domain=practices.terms=forbid_prefer_desire_require.md +13 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/lang.terms/domain=software.terms=prodcode_vs_testcode.md +7 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/lang.tones/.readme.md +3 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/lang.tones/prefer.chill-nature.md +0 -0
- package/dist/logic/roles/mechanic/.briefs/patterns/lang.tones/prefer.lowercase.md +0 -0
- package/dist/logic/roles/mechanic/.briefs/style.compressed.md +29 -0
- package/dist/logic/roles/mechanic/.briefs/style.compressed.prompt.md +5 -0
- package/dist/logic/roles/mechanic/.briefs/style.names.treestruct.md +48 -0
- package/dist/logic/roles/mechanic/.briefs/style.names.ubiqlang.md +37 -0
- package/dist/logic/roles/mechanic/.briefs/style.words.lowercase.md +36 -0
- package/dist/logic/roles/mechanic/.briefs/terms/badpractice/script.md +9 -0
- package/dist/logic/roles/mechanic/.briefs/terms/plan.exec_vs_apply.md +45 -0
- package/dist/logic/roles/mechanic/.skills/claude.hooks/check.pretooluse.permissions.sh +346 -0
- package/dist/logic/roles/mechanic/.skills/claude.hooks/forbid.stderr.redirect.sh +57 -0
- package/dist/logic/roles/mechanic/.skills/claude.tools/mvsafe.sh +75 -0
- package/dist/logic/roles/mechanic/.skills/declapract.upgrade.sh +50 -0
- package/dist/logic/roles/mechanic/.skills/git.worktree.common.sh +58 -0
- package/dist/logic/roles/mechanic/.skills/git.worktree.del.sh +51 -0
- package/dist/logic/roles/mechanic/.skills/git.worktree.get.sh +51 -0
- package/dist/logic/roles/mechanic/.skills/git.worktree.set.sh +108 -0
- package/dist/logic/roles/mechanic/.skills/git.worktree.sh +46 -0
- package/dist/logic/roles/mechanic/.skills/init.bhuild.sh +260 -0
- package/dist/logic/roles/mechanic/.skills/init.claude.hooks.forbid.stderr.redirect.sh +116 -0
- package/dist/logic/roles/mechanic/.skills/init.claude.hooks.pretooluse.sh +118 -0
- package/dist/logic/roles/mechanic/.skills/init.claude.hooks.sessionstart.sh +113 -0
- package/dist/logic/roles/mechanic/.skills/init.claude.hooks.sh +25 -0
- package/dist/logic/roles/mechanic/.skills/init.claude.permissions.sh +159 -0
- package/dist/logic/roles/mechanic/.skills/init.claude.sh +47 -0
- package/dist/logic/roles/mechanic/.skills/link.claude.transcripts.sh +43 -0
- package/dist/logic/roles/mechanic/.skills/test.integration.sh +50 -0
- package/dist/logic/roles/mechanic/codediff/routeArtistCodeDiff.template.md +46 -0
- package/dist/logic/roles/mechanic/codediff/routeCriticCodeReviewArchitecture.template.md +78 -0
- package/dist/logic/roles/mechanic/codediff/routeCriticCodeReviewCodestyle.template.md +75 -0
- package/dist/logic/roles/mechanic/codediff/routeJudgeReleasable.template.md +67 -0
- package/dist/logic/roles/mechanic/study/routeStudyAsk.template.md +73 -0
- package/dist/logic/roles/mechanic/write/.test/prior.template.md +21 -0
- package/dist/logic/roles/mechanic/write/stepWrite.template.md +38 -0
- package/package.json +2 -2
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# How to Write BDD Style Tests
|
|
2
|
+
|
|
3
|
+
This guide explains the pattern for writing integration tests using `test-fns` with `given`, `when`, `then`, and `useBeforeAll`.
|
|
4
|
+
|
|
5
|
+
## Core Pattern
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { given, when, then, useBeforeAll } from 'test-fns';
|
|
9
|
+
|
|
10
|
+
describe('featureName', () => {
|
|
11
|
+
// Shared setup for all tests in the describe block
|
|
12
|
+
const dbConnection = useBeforeAll(() => getDatabaseConnection());
|
|
13
|
+
afterAll(async () => dbConnection.end());
|
|
14
|
+
|
|
15
|
+
given('[case1] description of the initial state', () => {
|
|
16
|
+
// Setup specific to this case, shared across all when/then blocks
|
|
17
|
+
const scene = useBeforeAll(async () => {
|
|
18
|
+
// Create test data
|
|
19
|
+
const entity = await createEntity({ dbConnection });
|
|
20
|
+
return { entity };
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
when('[t0] action or event occurs', () => {
|
|
24
|
+
then('expected outcome', async () => {
|
|
25
|
+
// Execute and verify using scene.entity
|
|
26
|
+
const result = await performAction({ id: scene.entity.id });
|
|
27
|
+
expect(result).toEqual(expectedValue);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
when('[t1] different action occurs', () => {
|
|
32
|
+
then('different expected outcome', async () => {
|
|
33
|
+
// Another test using the same scene
|
|
34
|
+
const result = await performOtherAction({ id: scene.entity.id });
|
|
35
|
+
expect(result).toEqual(otherExpectedValue);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Key Principles
|
|
43
|
+
|
|
44
|
+
### 1. Wrap Everything in `describe`
|
|
45
|
+
|
|
46
|
+
All tests for a feature should be wrapped in a single `describe` block:
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
describe('syncPhoneFromWhodis', () => {
|
|
50
|
+
// all given/when/then blocks go here
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 2. Use `useBeforeAll` for shared resources
|
|
55
|
+
|
|
56
|
+
Instead of `let` + `beforeAll` + `afterAll`:
|
|
57
|
+
|
|
58
|
+
e.g.,
|
|
59
|
+
```typescript
|
|
60
|
+
// ❌ Don't do this
|
|
61
|
+
let dbConnection: DatabaseConnection;
|
|
62
|
+
beforeAll(async () => {
|
|
63
|
+
dbConnection = await getDatabaseConnection();
|
|
64
|
+
});
|
|
65
|
+
afterAll(async () => {
|
|
66
|
+
await dbConnection.end();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// ✅ Do this
|
|
70
|
+
const dbConnection = useBeforeAll(() => getDatabaseConnection());
|
|
71
|
+
afterAll(async () => dbConnection.end());
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 3. Label given(scenes) with `[caseN]`
|
|
75
|
+
|
|
76
|
+
Each `given` block should have a unique case label:
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
given('[case1] doer with outdated phone', () => { ... });
|
|
80
|
+
given('[case2] doer with matching phone', () => { ... });
|
|
81
|
+
given('[case3] doer does not exist', () => { ... });
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 4. Label when(event) with `[tN]`
|
|
85
|
+
|
|
86
|
+
Each `when` block should have an event time index label. The counter resets within each `given` block:
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
given('[case1] first scenario', () => {
|
|
90
|
+
when('[t0] command executed in PLAN mode', () => { ... });
|
|
91
|
+
when('[t1] command executed in EXECUTE mode', () => { ... });
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
given('[case2] second scenario', () => {
|
|
95
|
+
when('[t0] first action', () => { ... }); // counter resets to 0
|
|
96
|
+
when('[t1] second action', () => { ... });
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 5. One Behavioral Assertion per `then` Block
|
|
101
|
+
|
|
102
|
+
Each `then` block should test a single behavioral assertion. This makes test failures more precise and test names more descriptive:
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// ❌ Don't do this - multiple assertions in one then
|
|
106
|
+
when('[t0] command executed in PLAN mode', () => {
|
|
107
|
+
then('decision is UPDATE and doer remains unchanged', async () => {
|
|
108
|
+
const result = await command({ mode: 'PLAN' });
|
|
109
|
+
expect(result.decision).toEqual('UPDATE');
|
|
110
|
+
expect(result.before.doer.contactPhoneNumber).toEqual('+13175550200');
|
|
111
|
+
|
|
112
|
+
const doerAfter = await doerDao.findByUnique({ dbConnection, userUuid });
|
|
113
|
+
expect(doerAfter?.contactPhoneNumber).toEqual('+13175550200');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// ✅ Do this - separate then blocks for each behavioral assertion
|
|
118
|
+
when('[t0] command executed in PLAN mode', () => {
|
|
119
|
+
then('decision is "UPDATE"', async () => {
|
|
120
|
+
const result = await command({ mode: 'PLAN' });
|
|
121
|
+
expect(result.decision).toEqual('UPDATE');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
then('before.doer.contactPhoneNumber is "+13175550200"', async () => {
|
|
125
|
+
const result = await command({ mode: 'PLAN' });
|
|
126
|
+
expect(result.before.doer.contactPhoneNumber).toEqual('+13175550200');
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
then('doer contactPhoneNumber remains unchanged', async () => {
|
|
130
|
+
await command({ mode: 'PLAN' });
|
|
131
|
+
const doerAfter = await doerDao.findByUnique({ dbConnection, userUuid });
|
|
132
|
+
expect(doerAfter?.contactPhoneNumber).toEqual('+13175550200');
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 6. Use `scene` for Shared Test Data
|
|
138
|
+
|
|
139
|
+
When multiple `when/then` blocks need the same test data, use `useBeforeAll` to create a `scene`:
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
given('[case1] description', () => {
|
|
143
|
+
const scene = useBeforeAll(async () => {
|
|
144
|
+
const doer = await createDoer({ dbConnection });
|
|
145
|
+
const provider = await createProvider({ dbConnection, doerId: doer.id });
|
|
146
|
+
return { doer, provider };
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
when('[t0] first test', () => {
|
|
150
|
+
then('outcome', async () => {
|
|
151
|
+
// Access scene.doer and scene.provider
|
|
152
|
+
const result = await action({ doerId: scene.doer.id });
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
when('[t1] second test', () => {
|
|
157
|
+
then('outcome', async () => {
|
|
158
|
+
// Same scene is reused
|
|
159
|
+
const result = await otherAction({ providerId: scene.provider.id });
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 7. Cases Without Setup
|
|
166
|
+
|
|
167
|
+
If a case doesn't need setup (e.g., testing error handling with invalid input), skip the `scene`:
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
given('[case4] valid userUuid', () => {
|
|
171
|
+
when('[t7] Whodis user cannot be found', () => {
|
|
172
|
+
then('command throws error', async () => {
|
|
173
|
+
await expect(
|
|
174
|
+
command({ userUuid: '00000000-0000-0000-0000-000000000001' }),
|
|
175
|
+
).rejects.toThrow('Whodis user not found');
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Complete Example
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
import { given, when, then, useBeforeAll } from 'test-fns';
|
|
185
|
+
import { getDatabaseConnection } from '../../utils/database/getDatabaseConnection';
|
|
186
|
+
import { myCommand } from './myCommand';
|
|
187
|
+
|
|
188
|
+
describe('myCommand', () => {
|
|
189
|
+
const dbConnection = useBeforeAll(() => getDatabaseConnection());
|
|
190
|
+
afterAll(async () => dbConnection.end());
|
|
191
|
+
|
|
192
|
+
given('[case1] entity exists with state A', () => {
|
|
193
|
+
const scene = useBeforeAll(async () => {
|
|
194
|
+
const entity = await createEntity({
|
|
195
|
+
dbConnection,
|
|
196
|
+
state: 'A',
|
|
197
|
+
});
|
|
198
|
+
return { entity };
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
when('[t0] command executed in PLAN mode', () => {
|
|
202
|
+
then('decision is "UPDATE"', async () => {
|
|
203
|
+
const result = await myCommand({
|
|
204
|
+
entityId: scene.entity.id,
|
|
205
|
+
mode: 'PLAN',
|
|
206
|
+
});
|
|
207
|
+
expect(result.decision).toEqual('UPDATE');
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
then('entity state remains "A"', async () => {
|
|
211
|
+
await myCommand({ entityId: scene.entity.id, mode: 'PLAN' });
|
|
212
|
+
const entityAfter = await findEntity({ dbConnection, id: scene.entity.id });
|
|
213
|
+
expect(entityAfter.state).toEqual('A');
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
when('[t1] command executed in EXECUTE mode', () => {
|
|
218
|
+
then('decision is "UPDATE"', async () => {
|
|
219
|
+
const result = await myCommand({
|
|
220
|
+
entityId: scene.entity.id,
|
|
221
|
+
mode: 'EXECUTE',
|
|
222
|
+
});
|
|
223
|
+
expect(result.decision).toEqual('UPDATE');
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
then('after.state is "B"', async () => {
|
|
227
|
+
const result = await myCommand({
|
|
228
|
+
entityId: scene.entity.id,
|
|
229
|
+
mode: 'EXECUTE',
|
|
230
|
+
});
|
|
231
|
+
expect(result.after.state).toEqual('B');
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
then('entity state is updated to "B"', async () => {
|
|
235
|
+
await myCommand({ entityId: scene.entity.id, mode: 'EXECUTE' });
|
|
236
|
+
const entityAfter = await findEntity({ dbConnection, id: scene.entity.id });
|
|
237
|
+
expect(entityAfter.state).toEqual('B');
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
given('[case2] entity already in state B', () => {
|
|
243
|
+
const scene = useBeforeAll(async () => {
|
|
244
|
+
const entity = await createEntity({
|
|
245
|
+
dbConnection,
|
|
246
|
+
state: 'B',
|
|
247
|
+
});
|
|
248
|
+
return { entity };
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
when('[t0] command executed', () => {
|
|
252
|
+
then('decision is "NOCHANGE"', async () => {
|
|
253
|
+
const result = await myCommand({
|
|
254
|
+
entityId: scene.entity.id,
|
|
255
|
+
mode: 'EXECUTE',
|
|
256
|
+
});
|
|
257
|
+
expect(result.decision).toEqual('NOCHANGE');
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
given('[case3] invalid entityId', () => {
|
|
263
|
+
when('[t0] command executed', () => {
|
|
264
|
+
then('throws error', async () => {
|
|
265
|
+
await expect(
|
|
266
|
+
myCommand({ entityId: 'invalid-id', mode: 'PLAN' }),
|
|
267
|
+
).rejects.toThrow('Entity not found');
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Benefits
|
|
275
|
+
|
|
276
|
+
1. **Readable test output**: Test names clearly show the scenario being tested
|
|
277
|
+
2. **Efficient setup**: `useBeforeAll` runs once per `given` block, not per test
|
|
278
|
+
3. **Immutable references**: `const scene` and `const dbConnection` prevent accidental reassignment
|
|
279
|
+
4. **Clear labeling**: `[caseN]` and `[tN]` labels make it easy to identify and discuss specific tests
|
|
280
|
+
5. **Black-box testing**: Tests interact only through the contract layer, not internal implementations
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
when possible, prefer data driven, caselist based, tests
|
|
2
|
+
|
|
3
|
+
this is especially applicable for unit tests, which often evaluate a transform
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
for example
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
|
|
13
|
+
const TEST_CASES = [
|
|
14
|
+
{
|
|
15
|
+
description: 'capitalizes the first word in a sentence',
|
|
16
|
+
given: {
|
|
17
|
+
input: 'the bird is in the basket',
|
|
18
|
+
},
|
|
19
|
+
expect: {
|
|
20
|
+
output: 'The bird is in the basket',
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
description: 'retains existing capitals in the sentence',
|
|
25
|
+
given: {
|
|
26
|
+
input: 'that Doctor Goose is a loon!',
|
|
27
|
+
},
|
|
28
|
+
expect: {
|
|
29
|
+
output: 'That Doctor Goose is a loon!',
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
describe('asSentenceCase', () => {
|
|
35
|
+
TEST_CASES.map(thisCase => test(thisCase.description, () => {
|
|
36
|
+
const output = asSentenceCase(thisCase.given.input);
|
|
37
|
+
expect(output).toEqual(thisCase.expect.output);
|
|
38
|
+
}))
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
```
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# test-fns
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+
|
|
6
|
+
write usecase driven tests systematically for simpler, safer, and more readable code
|
|
7
|
+
|
|
8
|
+
# purpose
|
|
9
|
+
|
|
10
|
+
establishes a pattern of writing tests for simpler, safer, and more readable code.
|
|
11
|
+
|
|
12
|
+
by defining tests in terms of usecases (`given`, `when`, `then`) your tests are
|
|
13
|
+
- simpler to write
|
|
14
|
+
- easier to read
|
|
15
|
+
- safer to trust
|
|
16
|
+
|
|
17
|
+
# install
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
npm install --save test-fns
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
# use
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
type Plant = { id: number, hydration: 'DRY' | 'WET' };
|
|
27
|
+
const doesPlantNeedWater = (plant: Plant) => plant.hydration === 'DRY';
|
|
28
|
+
|
|
29
|
+
describe('doesPlantNeedWater', () => {
|
|
30
|
+
given('a plant', () => {
|
|
31
|
+
when('the plant doesnt have enough water', () => {
|
|
32
|
+
const plant: Plant = {
|
|
33
|
+
id: 7,
|
|
34
|
+
hydration: 'DRY',
|
|
35
|
+
};
|
|
36
|
+
then('it should return true', () => {
|
|
37
|
+
expect(doesPlantNeedWater(plant)).toEqual(true)
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
produces
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
PASS src/givenWhenThen.test.ts
|
|
48
|
+
doesPlantNeedWater
|
|
49
|
+
given: a plant
|
|
50
|
+
when: the plant doesnt have enough water
|
|
51
|
+
✓ then: it should return true (1 ms)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
# features
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
### .runIf(condition) && .skipIf(condition)
|
|
58
|
+
|
|
59
|
+
skip running the suite if the condition is not met
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
describe('your test', () => {
|
|
63
|
+
given.runIf(onLocalMachine)('some test that should only run locally', () => {
|
|
64
|
+
then.skipIf(onProduction)('some test that should not run against production', () => {
|
|
65
|
+
expect(onProduction).toBeFalse()
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### usePrep
|
|
72
|
+
|
|
73
|
+
prepare test scenarios within a .given/.when block asynchronously, without any `let`s or `beforeAll`s
|
|
74
|
+
|
|
75
|
+
`usePrep` accepts a `mode` option to control when setup runs:
|
|
76
|
+
- `mode: 'beforeAll'` - runs setup once for all tests (default)
|
|
77
|
+
- `mode: 'beforeEach'` - runs setup fresh before each test
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
given('an overdue invoice', () => {
|
|
81
|
+
const invoice = usePrep(async () => {
|
|
82
|
+
const invoiceOverdue = await ... // your logic
|
|
83
|
+
return invoiceOverdue;
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
then('it should invoke a reminder', async () => {
|
|
87
|
+
const result = await nurtureInvoice({ invoice }, context)
|
|
88
|
+
expect(result.sent.reminder).toEqual(true)
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**useBeforeAll and useBeforeEach are convenience wrappers** around `usePrep`:
|
|
94
|
+
- `useBeforeAll(setup)` is equivalent to `usePrep(setup, { mode: 'beforeAll' })`
|
|
95
|
+
- `useBeforeEach(setup)` is equivalent to `usePrep(setup, { mode: 'beforeEach' })`
|
|
96
|
+
|
|
97
|
+
Use the named functions for clarity about when setup runs.
|
|
98
|
+
|
|
99
|
+
### useBeforeAll
|
|
100
|
+
|
|
101
|
+
prepare test resources once for all tests in a suite, optimizing setup time for expensive operations
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
describe('spaceship refueling system', () => {
|
|
105
|
+
given('a spaceship that needs to refuel', () => {
|
|
106
|
+
const spaceship = useBeforeAll(async () => {
|
|
107
|
+
// This runs once before all tests in this suite
|
|
108
|
+
const ship = await prepareExampleSpaceship();
|
|
109
|
+
await ship.dock();
|
|
110
|
+
return ship;
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
when('no changes are made', () => {
|
|
114
|
+
then('it should be docked', async () => {
|
|
115
|
+
expect(spaceship.isDocked).toEqual(true);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
then('it should need fuel', async () => {
|
|
119
|
+
expect(spaceship.fuelLevel).toBeLessThan(spaceship.fuelCapacity);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
when('it connects to the fuel station', () => {
|
|
124
|
+
const result = useBeforeAll(async () => await spaceship.connectToFuelStation());
|
|
125
|
+
|
|
126
|
+
then('it should be connected', async () => {
|
|
127
|
+
expect(result.connected).toEqual(true);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
then('it should calculate required fuel', async () => {
|
|
131
|
+
expect(result.fuelNeeded).toBeGreaterThan(0);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### useBeforeEach
|
|
139
|
+
|
|
140
|
+
prepare fresh test resources before each test, ensuring test isolation
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
describe('spaceship combat system', () => {
|
|
144
|
+
given('a spaceship in battle', () => {
|
|
145
|
+
// This runs before each test, ensuring a fresh spaceship
|
|
146
|
+
const spaceship = useBeforeEach(async () => {
|
|
147
|
+
const ship = await prepareExampleSpaceship();
|
|
148
|
+
await ship.resetShields();
|
|
149
|
+
return ship;
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
when('no changes are made', () => {
|
|
153
|
+
then('it should have full shields', async () => {
|
|
154
|
+
expect(spaceship.shields).toEqual(100);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
then('it should be ready for combat', async () => {
|
|
158
|
+
expect(spaceship.status).toEqual('READY');
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
when('it takes damage', () => {
|
|
163
|
+
const result = useBeforeEach(async () => await spaceship.takeDamage(25));
|
|
164
|
+
|
|
165
|
+
then('it should reduce shield strength', async () => {
|
|
166
|
+
expect(spaceship.shields).toEqual(75);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
then('it should return damage report', async () => {
|
|
170
|
+
expect(result.damageReceived).toEqual(25);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**When to use each:**
|
|
178
|
+
- `useBeforeAll`: Use when setup is expensive (database connections, API calls) and tests don't modify the resource
|
|
179
|
+
- `useBeforeEach`: Use when tests modify the resource and need isolation between runs
|
|
180
|
+
- `usePrep`: The base function that powers both - use when you want explicit control over the mode or need to dynamically choose between `beforeAll` and `beforeEach`
|
|
181
|
+
|
|
182
|
+
**Key differences:**
|
|
183
|
+
- All three functions (`usePrep`, `useBeforeAll`, `useBeforeEach`) create a proxy that defers setup until the test framework's lifecycle hooks run
|
|
184
|
+
- `useBeforeAll` and `useBeforeEach` are just clearer, more readable shortcuts for `usePrep` with a specific mode
|
|
185
|
+
- Choose based on readability: use `useBeforeAll`/`useBeforeEach` for explicit intent, or `usePrep` when mode needs to be configurable
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
use snapshots whenever output artifacts are created
|
|
2
|
+
|
|
3
|
+
why?
|
|
4
|
+
- makes it easier to review in prs what is actually being produced
|
|
5
|
+
- e.g., visual spotcheck, make sure it looks good
|
|
6
|
+
- especially important when the output is userfacing (e.g., codegen, comms, etc)
|
|
7
|
+
|
|
8
|
+
- makes it easier to detect exactly what the impact of a change is
|
|
9
|
+
- most of the time its intended and the snapshot can just be updated
|
|
10
|
+
- sometimes though, the snapshot diff exposes critical differences that are blockers or nitpicks that need to be addressed
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
critical:
|
|
16
|
+
|
|
17
|
+
use both
|
|
18
|
+
- a snapshot
|
|
19
|
+
- AND
|
|
20
|
+
- explicit assertions before the snapshot
|
|
21
|
+
|
|
22
|
+
snapshot is for observability in code reviews and aesthetic verification
|
|
23
|
+
assertions are for functional verification
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
practices on which terms to use to promote a ubiquitous language go here
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
always use [noun][adjective] order
|
|
2
|
+
|
|
3
|
+
e.g.,
|
|
4
|
+
|
|
5
|
+
instead of
|
|
6
|
+
|
|
7
|
+
currentOwner = [adj][noun]
|
|
8
|
+
|
|
9
|
+
prefer
|
|
10
|
+
|
|
11
|
+
ownerCurrent = [noun][adj]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
instead of
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
foundUser
|
|
20
|
+
|
|
21
|
+
prefer
|
|
22
|
+
|
|
23
|
+
userFound
|
|
24
|
+
|
|
25
|
+
----
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
why?
|
|
29
|
+
|
|
30
|
+
because it enables autocomplete via common prefixes
|
|
31
|
+
|
|
32
|
+
e.g.,
|
|
33
|
+
|
|
34
|
+
userBefore
|
|
35
|
+
userAfter
|
|
36
|
+
userCreated
|
|
37
|
+
etc
|
|
38
|
+
|
|
39
|
+
can see via autocomplete suggestions all the variants of user available in the current scope, rather than need to remember what the variants are
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
these are the terms we use to describe how to use practices
|
|
2
|
+
|
|
3
|
+
forbid = search to ensure this was not done
|
|
4
|
+
- it's a bad practice
|
|
5
|
+
- it's a BLOCKER if detected
|
|
6
|
+
|
|
7
|
+
prefer = search for opportunities to do this
|
|
8
|
+
- it's a best practice, but not mandatory
|
|
9
|
+
- it's a NITPICK if detected
|
|
10
|
+
|
|
11
|
+
require = search for opportunities to do this
|
|
12
|
+
- it's a best practice, and is mandatory
|
|
13
|
+
- it's a BLOCKER if detected
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
prodcode = the product's code
|
|
2
|
+
- the code that produces the behavior users experience
|
|
3
|
+
- the code that gets shipped to production
|
|
4
|
+
|
|
5
|
+
testcode = the builder's code
|
|
6
|
+
- the code that verifies the behaviors users experience
|
|
7
|
+
- the code that runs at build time to protect production
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// style:tactics (compressed)
|
|
2
|
+
|
|
3
|
+
- name:ubiqlang
|
|
4
|
+
- use one canonical term per concept (e.g., always use `customer`, never `client`, `user`, or `account`)
|
|
5
|
+
- eliminate overloads: each term must refer to exactly one thing (e.g., do not use `update` for both "save" and "fetch")
|
|
6
|
+
- when introducing a new term:
|
|
7
|
+
- define its interface and role
|
|
8
|
+
- document its meaning clearly
|
|
9
|
+
- ensure consistent usage across code, docs, and tests
|
|
10
|
+
|
|
11
|
+
- name:treestruct
|
|
12
|
+
- for mechanisms (procedures, steps, transforms), use `[Verb][NounHierarchy]` format
|
|
13
|
+
- verb must come first and be atomic (e.g., `gen`, `set`, `get`, `map`, `submit`)
|
|
14
|
+
- examples: `genStepImagineViaTemplate`, `setCustomerPhone`
|
|
15
|
+
- for resources (records, results), use `[NounHierarchy][State]?` format
|
|
16
|
+
- `State` is optional and should clarify the form or phase (e.g., `Found`, `Updated`, `Draft`, `Final`)
|
|
17
|
+
- examples: `contentFound`, `invoiceDraft`, `customer`
|
|
18
|
+
- group nouns by domain to maintain treesorted file and symbol organization
|
|
19
|
+
|
|
20
|
+
- words:lowercase
|
|
21
|
+
- use lowercase for all non-code text (comments, prompts, markdown, logs)
|
|
22
|
+
- never capitalize:
|
|
23
|
+
- the start of a sentence
|
|
24
|
+
- generic nouns (`customer`, `step`)
|
|
25
|
+
- verbs (`set`, `submit`, `handle`)
|
|
26
|
+
- system messages or instructions
|
|
27
|
+
- only capitalize:
|
|
28
|
+
- code symbols (e.g., `StitchStepImagine`, `GitRepo`)
|
|
29
|
+
- proper nouns or brand names (e.g., OpenAI, GitHub)
|