Ask Jooby Agent
Tests of the Ask Jooby conversational agent layer: agent routing, tool registration and permissions, conversation and memory services, guards, dynamic SQL table access and the streaming endpoints.
General
AdvancedAnalyticsAgentToolBinderTests
Jube.Test.AskJooby.AdvancedAnalyticsAgentToolBinderTests — 7 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheCatalogueDiscoversTheGroupsTheLayerWasBuiltAround |
Fact | The catalogue discovers the groups the layer was built around. |
EveryDiscoveredGroupBindsAtLeastOneLiveFunction |
Fact | Every discovered group binds at least one live function. |
EveryBoundToolCarriesAPermission |
Fact | Every bound tool carries a permission. |
EveryBoundToolIsNamedAndDescribed |
Fact | Every bound tool is named and described. |
ToolNamesAreUniqueAcrossTheWholeSurface |
Fact | Tool names are unique across the whole surface. |
TheTrainingRunFamiliesAreHeldBackForTheServicePath |
Fact | The training run families are held back for the service path. |
ABoundToolActuallyComputesWhenInvokedAsync |
Fact | A bound tool actually computes when invoked. |
AdvancedAnalyticsCachedTableReaderTests
Jube.Test.AskJooby.AdvancedAnalyticsCachedTableReaderTests — 3 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
GetAsyncConvertsPackedDoublesIntoAGenericallyNamedCachedTableAsync |
Fact | Get async converts packed doubles into a generically named cached table. |
GetAsyncReturnsNullForAnUnknownGuidAsync |
Fact | Get async returns null for an unknown guid. |
GetAsyncReturnsNullForAForeignTenantsPointerAsync |
Fact | Get async returns null for a foreign tenants pointer. |
AdvancedAnalyticsTrainingAgentCoverageTests
Jube.Test.AskJooby.AdvancedAnalyticsTrainingAgentCoverageTests — 9 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryTrainingToolIsEitherOwnedByOneAgentOrUnboundForAStatedReason |
Fact | Every training tool is either owned by one agent or unbound for a stated reason. |
NoTrainingToolIsOwnedByTwoAgentsExceptTheRunControlEveryOneOfThemNeeds |
Fact | No training tool is owned by two agents except the run control every one of them needs. |
EveryClaimedToolActuallyExistsInTheAnalyticsCatalogue |
Fact | Every claimed tool actually exists in the analytics catalogue. |
NoTrainingAgentHoldsMoreThanTheHouseLimit |
Fact | No training agent holds more than the house limit. |
EveryTrainingAgentIsRegisteredAsALeafUnderModelRisk |
Fact | Every training agent is registered as a leaf under model risk. |
EveryTrainingAgentIsReachableFromTheRootWithinTheDelegationDepthBudget |
Fact | Every training agent is reachable from the root within the delegation depth budget. |
EveryTrainingAgentDeclaresThePermissionsItsOwnToolsRequire |
Fact | Every training agent declares the permissions its own tools require. |
EveryToolClassResolvesToATrainingServiceTheBinderCanConstruct |
Fact | Every tool class resolves to a training service the binder can construct. |
NoAgentMixesKindsBeyondTheOneThatDeliberatelySpansTwo |
Fact | No agent mixes kinds beyond the one that deliberately spans two. |
AdvancedAnalyticsTrainingWorkflowCoverageTests
Jube.Test.AskJooby.AdvancedAnalyticsTrainingWorkflowCoverageTests — 7 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryWorkflowCarriesEnoughSemanticsToBeChosenWithoutThePasture |
Fact | Every workflow carries enough semantics to be chosen without the pasture. |
EveryWorkflowIdAndNodeIdIsUnique |
Fact | Every workflow id and node id is unique. |
NoNodeRequiresAnArtefactThatNoEarlierNodeProduces |
Fact | No node requires an artefact that no earlier node produces. |
EveryNodeIsOwnedByAnAgentThatExists |
Fact | Every node is owned by an agent that exists. |
EveryNodeIsOwnedByAnAgentThatActuallyHoldsTheToolsItNames |
Fact | Every node is owned by an agent that actually holds the tools it names. |
EveryNodeNamesCataloguedToolsThatActuallyExist |
Fact | Every node names catalogued tools that actually exist. |
EveryWorkflowDeclaresTheOrderingRuleThatMakesItAGraphRatherThanAListOfSteps |
Fact | Every workflow declares the ordering rule that makes it a graph rather than a list of steps. |
AgentFactoryPermissionTests
Jube.Test.AskJooby.AgentFactoryPermissionTests — 18 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
IsPermittedReturnsTrueWhenNoPermissionsAreRequired |
Fact | Is permitted returns true when no permissions are required. |
IsPermittedDefersToHasPermissionWhenPermissionsAreRequired |
Fact | Is permitted defers to has permission when permissions are required. |
AvailableExcludesAgentTypesTheCallerIsNotPermittedToUse |
Fact | Available excludes agent types the caller is not permitted to use. |
AvailableExcludesInternalAgentTypesLikeTheValidatorEvenWhenPermitted |
Fact | Available excludes internal agent types like the validator even when permitted. |
CreateAsyncStillBuildsAnInternalAgentTypeByNameForServiceCodeAsync |
Fact | Create async still builds an internal agent type by name for service code. |
CreateAsyncThrowsWhenTheCallerLacksTheAgentTypesRequiredPermissionAsync |
Fact | Create async throws when the caller lacks the agent types required permission. |
CreateAsyncBuildsOnlyThePermittedToolsWhenTheCallerIsPermittedAsync |
Fact | Create async builds only the permitted tools when the caller is permitted. |
OnlyTheGeneralAgentIsOfferedAskClarifyingQuestion |
Fact | Only the general agent is offered ask clarifying question. |
CountAvailableToolsIncludesTheDatabaseToolsOnlyWhenDatabaseAccessIsAvailable |
Fact | Count available tools includes the database tools only when database access is available. |
TheFourRScriptToolsAreOfferedToEveryAgentOnlyWhenScriptExecutionIsWiredUp |
Fact | The four r script tools are offered to every agent only when script execution is wired up. |
CountAvailableToolsAlwaysCountsThink |
Fact | Count available tools always counts think. |
CountAvailableToolsStillCountsThePermissionFreeToolsWhenEverythingElseIsDenied |
Fact | Count available tools still counts the permission free tools when everything else is denied. |
CountAvailableJoobriksExcludesGeneralAndIsInternalAgentTypes |
Fact | Count available joobriks excludes general and is internal agent types. |
CountAvailableJoobriksIsZeroWhenPermissionIsDenied |
Fact | Count available joobriks is zero when permission is denied. |
CreateAsyncStillBuildsAnAgentThatHasReachedTheSpawnDepthCeilingAsync |
Fact | Create async still builds an agent that has reached the spawn depth ceiling. |
CreateAsyncThrowsWhenTheCallerIsNotLandlordForALandlordOnlyAgentTypeAsync |
Fact | Create async throws when the caller is not landlord for a landlord only agent type. |
CreateAsyncSucceedsWhenTheCallerIsLandlordForALandlordOnlyAgentTypeAsync |
Fact | Create async succeeds when the caller is landlord for a landlord only agent type. |
UnknownAgentTypeRemainsAPlainArgumentExceptionAsync |
Fact | Unknown agent type remains a plain argument exception. |
AgentFactorySpecialistDescriptionTests
Jube.Test.AskJooby.AgentFactorySpecialistDescriptionTests — 4 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
AStableWithItsOwnSpecialistsHasThemAppendedByName |
Fact | A stable with its own specialists has them appended by name. |
AnUnrestrictedAgentWithNullAllowedDelegatesGetsNothingAppended |
Fact | An unrestricted agent with null allowed delegates gets nothing appended. |
ALeafWithNoDelegatesGetsNothingAppended |
Fact | A leaf with no delegates gets nothing appended. |
FallsBackToInstructionsWhenThereIsNoDelegationSummary |
Fact | Falls back to instructions when there is no delegation summary. |
AgentGroundingTextTests
Jube.Test.AskJooby.AgentGroundingTextTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
CollectReturnsTheValidatorsInstructionsAndItsToolsUnderItsDisplayName |
Fact | Collect returns the validators instructions and its tools under its display name. |
CollectSkipsAgentTypesThatAreNotRegistered |
Fact | Collect skips agent types that are not registered. |
CollectDeduplicatesRepeatedAgentTypes |
Fact | Collect deduplicates repeated agent types. |
AgentGuidanceExchangeTests
Jube.Test.AskJooby.AgentGuidanceExchangeTests — 7 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryJoobrikStillWorkingHearsItAndEachOfThemOnlyOnce |
Fact | Every joobrik still working hears it and each of them only once. |
AJoobrikSpawnedAfterTheCallerSpokeStillHearsIt |
Fact | A joobrik spawned after the caller spoke still hears it. |
OneTurnsGuidanceNeverReachesAnother |
Fact | One turns guidance never reaches another. |
ReleasingTheTurnStopsStaleGuidanceReachingTheNextOne |
Fact | Releasing the turn stops stale guidance reaching the next one. |
TheOldestIsDroppedFirstBecauseTheNewestIsWhatTheyMostWantHeard |
Fact | The oldest is dropped first because the newest is what they most want heard. |
NothingPendingIsTheCommonCaseAndCostsNothing |
Fact | Nothing pending is the common case and costs nothing. |
BlankGuidanceIsNotDelivered |
Fact | Blank guidance is not delivered. |
AgentIdleWatchdogTests
Jube.Test.AskJooby.AgentIdleWatchdogTests — 6 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
AnAgentThatKeepsTalkingIsNeverCutOffHoweverLongItRunsAsync |
Fact | An agent that keeps talking is never cut off however long it runs. |
AnAgentThatGoesSilentIsRetiredRatherThanWaitedOnForeverAsync |
Fact | An agent that goes silent is retired rather than waited on forever. |
TheStalledAgentIsActuallyCancelledAndNotLeftRunningAsync |
Fact | The stalled agent is actually cancelled and not left running. |
ANonPositiveTimeoutLetsEverythingThroughUnwatchedAsync |
Fact | A non positive timeout lets everything through unwatched. |
CallerCancellationStillPropagatesRatherThanBeingTreatedAsIdlenessAsync |
Fact | Caller cancellation still propagates rather than being treated as idleness. |
AnEmptyRunCompletesWithoutBeingCalledIdleAsync |
Fact | An empty run completes without being called idle. |
AgentRouterEmbeddingBatchTests
Jube.Test.AskJooby.AgentRouterEmbeddingBatchTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheWholeRoutingCorpusIsEmbeddedInOneRequestAndNotOnePerExemplarAsync |
Fact | The whole routing corpus is embedded in one request and not one per exemplar. |
WarmingTheCacheTakesOneRequestAndLeavesTheFirstTurnNothingToEmbedButItsOwnTaskAsync |
Fact | Warming the cache takes one request and leaves the first turn nothing to embed but its own task. |
AnEmbeddingProviderThatRejectsTheRequestFallsThroughAndSaysSoAsync |
Fact | An embedding provider that rejects the request falls through and says so. |
TheLedgerSaysWhichTierDecidedAndWhetherEmbeddingsWereReachedForAsync |
Fact | The ledger says which tier decided and whether embeddings were reached for. |
ASecondRoutingCallEmbedsOnlyTheNewTaskBecauseTheExemplarsAreCachedAsync |
Fact | A second routing call embeds only the new task because the exemplars are cached. |
AgentRouterPermissionTests
Jube.Test.AskJooby.AgentRouterPermissionTests — 4 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
RouteAsyncNeverReturnsAnAgentTypeNotInTheAvailableSetAsync |
Fact | Route async never returns an agent type not in the available set. |
RouteAsyncRegexMatchesAnObviousResearchTaskAsync |
Fact | Route async regex matches an obvious research task. |
RouteAsyncFallsBackToGeneralWhenNothingMatchesAsync |
Fact | Route async falls back to general when nothing matches. |
RouteAsyncUsesTheLlmFallbackWhenNoEmbedderIsConfiguredAndRegexDoesNotMatchAsync |
Fact | Route async uses the llm fallback when no embedder is configured and regex does not match. |
AgentStreamNarratorTests
Jube.Test.AskJooby.AgentStreamNarratorTests — 47 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
DescribeIncludesTheExceptionMessageWhenASpawnedAgentFails |
Fact | Describe includes the exception message when a spawned agent fails. |
DescribeIncludesTheExceptionMessageForAnyOtherFailedTool |
Fact | Describe includes the exception message for any other failed tool. |
DescribeEchoesRememberSSuccessTextRatherThanAGenericLine |
Fact | Describe echoes remember s success text rather than a generic line. |
DescribeCountsRecallHitsRatherThanShowingRawContent |
Fact | Describe counts recall hits rather than showing raw content. |
DescribeCountsSearchHistoryHitsRatherThanShowingRawContent |
Fact | Describe counts search history hits rather than showing raw content. |
DescribeReportsNoMatchesForSearchHistory |
Fact | Describe reports no matches for search history. |
DescribeStartUsesTheAnimalPersonaVerbsForEachTool |
Fact | Describe start uses the animal persona verbs for each tool. |
DescribeStartAnnouncesHerdingTheJoobriksForSpawnAgents |
Fact | Describe start announces herding the joobriks for spawn agents. |
ASurfacedFailureStillReadsAsAFailureRatherThanAnOddLookingAnswer |
Fact | A surfaced failure still reads as a failure rather than an odd looking answer. |
AToolPillCarriesTheExchangeBehindItSoTheCallerCanSeeWhatWasPassedAndReturned |
Fact | A tool pill carries the exchange behind it so the caller can see what was passed and returned. |
AFailedToolSaysSoInTheExchangeRatherThanShowingAnEmptyReturn |
Fact | A failed tool says so in the exchange rather than showing an empty return. |
AToolCalledWithNothingAndReturningNothingCarriesNoExchangeAtAll |
Fact | A tool called with nothing and returning nothing carries no exchange at all. |
ADelegationEndsWithTheJoobriksCompletionWordInsteadOfAGistOfItsReport |
Fact | A delegation ends with the joobriks completion word instead of a gist of its report. |
ALongReportNoLongerLeaksAnyOfItsTextIntoTheActivityLine |
Fact | A long report no longer leaks any of its text into the activity line. |
AReportThatCameBackEmptyStillCompletesWithItsWord |
Fact | A report that came back empty still completes with its word. |
AFanOutAttributesEachGistToTheJoobrikThatGaveIt |
Fact | A fan out attributes each gist to the joobrik that gave it. |
EveryAgentInTheHierarchyHasAPersonaOfItsOwnAndNoTwoShareOne |
Fact | Every agent in the hierarchy has a persona of its own and no two share one. |
EveryNamedAgentOpensItsPromptWithItsOwnNameAndGenderAndHasACompletionWord |
Fact | Every named agent opens its prompt with its own name and gender and has a completion word. |
DescribeAgentLabelIsTheAgentsNameAloneAndNotItsJobTitle |
Fact | Describe agent label is the agents name alone and not its job title. |
ASelfSpawnIsAnnouncedAsAFurtherStrandRatherThanAnotherAgent |
Fact | A self spawn is announced as a further strand rather than another agent. |
ASelfSpawnsStepsAreDistinguishableFromItsParents |
Fact | A self spawns steps are distinguishable from its parents. |
AFanOutNumbersSelfSpawnsAsStrandsAndEveryoneElseByPosition |
Fact | A fan out numbers self spawns as strands and everyone else by position. |
TheCheckerIsNamedFromTheValidatorDefinitionRatherThanWrittenOutAgain |
Fact | The checker is named from the validator definition rather than written out again. |
TheRetiredReasonerIsNoLongerNarrated |
Fact | The retired reasoner is no longer narrated. |
DescribeStartNamesTheAgentsAFanOutIsCallingIn |
Fact | Describe start names the agents a fan out is calling in. |
DescribeStartNamesEverySpawnedLeafSeparatelyRatherThanCollapsingThem |
Fact | Describe start names every spawned leaf separately rather than collapsing them. |
DescribeStartFallsBackToTheHerdingLineWhenTheFanOutNamesNoAgent |
Fact | Describe start falls back to the herding line when the fan out names no agent. |
DescribeReportsBackForSpawnAgentsOnSuccessAndFailure |
Fact | Describe reports back for spawn agents on success and failure. |
DescribeReportsBackSilentlyOnSuccessWithNoExceptionNoise |
Fact | Describe reports back silently on success with no exception noise. |
DescribeReadsTheActualBiteCountBackOutOfTheSearchRagResult |
Fact | Describe reads the actual bite count back out of the search rag result. |
DescribeUsesSingularBiteForExactlyOneResult |
Fact | Describe uses singular bite for exactly one result. |
DescribeReportsNoBitesFoundWhenSearchRagFindsNothing |
Fact | Describe reports no bites found when search rag finds nothing. |
DescribeStartSuppressesTheGenericStepPillForAskClarifyingQuestion |
Fact | Describe start suppresses the generic step pill for ask clarifying question. |
DescribeTurnsAskClarifyingQuestionIntoAClarificationItemCarryingTheRealOptions |
Fact | Describe turns ask clarifying question into a clarification item carrying the real options. |
DescribeFallsBackToAStepLineIfAskClarifyingQuestionsPayloadIsUnparseable |
Fact | Describe falls back to a step line if ask clarifying questions payload is unparseable. |
DescribeReportsTheExceptionMessageWhenAskClarifyingQuestionFails |
Fact | Describe reports the exception message when ask clarifying question fails. |
DescribeStartNamesADomainJoobrikRatherThanPrintingItsSlug |
Fact | Describe start names a domain joobrik rather than printing its slug. |
DescribeNamesADomainJoobrikOnSuccessAndOnFailure |
Fact | Describe names a domain joobrik on success and on failure. |
DescribeStartFallsBackToTheSlugForAnAgentThatCarriesNoName |
Fact | Describe start falls back to the slug for an agent that carries no name. |
DescribeAgentLabelDecoratesOnlyTheAgentsThatCarryAName |
Theory | Describe agent label decorates only the agents that carry a name. |
DescribeStartHumanisesABoundServiceOperationName |
Fact | Describe start humanises a bound service operation name. |
DescribeHumanisesABoundServiceOperationNameOnSuccessAndOnFailure |
Fact | Describe humanises a bound service operation name on success and on failure. |
RoutingPassesTheYokeRatherThanCallingSomeoneIn |
Fact | Routing passes the yoke rather than calling someone in. |
TheSpawnBannerAndTheHandoffBannerDoNotReadAsTheSameEvent |
Fact | The spawn banner and the handoff banner do not read as the same event. |
TheRoutingDetailNamesTheTierThatDecidedAndTheAgentThatNowHoldsTheTurn |
Fact | The routing detail names the tier that decided and the agent that now holds the turn. |
TheRoutingDetailLeavesOutAConfidenceTheTierNeverProduced |
Fact | The routing detail leaves out a confidence the tier never produced. |
EveryTierReadsAsProseRatherThanAsItsEnumName |
Theory | Every tier reads as prose rather than as its enum name. |
AgentToolIconsTests
Jube.Test.AskJooby.AgentToolIconsTests — 7 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryCoreToolHasItsOwnIcon |
Fact | Every core tool has its own icon. |
EveryAnalyticsToolResolvesToItsGroupIcon |
Fact | Every analytics tool resolves to its group icon. |
EveryServiceOperationResolvesToADomainIcon |
Fact | Every service operation resolves to a domain icon. |
TreeChildrenNavigationTakesTheIconOfItsEntity |
Theory | Tree children navigation takes the icon of its entity. |
EveryIconInTheEnumHasABrowserBody |
Fact | Every icon in the enum has a browser body. |
EveryFunctionToolGroupHasItsOwnIcon |
Fact | Every function tool group has its own icon. |
StepForAToolCarriesItsIcon |
Fact | Step for a tool carries its icon. |
AgentToolNarrationTests
Jube.Test.AskJooby.AgentToolNarrationTests — 7 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
DescribeStartingTurnsACataloguedNameIntoAParticiplePhrase |
Theory | Describe starting turns a catalogued name into a participle phrase. |
DescribeFinishedTurnsACataloguedNameIntoAPastTensePhrase |
Theory | Describe finished turns a catalogued name into a past tense phrase. |
DescribeStartingNeverMangesAnAcronymOrAProductName |
Theory | Describe starting never manges an acronym or a product name. |
DescribeStartingTakesTheOperationFromBeforeTheQualifierRatherThanInsideIt |
Theory | Describe starting takes the operation from before the qualifier rather than inside it. |
DescribeStartingCollapsesAWordTheOperationSuffixRepeats |
Theory | Describe starting collapses a word the operation suffix repeats. |
DescribeStartingOnlyArticlesASingularSubjectAndPicksTheRightArticle |
Theory | Describe starting only articles a singular subject and picks the right article. |
DescribeReturnsNothingWhenNoOperationIsRecognisedSoTheCallerKeepsTheRawName |
Theory | Describe returns nothing when no operation is recognised so the caller keeps the raw name. |
AskJoobyChatAuditAiAnalysisTests
Jube.Test.AskJooby.AskJoobyChatAuditAiAnalysisTests — 9 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
BuildPromptIncludesTheTitleAndEveryReport |
Fact | Build prompt includes the title and every report. |
BuildPromptGroundsInTheInvolvedAgentsOwnInstructionsWhenKnown |
Fact | Build prompt grounds in the involved agents own instructions when known. |
BuildPromptOmitsGroundingWhenNoAgentTypesAreKnown |
Fact | Build prompt omits grounding when no agent types are known. |
BuildPromptIncludesCodeGroundingSectionsWhenGiven |
Fact | Build prompt includes code grounding sections when given. |
BuildPromptOmitsCodeGroundingSectionsWhenNotGiven |
Fact | Build prompt omits code grounding sections when not given. |
AnalyzeAsyncReturnsTheTrimmedResponseTextOnSuccessAsync |
Fact | Analyze async returns the trimmed response text on success. |
AnalyzeAsyncReportsTheFailureReasonRatherThanThrowingWhenTheCallFailsAsync |
Fact | Analyze async reports the failure reason rather than throwing when the call fails. |
AnalyzeAsyncReportsATimeoutReasonRatherThanHangingWhenTheCallTimesOutAsync |
Fact | Analyze async reports a timeout reason rather than hanging when the call times out. |
AnalyzeAsyncReportsAFailureReasonForAnEmptyResponseAsync |
Fact | Analyze async reports a failure reason for an empty response. |
AskJoobyChatAuditBundleBuilderTests
Jube.Test.AskJooby.AskJoobyChatAuditBundleBuilderTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
AToolCallsFullResultIsFiledNotInlinedButIsStillReachableFromTheLog |
Fact | A tool calls full result is filed not inlined but is still reachable from the log. |
ADataCacheTableOverTheRowLimitIsPreviewedInTheLogButFullInTheCsv |
Fact | A data cache table over the row limit is previewed in the log but full in the csv. |
TheManifestIndexesEveryArtifactByItsActualPath |
Fact | The manifest indexes every artifact by its actual path. |
AskJoobyChatAuditCodeGroundingTests
Jube.Test.AskJooby.AskJoobyChatAuditCodeGroundingTests — 4 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
BuildAgentCodeAsyncKeepsOnlyCodeCategoryHitsAsync |
Fact | Build agent code async keeps only code category hits. |
BuildAgentCodeAsyncDedupesTheSameChunkAcrossAgentTypesAsync |
Fact | Build agent code async dedupes the same chunk across agent types. |
BuildAgentCodeAsyncReturnsNullWhenNothingIsCodeAsync |
Fact | Build agent code async returns null when nothing is code. |
BuildAgentCodeAsyncStopsOnceTheCharacterBudgetIsReachedAsync |
Fact | Build agent code async stops once the character budget is reached. |
AskJoobyChatAuditContextEfficiencyTests
Jube.Test.AskJooby.AskJoobyChatAuditContextEfficiencyTests — 4 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
NoModelCallsProducesAnEmptySection |
Fact | No model calls produces an empty section. |
TheLargestModelCallByInputTokensIsSurfacedWithItsAgentType |
Fact | The largest model call by input tokens is surfaced with its agent type. |
TheLargestToolResultAcrossAnyToolIsSurfacedNotJustRag |
Fact | The largest tool result across any tool is surfaced not just rag. |
CompactionPressureReportsHowMuchHadAlreadyBuiltUpBeforeTheFirstOne |
Fact | Compaction pressure reports how much had already built up before the first one. |
AskJoobyChatAuditCoverageTests
Jube.Test.AskJooby.AskJoobyChatAuditCoverageTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
EveryAskJoobyRelationIsEitherRenderedOrDeliberatelyExcluded |
Fact | Every ask jooby relation is either rendered or deliberately excluded. |
NothingIsClaimedAsRenderedThatTheContextDoesNotHave |
Fact | Nothing is claimed as rendered that the context does not have. |
EveryExclusionCarriesAReason |
Fact | Every exclusion carries a reason. |
AskJoobyChatAuditHealthSignalsTests
Jube.Test.AskJooby.AskJoobyChatAuditHealthSignalsTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
AQuietConversationWithNothingUnusualFlagsNothing |
Fact | A quiet conversation with nothing unusual flags nothing. |
ThreeIdenticalToolCallsByTheSameRunAreFlaggedAsARetryLoop |
Fact | Three identical tool calls by the same run are flagged as a retry loop. |
ARunThatBouncesBackToItsGrandparentsAgentTypeIsFlaggedAsAHandoffBounce |
Fact | A run that bounces back to its grandparents agent type is flagged as a handoff bounce. |
ARunWithManyModelCallsAndNoResultIsFlaggedAsEffortWithoutOutput |
Fact | A run with many model calls and no result is flagged as effort without output. |
TheHealthJsonCarriesTheSameFlagCountAsTheMarkdownOverallLine |
Fact | The health json carries the same flag count as the markdown overall line. |
AskJoobyChatAuditMarkdownBuilderGuidanceNudgeTests
Jube.Test.AskJooby.AskJoobyChatAuditMarkdownBuilderGuidanceNudgeTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ANudgeThatWasPickedUpShowsWhenAndTheAgentsImmediateReaction |
Fact | A nudge that was picked up shows when and the agents immediate reaction. |
ANudgeThatWasNeverDrainedSaysSoRatherThanHidingIt |
Fact | A nudge that was never drained says so rather than hiding it. |
SeveralNudgesDrainedByOneStepShareOnePickupAndAreNotAssumedOneToOne |
Fact | Several nudges drained by one step share one pickup and are not assumed one to one. |
AskJoobyChatAuditRagGapSignalsTests
Jube.Test.AskJooby.AskJoobyChatAuditRagGapSignalsTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
AConversationWithNoGapsFlagsNothing |
Fact | A conversation with no gaps flags nothing. |
AnEmptySearchRagResultIsFlaggedWithItsQuery |
Fact | An empty search rag result is flagged with its query. |
AValidationOmissionEntryIsFlaggedAsAPastureCoverageGap |
Fact | A validation omission entry is flagged as a pasture coverage gap. |
AValidationThatNeverPickedUpIsFlaggedSeparatelyFromAnOmission |
Fact | A validation that never picked up is flagged separately from an omission. |
SqlFallbackIsCountedButNeverCountedAsAFlaggedGap |
Fact | Sql fallback is counted but never counted as a flagged gap. |
AskJoobyChatAuditRagPerformanceTests
Jube.Test.AskJooby.AskJoobyChatAuditRagPerformanceTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
NoSearchRagCallsProducesAnEmptySection |
Fact | No search rag calls produces an empty section. |
SummarisesHitCountResponseSizeAndDuration |
Fact | Summarises hit count response size and duration. |
NonSearchRagToolCallsAreIgnored |
Fact | Non search rag tool calls are ignored. |
AskJoobyChatAuditServiceTests
Jube.Test.AskJooby.AskJoobyChatAuditServiceTests — 4 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
GenerateAsyncSucceedsForTheConversationsOwnCreatorAsync |
Fact | Generate async succeeds for the conversations own creator. |
GenerateAsyncIsForbiddenForADifferentUserInTheSameTenantAsync |
Fact | Generate async is forbidden for a different user in the same tenant. |
GenerateAsyncIsForbiddenForANonLandlordUserEvenHoldingAccessAsync |
Fact | Generate async is forbidden for a non landlord user even holding access. |
GenerateAsyncIsNotFoundForAUserInADifferentTenantAsync |
Fact | Generate async is not found for a user in a different tenant. |
AskJoobyChatTranscriptServiceTests
Jube.Test.AskJooby.AskJoobyChatTranscriptServiceTests — 7 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
GenerateAsyncSucceedsForANonLandlordUserHoldingAccessAsync |
Fact | Generate async succeeds for a non landlord user holding access. |
GenerateAsyncSucceedsForALandlordUserWithNoOrdinaryPermissionsAsync |
Fact | Generate async succeeds for a landlord user with no ordinary permissions. |
GenerateAsyncIsForbiddenForAUserWithNeitherLandlordNorAccessAsync |
Fact | Generate async is forbidden for a user with neither landlord nor access. |
GenerateAsyncIsForbiddenForADifferentUserInTheSameTenantAsync |
Fact | Generate async is forbidden for a different user in the same tenant. |
GenerateAsyncIsNotFoundForAUserInADifferentTenantAsync |
Fact | Generate async is not found for a user in a different tenant. |
GenerateAsyncStatesHistoryWasNeverFoldedWhenThereWasNoCompactionAsync |
Fact | Generate async states history was never folded when there was no compaction. |
GenerateAsyncStatesHistoryWasFoldedButNeverLostWhenCompactionRanAsync |
Fact | Generate async states history was folded but never lost when compaction ran. |
AskJoobyContentSafetyTests
Jube.Test.AskJooby.AskJoobyContentSafetyTests — 1 test. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
AnUnsupportedClarificationOptionIsCaughtAndCaveatedRatherThanReachingTheCallerUnflaggedAsync |
Fact | An unsupported clarification option is caught and caveated rather than reaching the caller unflagged. |
AskJoobyConversationCompactionTests
Jube.Test.AskJooby.AskJoobyConversationCompactionTests — 1 test. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
SendingAMessageOnceTheTurnCountThresholdIsReachedActuallyCompactsAsync |
Fact | Sending a message once the turn count threshold is reached actually compacts. |
AskJoobyConversationFeedbackTests
Jube.Test.AskJooby.AskJoobyConversationFeedbackTests — 6 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
ThumbsUpStoresAUserScopedMemoryTaggedPositiveAsync |
Fact | Thumbs up stores a user scoped memory tagged positive. |
ThumbsDownStoresAUserScopedMemoryTaggedNegativeAsync |
Fact | Thumbs down stores a user scoped memory tagged negative. |
ThumbsUpLeavesAStepEntryInTheTranscriptAsync |
Fact | Thumbs up leaves a step entry in the transcript. |
ThumbsUpOnAReplyHoldingPersonalDataStoresARedactedMemoryAsync |
Fact | Thumbs up on a reply holding personal data stores a redacted memory. |
ThumbsUpOnAReplyHoldingASecretIsRefusedWithTheGuardsExplanationAsync |
Fact | Thumbs up on a reply holding a secret is refused with the guards explanation. |
RejectsFeedbackForAMessageThatIsNotAnAssistantReplyAsync |
Fact | Rejects feedback for a message that is not an assistant reply. |
AskJoobyConversationHistoryQueryTests
Jube.Test.AskJooby.AskJoobyConversationHistoryQueryTests — 4 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
SearchFindsAConversationByTitleEvenWhenTheBodyNeverRepeatsTheWordsAsync |
Fact | Search finds a conversation by title even when the body never repeats the words. |
UserScopeNeverSurfacesAnotherUsersConversationAsync |
Fact | User scope never surfaces another users conversation. |
SearchReportsIsCompactForACompactionSummaryRowAsync |
Fact | Search reports is compact for a compaction summary row. |
SearchExcludesNarrationEntriesLikeStepsAndThoughtsAsync |
Fact | Search excludes narration entries like steps and thoughts. |
AskJoobyConversationNudgeTests
Jube.Test.AskJooby.AskJoobyConversationNudgeTests — 4 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
SendingWhileAnotherTurnIsRunningPersistsANudgeAndStartsNoNewRunAsync |
Fact | Sending while another turn is running persists a nudge and starts no new run. |
SendingWhileIdleNeverSetsIsNudgeAsync |
Fact | Sending while idle never sets is nudge. |
SendNudgeAlwaysPersistsEvenWhenNothingIsActuallyRunningAsync |
Fact | Send nudge always persists even when nothing is actually running. |
PendingGuidanceIsInjectedIntoTheRunningTurnsNextModelCallAsync |
Fact | Pending guidance is injected into the running turns next model call. |
AskJoobyConversationReviseStreamingTests
Jube.Test.AskJooby.AskJoobyConversationReviseStreamingTests — 1 test. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
AStepFromTheReviseSubAgentsOwnToolCallReachesTheLiveStreamAsync |
Fact | A step from the revise sub agents own tool call reaches the live stream. |
AskJoobyConversationStartTests
Jube.Test.AskJooby.AskJoobyConversationStartTests — 5 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
StartConversationIsANoOpWhenTheConversationAlreadyHasMessagesAsync |
Fact | Start conversation is a no op when the conversation already has messages. |
StartConversationUsesTheStaticFallbackWhenNoInferenceBackendIsConfiguredAsync |
Fact | Start conversation uses the static fallback when no inference backend is configured. |
StartConversationNeverCallsTheChatClientWhenNoInferenceBackendIsConfiguredAsync |
Fact | Start conversation never calls the chat client when no inference backend is configured. |
StartConversationSendsTheEmptyReplyFallbackWhenTheModelProducesNoTextAsync |
Fact | Start conversation sends the empty reply fallback when the model produces no text. |
StatsQueryCountsBitesGloballyButTrailsAndSaltlicksPerTenantAsync |
Fact | Stats query counts bites globally but trails and saltlicks per tenant. |
AskJoobyConversationValidationBypassTests
Jube.Test.AskJooby.AskJoobyConversationValidationBypassTests — 2 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
AReplyBuiltEntirelyFromRunSqlQueryStillGetsCheckedAsync |
Fact | A reply built entirely from run sql query still gets checked. |
AReplyWithNoBypassToolCallStillRunsValidationAsync |
Fact | A reply with no bypass tool call still runs validation. |
AskJoobyDataCacheClientTests
Jube.Test.AskJooby.AskJoobyDataCacheClientTests — 6 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
StoreThenGetRoundTripsColumnsAndNormalisesRowValuesAsync |
Fact | Store then get round trips columns and normalises row values. |
GetReturnsNullForAnUnknownPointerAsync |
Fact | Get returns null for an unknown pointer. |
StoreThrowsWhenRowCountExceedsTheConfiguredCapAsync |
Fact | Store throws when row count exceeds the configured cap. |
GetDispatchesAGuidShapedPointerToTheAdvancedAnalyticsReaderAsync |
Fact | Get dispatches a guid shaped pointer to the advanced analytics reader. |
GetWithoutAnAdvancedAnalyticsReaderLeavesAGuidShapedPointerUnresolvedAsync |
Fact | Get without an advanced analytics reader leaves a guid shaped pointer unresolved. |
StoreAppliesTheDefaultTtlWhenNoneIsSuppliedAsync |
Fact | Store applies the default ttl when none is supplied. |
AskJoobyDataCacheRepositoryTests
Jube.Test.AskJooby.AskJoobyDataCacheRepositoryTests — 4 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
InsertAndGetRoundTripTheStoredJsonAsync |
Fact | Insert and get round trip the stored json. |
GetReturnsNullForAnExpiredEntryAsync |
Fact | Get returns null for an expired entry. |
GetReturnsNullForAPointerBelongingToADifferentTenantAsync |
Fact | Get returns null for a pointer belonging to a different tenant. |
GetReturnsNullForAnUnknownPointerAsync |
Fact | Get returns null for an unknown pointer. |
AskJoobyErrataPromptTests
Jube.Test.AskJooby.AskJoobyErrataPromptTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
NoErrataMeansNoErrataBlockAtAll |
Fact | No errata means no errata block at all. |
EveryErratumIsListedUnderTheHeaderInTheOrderGiven |
Fact | Every erratum is listed under the header in the order given. |
ErrataSitAfterTheSharedPreambleAndBeforeTheAgentsOwnInstructions |
Fact | Errata sit after the shared preamble and before the agents own instructions. |
AskJoobyFileExportClientTests
Jube.Test.AskJooby.AskJoobyFileExportClientTests — 2 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
ExportAsyncCreatesAFileRowWithTheGivenBytesAndMetadataAsync |
Fact | Export async creates a file row with the given bytes and metadata. |
AttachToMessageAsyncLinksAnExportedFileToTheMessageThatProducedItAsync |
Fact | Attach to message async links an exported file to the message that produced it. |
AskJoobyInjectionGuardTests
Jube.Test.AskJooby.AskJoobyInjectionGuardTests — 19 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
AHostileTopicJudgeWouldRejectADecontextualisedTabularRowUnderTheHumanInputPipelineAsync |
Fact | A hostile topic judge would reject a decontextualised tabular row under the human input pipeline. |
DescribeScreening_categorises_the_firing_rule_by_what_it_actually_is |
Theory | Describe screening categorises the firing rule by what it actually is. |
CheckToolContentAsync_passes_the_same_benign_row_with_no_topic_judgment_at_allAsync |
Fact | Check tool content async passes the same benign row with no topic judgment at all. |
CheckToolContentAsync_still_flags_a_genuine_instruction_override_in_tool_contentAsync |
Fact | Check tool content async still flags a genuine instruction override in tool content. |
CheckAsync_blocks_a_textbook_injection_pattern_by_default_via_the_regex_floorAsync |
Fact | Check async blocks a textbook injection pattern by default via the regex floor. |
TheDefaultSettings_ShipChatInputTopicBoundaryEnabled |
Fact | The default settings ship chat input topic boundary enabled. |
BuildPipeline_gives_the_input_side_judge_its_own_permissive_system_promptAsync |
Fact | Build pipeline gives the input side judge its own permissive system prompt. |
TheDefaultSettings_KeepTheLiberalPromptInjectionThreshold |
Fact | The default settings keep the liberal prompt injection threshold. |
ResolveChatInputPromptInjectionMainThreshold_returns_the_configured_liberal_default |
Fact | Resolve chat input prompt injection main threshold returns the configured liberal default. |
ResolveChatInputPromptInjectionMainThreshold_returns_null_once_explicitly_disabled |
Fact | Resolve chat input prompt injection main threshold returns null once explicitly disabled. |
CheckAsync_still_detects_secrets_even_with_ChatInputPromptInjection_explicitly_disabledAsync |
Fact | Check async still detects secrets even with chat input prompt injection explicitly disabled. |
FindAsync_no_longer_reliably_catches_a_subtler_override_phrasing_at_the_liberal_default_thresholdAsync |
Fact | Find async no longer reliably catches a subtler override phrasing at the liberal default threshold. |
CheckToolContentAsync_can_be_disabled_through_the_ToolContentScreening_ruleAsync |
Fact | Check tool content async can be disabled through the tool content screening rule. |
FindAsync_flags_a_message_that_tries_to_override_the_instructionsAsync |
Theory | Find async flags a message that tries to override the instructions. |
FindAsync_lets_an_ordinary_question_throughAsync |
Theory | Find async lets an ordinary question through. |
FindAsync_flags_a_message_that_contains_an_aws_access_keyAsync |
Fact | Find async flags a message that contains an aws access key. |
FindAsync_flags_a_message_that_contains_a_credential_even_when_some_other_rule_catches_it_firstAsync |
Fact | Find async flags a message that contains a credential even when some other rule catches it first. |
FindAsync_still_lets_through_a_question_containing_ordinary_jube_domain_dataAsync |
Fact | Find async still lets through a question containing ordinary jube domain data. |
CheckOutputAsync_lets_an_ordinary_reply_through_when_no_judge_is_configuredAsync |
Fact | Check output async lets an ordinary reply through when no judge is configured. |
AskJoobyMemoryTests
Jube.Test.AskJooby.AskJoobyMemoryTests — 11 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
RecallNeverSurfacesAnotherUsersUserScopedMemoryAsync |
Fact | Recall never surfaces another users user scoped memory. |
RecallSurfacesSystemScopedMemoriesRegardlessOfWhoCreatedThemAsync |
Fact | Recall surfaces system scoped memories regardless of who created them. |
RecallRanksByVectorSimilarityWhenAnEmbeddingIsSuppliedAsync |
Fact | Recall ranks by vector similarity when an embedding is supplied. |
InsertAsyncPersistsTheEmbeddingColumnAsync |
Fact | Insert async persists the embedding column. |
InsertAsyncAndSearchBothPreserveTheFeedbackStatusAsync |
Fact | Insert async and search both preserve the feedback status. |
RecallExcludesAMemoryWhoseExpiryHasAlreadyPassedAsync |
Fact | Recall excludes a memory whose expiry has already passed. |
RecallSinceExcludesMemoriesRecordedBeforeTheCutoffAsync |
Fact | Recall since excludes memories recorded before the cutoff. |
RecallRanksAFresherMemoryAboveAnEquallyMatchingOlderOneAsync |
Fact | Recall ranks a fresher memory above an equally matching older one. |
InsertAsyncDefaultsToFactKindAsync |
Fact | Insert async defaults to fact kind. |
RecallExcludesReflectionsByDefaultButIncludesFactsAsync |
Fact | Recall excludes reflections by default but includes facts. |
ConversationScopeIsVisibleWithinItsOwnConversationOnlyAsync |
Fact | Conversation scope is visible within its own conversation only. |
AskJoobyOpeningInstructionTests
Jube.Test.AskJooby.AskJoobyOpeningInstructionTests — 6 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
WithPageContext_StillCarriesTheFullInstructionBody |
Fact | With page context still carries the full instruction body. |
WithoutPageContext_ReturnsTheInstructionBodyUnprefixed |
Fact | Without page context returns the instruction body unprefixed. |
ParsePageContext_WithJsonPageNameStateAndRecord_ResolvesCatalogueTextAndRecordSummary |
Fact | Parse page context with json page name state and record resolves catalogue text and record summary. |
ParsePageContext_WithPageNameNotInTheCatalogue_StillReturnsPageNameWithoutPurposeText |
Fact | Parse page context with page name not in the catalogue still returns page name without purpose text. |
ParsePageContext_WithNonJsonText_FallsBackToTreatingItAsThePageName |
Fact | Parse page context with non json text falls back to treating it as the page name. |
ParsePageContext_WithNullOrWhitespace_ReturnsNull |
Fact | Parse page context with null or whitespace returns null. |
AskJoobyOutputTopicBoundaryTests
Jube.Test.AskJooby.AskJoobyOutputTopicBoundaryTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
A_bare_validator_pass_verdict_is_off_topic_under_the_plain_default_topic_promptAsync |
Fact | A bare validator pass verdict is off topic under the plain default topic prompt. |
AskJoobys_own_output_pipeline_lets_the_same_validator_verdict_throughAsync |
Fact | Ask joobys own output pipeline lets the same validator verdict through. |
A_genuinely_unrelated_reply_is_still_blocked_through_AskJoobys_output_pipelineAsync |
Fact | A genuinely unrelated reply is still blocked through ask joobys output pipeline. |
The_landlord_topic_list_is_the_base_list_plus_exactly_one_platform_ops_topic |
Fact | The landlord topic list is the base list plus exactly one platform ops topic. |
CheckAsync_and_CheckOutputAsync_accept_an_isLandlord_flag_without_throwing_either_wayAsync |
Fact | Check async and check output async accept an is landlord flag without throwing either way. |
AskJoobyRagClientPartitionTests
Jube.Test.AskJooby.AskJoobyRagClientPartitionTests — 4 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ABiteOverTheLimitIsDroppedAndNeverReachesTheKeptList |
Fact | A bite over the limit is dropped and never reaches the kept list. |
ABiteExactlyAtTheLimitIsKept |
Fact | A bite exactly at the limit is kept. |
AZeroOrNegativeLimitDisablesFilteringEntirely |
Fact | A zero or negative limit disables filtering entirely. |
WhenEveryCandidateIsOversizedTheKeptListIsEmptyRatherThanFallingBackToAllOfThem |
Fact | When every candidate is oversized the kept list is empty rather than falling back to all of them. |
AskJoobyRepositoryTests
Jube.Test.AskJooby.AskJoobyRepositoryTests — 14 tests. Category: Service. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
ListMessagesByConversationAsyncExcludesNarrationEntriesAsync |
Fact | List messages by conversation async excludes narration entries. |
InsertAsyncDefaultsEntryTypeToMessageWhenNotSpecifiedAsync |
Fact | Insert async defaults entry type to message when not specified. |
ListEntriesByConversationAsyncExcludesCompactsButListMessagesIncludesThemAsync |
Fact | List entries by conversation async excludes compacts but list messages includes them. |
InsertWithEmbeddingAsyncPersistsTheEmbeddingAndCompactFlagAsync |
Fact | Insert with embedding async persists the embedding and compact flag. |
InsertWithEmbeddingAsyncAcceptsAnEmptyEmbeddingWithoutThrowingAsync |
Fact | Insert with embedding async accepts an empty embedding without throwing. |
GetTotalsByRunIdsAsyncSumsTokensOnlyAcrossTheGivenRunTreeAsync |
Fact | Get totals by run ids async sums tokens only across the given run tree. |
GetTotalsByRunIdsAsyncReturnsZeroForAnEmptyRunIdCollectionAsync |
Fact | Get totals by run ids async returns zero for an empty run id collection. |
ListByConversationAsyncReturnsAllRunsInTheRunTreeAsync |
Fact | List by conversation async returns all runs in the run tree. |
AttachToMessageAsyncLinksAnUploadedFileToTheMessageItWasSentWithAsync |
Fact | Attach to message async links an uploaded file to the message it was sent with. |
ListByMessageIdsAsyncReturnsAnEmptyListForAnEmptyMessageIdCollectionAsync |
Fact | List by message ids async returns an empty list for an empty message id collection. |
DeleteAsyncSoftDeletesAConversationSoItNoLongerLoadsAsync |
Fact | Delete async soft deletes a conversation so it no longer loads. |
DeleteAsyncThrowsKeyNotFoundForAConversationThatDoesNotExistAsync |
Fact | Delete async throws key not found for a conversation that does not exist. |
ListAsyncOrdersByMostRecentlyActiveRatherThanCreationOrderAsync |
Fact | List async orders by most recently active rather than creation order. |
ListAsyncFallsBackToCreatedDateWhenUpdatedDateIsNullAsync |
Fact | List async falls back to created date when updated date is null. |
AskJoobySensitiveDataGuardTests
Jube.Test.AskJooby.AskJoobySensitiveDataGuardTests — 2 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
FindAsync_refuses_a_memory_that_holds_a_secret_or_personal_dataAsync |
Theory | Find async refuses a memory that holds a secret or personal data. |
FindAsync_lets_an_ordinary_fact_throughAsync |
Theory | Find async lets an ordinary fact through. |
AskJoobySqlQueryClientTests
Jube.Test.AskJooby.AskJoobySqlQueryClientTests — 12 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
RejectsAQueryReferencingAnUnregisteredTableAsync |
Fact | Rejects a query referencing an unregistered table. |
RejectsANonSelectStatementAsync |
Fact | Rejects a non select statement. |
LogsARejectedQueryWithTheFailureDetailsAsync |
Fact | Logs a rejected query with the failure details. |
ValidateReportsTheColumnTheDatabaseCannotResolveWithoutExecutingAsync |
Fact | Validate reports the column the database cannot resolve without executing. |
ValidateAcceptsAStatementThePlannerCanResolveAsync |
Fact | Validate accepts a statement the planner can resolve. |
ValidateRefusesAnUnregisteredTableExactlyAsExecutionWouldAsync |
Fact | Validate refuses an unregistered table exactly as execution would. |
ExplainReturnsAPlanAndACostWithoutReadingAnyRowAsync |
Fact | Explain returns a plan and a cost without reading any row. |
TableStatisticsNamesOnlyTheTablesTheStatementActuallyTouchesAsync |
Fact | Table statistics names only the tables the statement actually touches. |
TableStatisticsSizesNothingForATableTheCallerMayNotQueryAsync |
Fact | Table statistics sizes nothing for a table the caller may not query. |
NoCallerCanReachARawCatalogueViewThroughDynamicSqlAsync |
Fact | No caller can reach a raw catalogue view through dynamic sql. |
QueryHistoryReturnsAggregatesOrSaysThereIsNoneAsync |
Fact | Query history returns aggregates or says there is none. |
LoggingAFailedLookupNeverMasksTheOriginalExceptionAsync |
Fact | Logging a failed lookup never masks the original exception. |
AskJoobyStepIconReplayTests
Jube.Test.AskJooby.AskJoobyStepIconReplayTests — 4 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
AStoredStepReplaysWithTheIconItWasStreamedWith |
Fact | A stored step replays with the icon it was streamed with. |
AStepRecordedBeforeIconsExistedReplaysWithNoIcon |
Fact | A step recorded before icons existed replays with no icon. |
AStoredStepReplaysWithTheDetailItWasStreamedWith |
Fact | A stored step replays with the detail it was streamed with. |
AStepRecordedBeforeDetailExistedReplaysWithNoDetail |
Fact | A step recorded before detail existed replays with no detail. |
AskJoobyTurnTrackerTests
Jube.Test.AskJooby.AskJoobyTurnTrackerTests — 5 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
ABegunConversationIsRunningUntilItIsDisposed |
Fact | A begun conversation is running until it is disposed. |
TwoOverlappingTurnsOnTheSameConversationBothHaveToEndBeforeItIsIdleAgain |
Fact | Two overlapping turns on the same conversation both have to end before it is idle again. |
DisposingTwiceIsHarmless |
Fact | Disposing twice is harmless. |
OneConversationRunningNeverReportsAnotherAsBusy |
Fact | One conversation running never reports another as busy. |
AConversationNeverBegunIsNotRunning |
Fact | A conversation never begun is not running. |
AskJoobyValidationModelCoherenceTests
Jube.Test.AskJooby.AskJoobyValidationModelCoherenceTests — 2 tests. Category: AskJoobyLive.
| Test | Kind | Verifies |
|---|---|---|
ValidationModelFollowsASimpleDirectInstructionAsync |
Fact | Validation model follows a simple direct instruction. |
ValidationModelProducesNonDegenerateProseForAnOpenEndedQuestionAsync |
Fact | Validation model produces non degenerate prose for an open ended question. |
BasicAgentRunnableThinkingTests
Jube.Test.AskJooby.BasicAgentRunnableThinkingTests — 2 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
SurfacesReasoningContentAsThinkingItemsWhenEnableThinkingIsOnAsync |
Fact | Surfaces reasoning content as thinking items when enable thinking is on. |
NeverSurfacesReasoningContentWhenEnableThinkingIsOffAsync |
Fact | Never surfaces reasoning content when enable thinking is off. |
BgeRerankerTests
Jube.Test.AskJooby.BgeRerankerTests — 11 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheCohereShapeIsReadAsync |
Fact | The cohere shape is read. |
TheTextEmbeddingsInferenceShapeIsReadAsync |
Fact | The text embeddings inference shape is read. |
CandidatesComeBackBestFirstWhateverOrderTheProviderSentAsync |
Fact | Candidates come back best first whatever order the provider sent. |
AnIndexOutsideTheCandidatesIsDiscardedRatherThanThrowingAsync |
Fact | An index outside the candidates is discarded rather than throwing. |
ARefusalIsReportedAsNotHavingRunRatherThanAsRejectingEverythingAsync |
Fact | A refusal is reported as not having run rather than as rejecting everything. |
AnUnreachableEndpointIsReportedAsNotHavingRunAsync |
Fact | An unreachable endpoint is reported as not having run. |
AnAnswerInNoRecognisedShapeIsReportedAsNotHavingRunAsync |
Fact | An answer in no recognised shape is reported as not having run. |
NothingToRankIsNotACallAsync |
Fact | Nothing to rank is not a call. |
AUsageTokenCountInTheResponseIsCapturedAsync |
Fact | A usage token count in the response is captured. |
NoUsageFieldLeavesTokensComparedNullAsync |
Fact | No usage field leaves tokens compared null. |
TheBareArrayShapeNeverCarriesUsageAsync |
Fact | The bare array shape never carries usage. |
BoundToolSurfaceDecorationTests
Jube.Test.AskJooby.BoundToolSurfaceDecorationTests — 6 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryAgentHandedTheRuleExtensionOperationsIsToldWhatTheyAreFor |
Fact | Every agent handed the rule extension operations is told what they are for. |
NoAgentIsToldAboutTheRuleExtensionOperationsWithoutHoldingThem |
Fact | No agent is told about the rule extension operations without holding them. |
EveryAgentHoldingARuleExtensionValidationIsToldToValidate |
Fact | Every agent holding a rule extension validation is told to validate. |
EveryComputationAnalystIsToldItsOperationsTakeTheNumbersThemselves |
Fact | Every computation analyst is told its operations take the numbers themselves. |
EveryTrainingAgentIsToldItCanCancelARunItOpened |
Fact | Every training agent is told it can cancel a run it opened. |
TheDelegationSummaryOfAnAgentWithAnAddedSurfaceSaysSoRatherThanUnderstatingIt |
Fact | The delegation summary of an agent with an added surface says so rather than understating it. |
CacheAssembledTableToolTests
Jube.Test.AskJooby.CacheAssembledTableToolTests — 4 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
CacheAssembledTableReturnsAPointerAndAPreviewAsync |
Fact | Cache assembled table returns a pointer and a preview. |
CacheAssembledTableRoundTripsThroughCachedDataToolAsync |
Fact | Cache assembled table round trips through cached data tool. |
CacheAssembledTableRejectsRowsWithDifferingKeysAsync |
Fact | Cache assembled table rejects rows with differing keys. |
CacheAssembledTableRejectsAnEmptyArrayAsync |
Fact | Cache assembled table rejects an empty array. |
CachedDataToolAdvancedAnalyticsPointerTests
Jube.Test.AskJooby.CachedDataToolAdvancedAnalyticsPointerTests — 2 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
InspectPreviewAndQueryAllWorkAgainstAnAdvancedAnalyticsPointerAsync |
Fact | Inspect preview and query all work against an advanced analytics pointer. |
InspectPreviewAndQueryAllStillWorkAgainstATblPointerOnTheSameToolAsync |
Fact | Inspect preview and query all still work against a tbl pointer on the same tool. |
CachedDataToolTests
Jube.Test.AskJooby.CachedDataToolTests — 19 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
InspectDataSchemaReportsRowCountColumnCountAndNullCountsAsync |
Fact | Inspect data schema reports row count column count and null counts. |
InspectDataSchemaReportsNotFoundForAMissingPointerAsync |
Fact | Inspect data schema reports not found for a missing pointer. |
PreviewDataRowsClampsAboveTheCeilingAsync |
Fact | Preview data rows clamps above the ceiling. |
PreviewDataRowsClampsBelowOneAsync |
Fact | Preview data rows clamps below one. |
InspectDataSchemaReportsWhatReadingTheWholeTableWouldCostAsync |
Fact | Inspect data schema reports what reading the whole table would cost. |
InspectDataSchemaScalesTheReportedCostWithTheSizeOfTheTableAsync |
Fact | Inspect data schema scales the reported cost with the size of the table. |
PreviewDataRowsWalksPastTheStartOfTheTableWithAnOffsetAsync |
Fact | Preview data rows walks past the start of the table with an offset. |
PreviewDataRowsSaysSoRatherThanReturningNothingWhenTheOffsetIsPastTheEndAsync |
Fact | Preview data rows says so rather than returning nothing when the offset is past the end. |
PreviewDataRowsTreatsANegativeOffsetAsTheStartAsync |
Fact | Preview data rows treats a negative offset as the start. |
QueryCachedDataFiltersOnAnEqualityConditionAsync |
Fact | Query cached data filters on an equality condition. |
QueryCachedDataFiltersOnANumericGreaterThanConditionAsync |
Fact | Query cached data filters on a numeric greater than condition. |
QueryCachedDataCombinesConditionsWithAndAsync |
Fact | Query cached data combines conditions with and. |
QueryCachedDataSupportsContainsAsync |
Fact | Query cached data supports contains. |
QueryCachedDataReportsNoMatchesDistinctlyAsync |
Fact | Query cached data reports no matches distinctly. |
QueryCachedDataThrowsForAnUnknownColumnAsync |
Fact | Query cached data throws for an unknown column. |
QueryCachedDataThrowsForAnUnparseableConditionAsync |
Fact | Query cached data throws for an unparseable condition. |
QueryCachedDataReportsNotFoundForAMissingPointerAsync |
Fact | Query cached data reports not found for a missing pointer. |
PreviewDataRowsOrdersColumnsByTheTableNotTheRowAsync |
Fact | Preview data rows orders columns by the table not the row. |
QueryCachedDataOrdersColumnsByTheTableNotTheRowAsync |
Fact | Query cached data orders columns by the table not the row. |
CachedRowTextTests
Jube.Test.AskJooby.CachedRowTextTests — 7 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
FormatTakesItsOrderFromTheColumnsAndNotFromTheRow |
Fact | Format takes its order from the columns and not from the row. |
FormatReportsAColumnTheRowDoesNotCarryAsNullRatherThanDroppingIt |
Fact | Format reports a column the row does not carry as null rather than dropping it. |
FormatIgnoresAKeyThatIsNotAColumn |
Fact | Format ignores a key that is not a column. |
FormatAppliesTheCallersValueRenderer |
Fact | Format applies the callers value renderer. |
FormatFirstTakesTheLeadingColumnsInTableOrder |
Fact | Format first takes the leading columns in table order. |
FormatFirstReturnsEveryColumnWhenAskedForMoreThanThereAre |
Fact | Format first returns every column when asked for more than there are. |
FormatReturnsAnEmptyStringForATableWithNoColumns |
Fact | Format returns an empty string for a table with no columns. |
ConversationHistoryToolTests
Jube.Test.AskJooby.ConversationHistoryToolTests — 1 test. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
SearchHistoryTruncatesAHoofprintLongerThanFourThousandCharactersAsync |
Fact | Search history truncates a hoofprint longer than four thousand characters. |
ConversationWindowTests
Jube.Test.AskJooby.ConversationWindowTests — 5 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
WithNoCompactEverythingIsCarried |
Fact | With no compact everything is carried. |
ACompactStandsInForWhatItCoveredAndTheRestIsCarried |
Fact | A compact stands in for what it covered and the rest is carried. |
AMessageWrittenWhileCompactionWasStillRunningIsNotLost |
Fact | A message written while compaction was still running is not lost. |
OnlyTheNewestCompactIsCarriedBecauseItSubsumesTheOlder |
Fact | Only the newest compact is carried because it subsumes the older. |
ACompactWrittenBeforeTheAnchorExistedStillBehavesAsItDid |
Fact | A compact written before the anchor existed still behaves as it did. |
DelimitedTextTableTests
Jube.Test.AskJooby.DelimitedTextTableTests — 7 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
AHeaderAndRowsBecomeColumnsAndRows |
Fact | A header and rows become columns and rows. |
ADelimiterInsideAQuotedFieldDoesNotStartANewColumn |
Fact | A delimiter inside a quoted field does not start a new column. |
ADoubledQuoteIsOneQuoteAndANewlineInsideQuotesStaysInTheField |
Fact | A doubled quote is one quote and a newline inside quotes stays in the field. |
TabsAndSemicolonsAreRecognisedAsDelimitersToo |
Fact | Tabs and semicolons are recognised as delimiters too. |
AShortRowIsPaddedRatherThanRejected |
Fact | A short row is padded rather than rejected. |
DuplicateHeaderNamesAreMadeUniqueSoNoColumnIsLost |
Fact | Duplicate header names are made unique so no column is lost. |
ProseIsNotMistakenForATable |
Fact | Prose is not mistaken for a table. |
DemoDatasetToolTests
Jube.Test.AskJooby.DemoDatasetToolTests — 6 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheEmbeddedDemoDatasetLoadsFromTheAssemblyRatherThanAFilePath |
Fact | The embedded demo dataset loads from the assembly rather than a file path. |
EveryRowCarriesEveryColumnSoTheSampleIsRectangular |
Fact | Every row carries every column so the sample is rectangular. |
TheLabelColumnHoldsBothOutcomesAndNothingElse |
Fact | The label column holds both outcomes and nothing else. |
ValuesParseAsNumbersRatherThanStayingAsText |
Fact | Values parse as numbers rather than staying as text. |
GetDemoDatasetHandsBackAPointerAndNotTheRowsAsync |
Fact | Get demo dataset hands back a pointer and not the rows. |
GetDemoDatasetNamesTheDatasetsThatExistWhenAskedForOneThatDoesNotAsync |
Fact | Get demo dataset names the datasets that exist when asked for one that does not. |
DiffToolTests
Jube.Test.AskJooby.DiffToolTests — 11 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
IdenticalInputsReturnAnEmptyArray |
Fact | Identical inputs return an empty array. |
AChangedLineIsReportedAsReplacedWithBothLineNumbersAndBothTexts |
Fact | A changed line is reported as replaced with both line numbers and both texts. |
APureDeletionHasNoNewSideAndNoLineNew |
Fact | A pure deletion has no new side and no line new. |
APureInsertionHasNoOldSideAndNoLineOld |
Fact | A pure insertion has no old side and no line old. |
AnUnequalSizedChangedBlockPairsPositionallyThenSpillsIntoInserts |
Fact | An unequal sized changed block pairs positionally then spills into inserts. |
ASingleTrailingNewlineOnOneSideIsNotReportedAsAChange |
Fact | A single trailing newline on one side is not reported as a change. |
ASecondTrailingNewlineIsStillARealBlankLineAndIsReported |
Fact | A second trailing newline is still a real blank line and is reported. |
ComparisonIsCaseAndWhitespaceExact |
Fact | Comparison is case and whitespace exact. |
OversizedInputReturnsAPlainRefusalNotJson |
Fact | Oversized input returns a plain refusal not json. |
NullInputsAreTreatedAsEmptyRatherThanThrowing |
Fact | Null inputs are treated as empty rather than throwing. |
MoreChangedLinesThanTheCapEndsWithATruncatedEntryInsteadOfGoingOnForever |
Fact | More changed lines than the cap ends with a truncated entry instead of going on forever. |
DynamicSqlCommonTableExpressionTests
Jube.Test.AskJooby.DynamicSqlCommonTableExpressionTests — 8 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ACommonTableExpressionNameIsNotJudgedAgainstTheAllowList |
Fact | A common table expression name is not judged against the allow list. |
TheExactStatementTheAgentWasRefusedNowRewrites |
Fact | The exact statement the agent was refused now rewrites. |
OneExpressionCanBuildOnAnEarlierOne |
Fact | One expression can build on an earlier one. |
ARecursiveExpressionCanReferenceItself |
Fact | A recursive expression can reference itself. |
ANonRecursiveExpressionCannotSeeItselfSoAnInnerReferenceIsStillTheRealTable |
Fact | A non recursive expression cannot see itself so an inner reference is still the real table. |
AnUnregisteredTableInsideAnExpressionBodyIsStillRejected |
Fact | An unregistered table inside an expression body is still rejected. |
AnExpressionMayNotTakeTheNameOfARegisteredTable |
Fact | An expression may not take the name of a registered table. |
CollectedTableReferencesExcludeExpressionNames |
Fact | Collected table references exclude expression names. |
DynamicSqlNamedParameterRewriteTests
Jube.Test.AskJooby.DynamicSqlNamedParameterRewriteTests — 7 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
TheSeededPieChartCommandRewritesWithItsParameterIntact |
Fact | The seeded pie chart command rewrites with its parameter intact. |
ParameterCaseAndUnderscoresSurviveTheRoundTrip |
Fact | Parameter case and underscores survive the round trip. |
MoreThanNineParametersRestoreWithoutPrefixCollision |
Fact | More than nine parameters restore without prefix collision. |
AnAtSignInsideAStringLiteralIsRestoredVerbatim |
Fact | An at sign inside a string literal is restored verbatim. |
PositionalParametersAreRefused |
Fact | Positional parameters are refused. |
AnUnregisteredTableIsRefusedEvenWithParameters |
Fact | An unregistered table is refused even with parameters. |
TheRegistryTemplatesAllRewriteTheirOwnTable |
Fact | The registry templates all rewrite their own table. |
DynamicSqlQueryLogRepositoryTests
Jube.Test.AskJooby.DynamicSqlQueryLogRepositoryTests — 2 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
InsertAsyncPersistsASuccessfulRunAsync |
Fact | Insert async persists a successful run. |
InsertAsyncPersistsAFailedRunWithTheErrorMessageAsync |
Fact | Insert async persists a failed run with the error message. |
DynamicSqlRoleFilteringTests
Jube.Test.AskJooby.DynamicSqlRoleFilteringTests — 2 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
EntityAnalysisModelWithARoleAssignedIsOnlyVisibleToAUserHoldingThatRoleNotJustAnyTenantMemberAsync |
Fact | Entity analysis model with a role assigned is only visible to a user holding that role not just any tenant member. |
EntityAnalysisModelWithNoRolesAssignedAtAllIsVisibleToAnyTenantMemberAsync |
Fact | Entity analysis model with no roles assigned at all is visible to any tenant member. |
DynamicSqlTableAccessTests
Jube.Test.AskJooby.DynamicSqlTableAccessTests — 19 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ScopedSqlSurvivesTheValidatorTheAgentPathActuallyRunsItThrough |
Fact | Scoped sql survives the validator the agent path actually runs it through. |
TheProtectedRelationGateStillBlocksScopedSqlAndIsWhyTheAgentPathMustNotUseIt |
Fact | The protected relation gate still blocks scoped sql and is why the agent path must not use it. |
TheCredentialColumnsAreProjectedAwaySoReachingTheTableCannotReachTheSecret |
Fact | The credential columns are projected away so reaching the table cannot reach the secret. |
TheRawGateRefusesCredentialTablesEvenThoughTheAllowListRegistersThem |
Fact | The raw gate refuses credential tables even though the allow list registers them. |
TheRawGateStillAdmitsAnOrdinaryTableTheCallerIsEntitledTo |
Fact | The raw gate still admits an ordinary table the caller is entitled to. |
BuildAllowedTablesIncludesAKnownRegisteredTableWhenPermissionGranted |
Fact | Build allowed tables includes a known registered table when permission granted. |
BuildAllowedTablesIncludesCaseFamilyTablesWhenPermission1IsGranted |
Fact | Build allowed tables includes case family tables when permission1 is granted. |
BuildAllowedTablesIncludesCaseCreationObservabilityTablesWhenPermission27IsGranted |
Fact | Build allowed tables includes case creation observability tables when permission27 is granted. |
BuildAllowedTablesOmitsCaseFamilyTablesWhenNeitherPermissionIsGranted |
Fact | Build allowed tables omits case family tables when neither permission is granted. |
BuildAllowedTablesLooksUpByTableNameCaseInsensitively |
Fact | Build allowed tables looks up by table name case insensitively. |
BuildAllowedTablesAddsARoleExistsCheckOnTopOfTenantForARoleGatedTable |
Fact | Build allowed tables adds a role exists check on top of tenant for a role gated table. |
BuildAllowedTablesOmitsEverythingWhenPermissionDenied |
Fact | Build allowed tables omits everything when permission denied. |
BuildAllowedTablesThrowsForAnEmptyUsername |
Fact | Build allowed tables throws for an empty username. |
BuildAllowedTablesThrowsForANullUsername |
Fact | Build allowed tables throws for a null username. |
ThePointerCacheIsNotQueryableWithoutAConversationToBindItTo |
Fact | The pointer cache is not queryable without a conversation to bind it to. |
ThePointerCacheIsBoundToTheCallersOwnConversation |
Fact | The pointer cache is bound to the callers own conversation. |
ThePointerCacheHonoursTheSameExpiryTheToolPathEnforces |
Fact | The pointer cache honours the same expiry the tool path enforces. |
TheConversationIdIsSplicedIntoExactlyTheConversationOwnedTables |
Fact | The conversation id is spliced into exactly the conversation owned tables. |
NoTemplateIsLeftHoldingAnUnresolvedToken |
Fact | No template is left holding an unresolved token. |
DynamicSqlTablePermissionParityTests
Jube.Test.AskJooby.DynamicSqlTablePermissionParityTests — 4 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryRegisteredTableWithAnOwningServiceDemandsThatServicesOwnPermissions |
Fact | Every registered table with an owning service demands that services own permissions. |
TheCredentialTablesAreNotQueryableOnTheBareAssistantPermission |
Fact | The credential tables are not queryable on the bare assistant permission. |
TheExhaustiveFamilyDemandsTheExhaustivePagePermission |
Fact | The exhaustive family demands the exhaustive page permission. |
TheTablesWithDifferentlyNamedOwningServicesDemandThoseServicesOwnPermissions |
Fact | The tables with differently named owning services demand those services own permissions. |
DynamicSqlTemplateSchemaSweepTests
Jube.Test.AskJooby.DynamicSqlTemplateSchemaSweepTests — 2 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
EveryRegisteredTemplateExplainsAgainstTheLiveSchemaAsync |
Fact | Every registered template explains against the live schema. |
EveryLiveTableIsEitherRegisteredOrBlockedInProtectedModeAsync |
Fact | Every live table is either registered or blocked in protected mode. |
ExportCachedTableToolTests
Jube.Test.AskJooby.ExportCachedTableToolTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ExportCachedTableToCsvWritesRealCsvBytesAndRecordsTheFileAsync |
Fact | Export cached table to csv writes real csv bytes and records the file. |
ExportCachedTableToCsvQuotesFieldsContainingCommasAndQuotesAsync |
Fact | Export cached table to csv quotes fields containing commas and quotes. |
ExportCachedTableToCsvReturnsAFriendlyMessageForAnUnknownPointerAsync |
Fact | Export cached table to csv returns a friendly message for an unknown pointer. |
ExportCachedTableToCsvRefusesAnEmptyTableAsync |
Fact | Export cached table to csv refuses an empty table. |
ExportCachedTableToCsvSanitizesAnUnsafeFileNameAsync |
Fact | Export cached table to csv sanitizes an unsafe file name. |
GetAskJoobyConversationRetrievedDocsQueryTests
Jube.Test.AskJooby.GetAskJoobyConversationRetrievedDocsQueryTests — 5 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
DeduplicatesTheSameBiteTextRetrievedByMultipleSearchesAsync |
Fact | Deduplicates the same bite text retrieved by multiple searches. |
ExcludesNoMatchingBitesFoundResultsAsync |
Fact | Excludes no matching bites found results. |
NeverReturnsAnotherConversationsSearchResultsAsync |
Fact | Never returns another conversations search results. |
CapsTheResultCountEvenWhenFarMoreDistinctSearchesExistAsync |
Fact | Caps the result count even when far more distinct searches exist. |
PrefersTheMostRecentDistinctSearchesWhenCappingAsync |
Fact | Prefers the most recent distinct searches when capping. |
GraphWorkflowToolTests
Jube.Test.AskJooby.GraphWorkflowToolTests — 9 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
ATaskInTheCallersOwnWordsFindsTheWorkflowForIt |
Fact | A task in the callers own words finds the workflow for it. |
ATrainingTaskInTheCallersOwnWordsFindsTheTrainingWorkflow |
Fact | A training task in the callers own words finds the training workflow. |
EveryWorkflowCanBeFetchedByTheIdTheSearchReturns |
Fact | Every workflow can be fetched by the id the search returns. |
TheStepsCarryTheEdgesAndNotJustTheProse |
Fact | The steps carry the edges and not just the prose. |
TheTtlCounterReferenceConventionIsInTheGraphWhereAnAgentWillSeeIt |
Fact | The ttl counter reference convention is in the graph where an agent will see it. |
AnOperatorStepSaysSoRatherThanNamingAnAgentThatCouldActOnIt |
Fact | An operator step says so rather than naming an agent that could act on it. |
AnUnknownIdAnswersWithTheIdsThatDoExist |
Fact | An unknown id answers with the ids that do exist. |
ATaskMatchingNothingSaysSoRatherThanGuessing |
Fact | A task matching nothing says so rather than guessing. |
AQuestionMadeEntirelyOfCommonWordsGetsTheCatalogueRatherThanAConfidentMatch |
Fact | A question made entirely of common words gets the catalogue rather than a confident match. |
InstructionsBuilderTests
Jube.Test.AskJooby.InstructionsBuilderTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ReachedSpawnDepthLimitAddsAnExplicitNoteNamingTheConfiguredCeiling |
Fact | Reached spawn depth limit adds an explicit note naming the configured ceiling. |
NoSpawnDepthLimitMeansNoCeilingNoteAtAll |
Fact | No spawn depth limit means no ceiling note at all. |
TheCeilingNoteSitsBeforeTheGenericRecapTextSoItReadsAsAnExceptionToIt |
Fact | The ceiling note sits before the generic recap text so it reads as an exception to it. |
PageContextAddsPurposeAndLikelyAsksToEveryAgentsOwnInstructions |
Fact | Page context adds purpose and likely asks to every agents own instructions. |
NoPageContextMeansNoPageNoteAtAll |
Fact | No page context means no page note at all. |
LargeResultPointerTests
Jube.Test.AskJooby.LargeResultPointerTests — 4 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
APayloadWrappingItsRowsIsCachedAsThoseRowsAndNotAsOneOpaqueCellAsync |
Fact | A payload wrapping its rows is cached as those rows and not as one opaque cell. |
TheModelIsToldTheRealRowCountRatherThanOneAsync |
Fact | The model is told the real row count rather than one. |
ASmallResultIsStillReturnedWholeRatherThanPointerisedAsync |
Fact | A small result is still returned whole rather than pointerised. |
APayloadWithNoRowsArrayFallsBackToASingleReadableCellAsync |
Fact | A payload with no rows array falls back to a single readable cell. |
ListQueryableTablesFilterTests
Jube.Test.AskJooby.ListQueryableTablesFilterTests — 4 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
AFilteredListingCarriesOnlyWhatWasAskedForAsync |
Fact | A filtered listing carries only what was asked for. |
AFilteredListingCarriesTheDocumentationCommentForEachMatchAsync |
Fact | A filtered listing carries the documentation comment for each match. |
AnUnfilteredListingStillWorksAndCarriesCommentsTooAsync |
Fact | An unfiltered listing still works and carries comments too. |
AFilterMatchingNothingSaysSoRatherThanInvitingAGuessAsync |
Fact | A filter matching nothing says so rather than inviting a guess. |
MemoryToolTests
Jube.Test.AskJooby.MemoryToolTests — 18 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
RecallLabelsAThumbsUpMemoryAsACorrectExampleAsync |
Fact | Recall labels a thumbs up memory as a correct example. |
RecallLabelsAThumbsDownMemoryAsAnIncorrectExampleAsync |
Fact | Recall labels a thumbs down memory as an incorrect example. |
RecallLabelsAnUnreviewedMemoryAsAgentGeneratedAsync |
Fact | Recall labels an unreviewed memory as agent generated. |
RememberPassesNoExpiryByDefaultAsync |
Fact | Remember passes no expiry by default. |
RememberConvertsExpiresInMinutesToAFutureUtcTimestampAsync |
Fact | Remember converts expires in minutes to a future utc timestamp. |
RememberRejectsAnExpiryOnSystemScopeMemoriesAsync |
Fact | Remember rejects an expiry on system scope memories. |
RememberRejectsAnUnrecognisedScopeAsync |
Fact | Remember rejects an unrecognised scope. |
RememberAllowsAnExpiryOnConversationScopeMemoriesAsync |
Fact | Remember allows an expiry on conversation scope memories. |
RememberRejectsANonPositiveExpiryAsync |
Fact | Remember rejects a non positive expiry. |
RecallPassesNoSinceFilterByDefaultAsync |
Fact | Recall passes no since filter by default. |
RecallConvertsSinceDaysAgoToAPastUtcTimestampAsync |
Fact | Recall converts since days ago to a past utc timestamp. |
RecallRejectsANonPositiveSinceDaysAgoAsync |
Fact | Recall rejects a non positive since days ago. |
RememberDefaultsToFactKindAsync |
Fact | Remember defaults to fact kind. |
RememberPassesReflectionKindThroughAsync |
Fact | Remember passes reflection kind through. |
RememberRejectsAnUnrecognisedKindAsync |
Fact | Remember rejects an unrecognised kind. |
RecallExcludesReflectionsByDefaultAsync |
Fact | Recall excludes reflections by default. |
RecallPassesIncludeReflectionsThroughWhenRequestedAsync |
Fact | Recall passes include reflections through when requested. |
RecallTagsAReflectionHitInItsOutputAsync |
Fact | Recall tags a reflection hit in its output. |
MemoryVolatilityGuardTests
Jube.Test.AskJooby.MemoryVolatilityGuardTests — 2 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
ALiveValueIsRefusedAndTheModelIsToldToQueryInsteadAsync |
Theory | A live value is refused and the model is told to query instead. |
AGenericPlanOrParameterisedPatternIsAcceptedAsync |
Theory | A generic plan or parameterised pattern is accepted. |
ModelAffinityPolicyTests
Jube.Test.AskJooby.ModelAffinityPolicyTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheHeaderCarriesTheConversationWheneverOneIsInScope |
Fact | The header carries the conversation whenever one is in scope. |
NoConversationInScopeLeavesTheRequestToRouteNormally |
Fact | No conversation in scope leaves the request to route normally. |
TheConversationReachesWorkDoneOnAnotherThreadAsync |
Fact | The conversation reaches work done on another thread. |
EveryBranchOfAFanOutCarriesTheSameValueAsync |
Fact | Every branch of a fan out carries the same value. |
LeavingAConversationRestoresWhateverWasThereBefore |
Fact | Leaving a conversation restores whatever was there before. |
OpenCorporatesClientTests
Jube.Test.AskJooby.OpenCorporatesClientTests — 13 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
SearchCompanySendsTheQueryAndApiTokenAsync |
Fact | Search company sends the query and api token. |
SearchCompanyParsesTheResultsAsync |
Fact | Search company parses the results. |
SearchCompanyCarriesTheRawResponseVerbatimAsync |
Fact | Search company carries the raw response verbatim. |
GetCompanySendsTheJurisdictionAndCompanyNumberInThePathAsync |
Fact | Get company sends the jurisdiction and company number in the path. |
GetCompanyParsesTheCompanyAsync |
Fact | Get company parses the company. |
GetCompanyReturnsNullRatherThanThrowingOnNotFoundAsync |
Fact | Get company returns null rather than throwing on not found. |
SearchCompanyThrowsWithTheStatusCodeOnEveryDocumentedErrorAsync |
Theory | Search company throws with the status code on every documented error. |
SearchBeneficialOwnersSendsTheControlledEntityNameAndUboFilterAsync |
Fact | Search beneficial owners sends the controlled entity name and ubo filter. |
SearchBeneficialOwnersOmitsTheOwnerFilterWhenNoneIsGivenAsync |
Fact | Search beneficial owners omits the owner filter when none is given. |
SearchBeneficialOwnersParsesEachStatementAsync |
Fact | Search beneficial owners parses each statement. |
SearchBeneficialOwnersParsesCleanlyWhenNoStatementsComeBackAsync |
Fact | Search beneficial owners parses cleanly when no statements come back. |
RecordsEachOperationAgainstTheGivenRunWhenARecorderIsSuppliedAsync |
Fact | Records each operation against the given run when a recorder is supplied. |
RecordsNothingWhenNoRecorderIsSuppliedAsync |
Fact | Records nothing when no recorder is supplied. |
OpenCorporatesToolTests
Jube.Test.AskJooby.OpenCorporatesToolTests — 19 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
SearchCompanyByNameReportsAMachineParseableCountLineAsync |
Fact | Search company by name reports a machine parseable count line. |
SearchCompanyByNameReportsNoMatchesAsync |
Fact | Search company by name reports no matches. |
SearchCompanyByNamePassesTheConfiguredDefaultMaxResultsThroughAsync |
Fact | Search company by name passes the configured default max results through. |
SearchCompanyByNameUsesTheModelSuppliedMaxResultsOverTheConfiguredDefaultAsync |
Fact | Search company by name uses the model supplied max results over the configured default. |
SearchCompanyByNameClampsAModelSuppliedMaxResultsAboveTheCeilingAsync |
Fact | Search company by name clamps a model supplied max results above the ceiling. |
SearchCompanyByNameClampsAModelSuppliedMaxResultsBelowOneAsync |
Fact | Search company by name clamps a model supplied max results below one. |
SearchCompanyByNameDoesNotSendWhenTheQueryMatchesPromptInjectionScreeningAsync |
Fact | Search company by name does not send when the query matches prompt injection screening. |
SearchCompanyByNameRecordsARequestSideGuardRejectionUnderItsOwnPipelineNameAsync |
Fact | Search company by name records a request side guard rejection under its own pipeline name. |
SearchCompanyByNameWithholdsACompanyWhoseNameMatchesPromptInjectionScreeningAsync |
Fact | Search company by name withholds a company whose name matches prompt injection screening. |
SearchCompanyByNameRecordsAnAggregateGuardRejectionWhenWithholdingCompaniesAsync |
Fact | Search company by name records an aggregate guard rejection when withholding companies. |
GetCompanyDetailsReportsNotFoundAsync |
Fact | Get company details reports not found. |
GetCompanyDetailsReturnsTheRecordAsync |
Fact | Get company details returns the record. |
GetCompanyDetailsDoesNotSendWhenAnArgumentMatchesPromptInjectionScreeningAsync |
Fact | Get company details does not send when an argument matches prompt injection screening. |
GetCompanyDetailsWithholdsARecordWhoseAddressMatchesPromptInjectionScreeningAsync |
Fact | Get company details withholds a record whose address matches prompt injection screening. |
SearchBeneficialOwnersReportsNoStatementsAsync |
Fact | Search beneficial owners reports no statements. |
SearchBeneficialOwnersReturnsEachStatementAsync |
Fact | Search beneficial owners returns each statement. |
SearchBeneficialOwnersDoesNotSendWhenTheQueryMatchesPromptInjectionScreeningAsync |
Fact | Search beneficial owners does not send when the query matches prompt injection screening. |
SearchBeneficialOwnersWithholdsAStatementWhoseControllingNameMatchesScreeningAsync |
Fact | Search beneficial owners withholds a statement whose controlling name matches screening. |
PassesTheRecorderAndRunIdThroughToTheClientAsync |
Fact | Passes the recorder and run id through to the client. |
PagePurposeCatalogueTests
Jube.Test.AskJooby.PagePurposeCatalogueTests — 3 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryPageNameSentByTheClientIsCatalogedOrExplicitlyExempt |
Fact | Every page name sent by the client is cataloged or explicitly exempt. |
NoCataloguedPageNameIsAlsoListedAsExempt |
Fact | No catalogued page name is also listed as exempt. |
NoCataloguedPageNameHasGoneStaleAgainstTheClient |
Fact | No catalogued page name has gone stale against the client. |
PlanToolTests
Jube.Test.AskJooby.PlanToolTests — 9 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
WritePlanRecordsTheRenderedPlanOnTheTurn |
Fact | Write plan records the rendered plan on the turn. |
WritePlanRejectsAnEmptyPlan |
Fact | Write plan rejects an empty plan. |
WritePlanRejectsAPlanLongerThanTheCeiling |
Fact | Write plan rejects a plan longer than the ceiling. |
WritePlanRejectsAStepWithNoCheck |
Fact | Write plan rejects a step with no check. |
WritePlanFillsTheStableFromTheSpecialistAndRecordsIt |
Fact | Write plan fills the stable from the specialist and records it. |
WritePlanRefusesAStableThatDoesNotOwnTheSpecialist |
Fact | Write plan refuses a stable that does not own the specialist. |
AStablePlanIsRecordedAgainstThatStableAndNotTheRootPlan |
Fact | A stable plan is recorded against that stable and not the root plan. |
AStablePlanRefusesASpecialistThatBelongsToAnotherStable |
Fact | A stable plan refuses a specialist that belongs to another stable. |
WritePlanRefusesAnUnknownStableForASpecialistWithNoStable |
Fact | Write plan refuses an unknown stable for a specialist with no stable. |
PlatformOpsWorkflowCoverageTests
Jube.Test.AskJooby.PlatformOpsWorkflowCoverageTests — 10 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryWorkflowCarriesEnoughSemanticsToBeChosenWithoutThePasture |
Fact | Every workflow carries enough semantics to be chosen without the pasture. |
AnAgentNodeNamesARegisteredAgentAndAnOperatorNodeNamesNobody |
Fact | An agent node names a registered agent and an operator node names nobody. |
EveryToolNamedAnywhereIsOneTheCatalogueCarries |
Fact | Every tool named anywhere is one the catalogue carries. |
EveryNodeIsOwnedByAnAgentThatActuallyHoldsTheToolsItNames |
Fact | Every node is owned by an agent that actually holds the tools it names. |
NoPlatformOperationsNodeClaimsToActOnThePlatform |
Fact | No platform operations node claims to act on the platform. |
EveryWorkflowHandsTheActOverWhereThereIsAnActToHandOver |
Fact | Every workflow hands the act over where there is an act to hand over. |
NoNodeRequiresAnArtefactNothingBeforeItProduces |
Fact | No node requires an artefact nothing before it produces. |
EveryObservationalWorkflowTakesTheWideSampleBeforeTheRecentOne |
Fact | Every observational workflow takes the wide sample before the recent one. |
TheTriageWorkflowReadsTheStackFromTheBottom |
Fact | The triage workflow reads the stack from the bottom. |
TheBackupWorkflowStatesItsOwnBlindnessBeforeAnythingElse |
Fact | The backup workflow states its own blindness before anything else. |
PreservationSnapshotCoverageTests
Jube.Test.AskJooby.PreservationSnapshotCoverageTests — 2 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
TheRequestExposesEverySwitchTheExportItselfSupports |
Fact | The request exposes every switch the export itself supports. |
EverythingButTheLargestIsIncludedUnlessTheCallerSaysOtherwise |
Fact | Everything but the largest is included unless the caller says otherwise. |
PromptCacheUsageKeyTests
Jube.Test.AskJooby.PromptCacheUsageKeyTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheHitCountIsReadAndTheMissCountBesideItIsNot |
Fact | The hit count is read and the miss count beside it is not. |
AMissCountOnItsOwnIsNeverMistakenForACachedFigure |
Fact | A miss count on its own is never mistaken for a cached figure. |
ACacheWriteIsNotACacheRead |
Fact | A cache write is not a cache read. |
AProviderReportingNothingYieldsNothingRatherThanAZeroReading |
Fact | A provider reporting nothing yields nothing rather than a zero reading. |
TheOpenAiCompatibleDetailSpellingIsRead |
Fact | The open ai compatible detail spelling is read. |
PromptCacheUsageTests
Jube.Test.AskJooby.PromptCacheUsageTests — 6 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheProvidersOwnCacheReadCountIsTakenWhateverItCallsIt |
Fact | The providers own cache read count is taken whatever it calls it. |
AReportedMissIsZeroAndNotSilenceBecauseTheTwoMeanDifferentThings |
Fact | A reported miss is zero and not silence because the two mean different things. |
ACacheWriteIsNeverMistakenForARead |
Fact | A cache write is never mistaken for a read. |
AReadIsStillFoundAlongsideAWrite |
Fact | A read is still found alongside a write. |
AnUnrelatedCountIsNotReadAsACacheFigure |
Fact | An unrelated count is not read as a cache figure. |
NoUsageAtAllIsReportedAsNothingRatherThanThrowing |
Fact | No usage at all is reported as nothing rather than throwing. |
PromptPrefixStabilityTests
Jube.Test.AskJooby.PromptPrefixStabilityTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TwoValidationsShareEveryByteOfTheCriteriaBeforeAnythingVolatileAppears |
Fact | Two validations share every byte of the criteria before anything volatile appears. |
TheValidationFormatReminderStillComesLastSoItIsTheModelsFinalInstruction |
Fact | The validation format reminder still comes last so it is the models final instruction. |
TwoRevisionsShareEveryByteOfTheMethodBeforeAnythingVolatileAppears |
Fact | Two revisions share every byte of the method before anything volatile appears. |
PromptPrefixTests
Jube.Test.AskJooby.PromptPrefixTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheSameSystemPromptHashesTheSameHoweverTheRestOfTheTurnDiffers |
Fact | The same system prompt hashes the same however the rest of the turn differs. |
OneCharacterAtTheStartChangesTheHashBecauseItAlsoBreaksTheCache |
Fact | One character at the start changes the hash because it also breaks the cache. |
TheSystemMessageIsTakenEvenWhenItIsNotFirstInTheList |
Fact | The system message is taken even when it is not first in the list. |
WithNoSystemMessageTheFirstMessageIsHashedInstead |
Fact | With no system message the first message is hashed instead. |
NothingToHashIsReportedAsNothingRatherThanThrowing |
Fact | Nothing to hash is reported as nothing rather than throwing. |
ProviderMarkupLeakTests
Jube.Test.AskJooby.ProviderMarkupLeakTests — 7 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ASwallowedToolCallIsCutOutOfTheArgumentItLeakedIntoAsync |
Fact | A swallowed tool call is cut out of the argument it leaked into. |
TheModelIsToldTheCallDidNotRunAndWhichOneItWasAsync |
Fact | The model is told the call did not run and which one it was. |
DeepSeeksOwnSeparatorFormIsRecognisedTooAsync |
Fact | Deep seeks own separator form is recognised too. |
MarkupThatNamesNothingStillWarnsRatherThanPassingSilentlyAsync |
Fact | Markup that names nothing still warns rather than passing silently. |
AnOrdinaryArgumentIsUntouchedAndUnannotatedAsync |
Fact | An ordinary argument is untouched and unannotated. |
AnAsciiPipeIsNotMistakenForAControlTokenAsync |
Fact | An ascii pipe is not mistaken for a control token. |
StripAndNameReadTheLeakWithoutExecutingAnythingFromIt |
Fact | Strip and name read the leak without executing anything from it. |
ProviderMarkupTruncationTests
Jube.Test.AskJooby.ProviderMarkupTruncationTests — 9 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
LooksTruncatedMatchesOnlyADanglingTrailingWord |
Theory | Looks truncated matches only a dangling trailing word. |
LooksTruncatedIsNullSafe |
Fact | Looks truncated is null safe. |
ANonStreamingReplyThatStopsOnADanglingWordIsReaskedAndStitchedTogetherAsync |
Fact | A non streaming reply that stops on a dangling word is reasked and stitched together. |
ANonStreamingReplyThatEndsCleanlyIsNeverReaskedAsync |
Fact | A non streaming reply that ends cleanly is never reasked. |
ADanglingWordAtLengthBudgetIsNotTreatedAsTruncationAsync |
Fact | A dangling word at length budget is not treated as truncation. |
ADanglingWordAlongsideARealToolCallIsNotTreatedAsTruncationAsync |
Fact | A dangling word alongside a real tool call is not treated as truncation. |
AStreamingReplyThatStopsOnADanglingWordIsReaskedAndContinuedAsync |
Fact | A streaming reply that stops on a dangling word is reasked and continued. |
AStreamingReplyThatEndsCleanlyIsNeverReaskedAsync |
Fact | A streaming reply that ends cleanly is never reasked. |
AStreamingReplyStillDanglingAfterOneReaskSaysSoRatherThanLoopingAsync |
Fact | A streaming reply still dangling after one reask says so rather than looping. |
RagSearchToolTests
Jube.Test.AskJooby.RagSearchToolTests — 12 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ResultStartsWithAMachineParseableCountLineAsync |
Fact | Result starts with a machine parseable count line. |
ReportsNoMatchingBitesWhenNothingComesBackAsync |
Fact | Reports no matching bites when nothing comes back. |
PassesTheConfiguredTopKThroughToTheRagClientAsync |
Fact | Passes the configured top k through to the rag client. |
DefaultsToATopKOfFiveWhenNoneIsSuppliedAsync |
Fact | Defaults to a top k of five when none is supplied. |
UsesTheModelSuppliedMaxBitesOverTheConfiguredTopKAsync |
Fact | Uses the model supplied max bites over the configured top k. |
ClampsAModelSuppliedMaxBitesAboveTheCeilingAsync |
Fact | Clamps a model supplied max bites above the ceiling. |
ClampsAModelSuppliedMaxBitesBelowOneAsync |
Fact | Clamps a model supplied max bites below one. |
FreshBitesStillComeBackInFullAlongsideTheNamedRepeatsAsync |
Fact | Fresh bites still come back in full alongside the named repeats. |
CandidatesAreForwardedToTheSearchToBeRerankedAsync |
Fact | Candidates are forwarded to the search to be reranked. |
CandidatesAreClampedToTheCeilingWhateverTheModelAsksForAsync |
Fact | Candidates are clamped to the ceiling whatever the model asks for. |
UnsetCandidatesDefersToTheDeploymentDefaultAsync |
Fact | Unset candidates defers to the deployment default. |
MaxBitesStillCapsWhatComesBackAtEightAsync |
Fact | Max bites still caps what comes back at eight. |
RenderChartToolTests
Jube.Test.AskJooby.RenderChartToolTests — 16 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
RenderChartNeverReturnsTheChartItselfOnlyThatItWasDrawnAsync |
Fact | Render chart never returns the chart itself only that it was drawn. |
RenderChartPutsRealSvgOntoTheReplyAsAnAttachmentAsync |
Fact | Render chart puts real svg onto the reply as an attachment. |
RenderChartDrawsSeveralSeriesWhenGivenSeveralValueColumnsAsync |
Fact | Render chart draws several series when given several value columns. |
RenderChartReportsAMissingPointerRatherThanThrowingAsync |
Fact | Render chart reports a missing pointer rather than throwing. |
RenderChartNamesTheRealColumnsWhenGivenOneThatDoesNotExistAsync |
Fact | Render chart names the real columns when given one that does not exist. |
RenderChartListsTheTypesItKnowsWhenGivenOneItDoesNotAsync |
Fact | Render chart lists the types it knows when given one it does not. |
RenderChartRefusesAColumnThatHoldsNothingNumericAsync |
Fact | Render chart refuses a column that holds nothing numeric. |
EveryCategoricalChartTypeTheToolAdvertisesActuallyDrawsAsync |
Theory | Every categorical chart type the tool advertises actually draws. |
ScatterPlotsOneNumericColumnAgainstAnotherAsync |
Fact | Scatter plots one numeric column against another. |
RenderChartRefusesATableTooLargeToReadAsAChartAsync |
Fact | Render chart refuses a table too large to read as a chart. |
TheRendererAdvertisesExactlyTheTypesTheToolDescriptionNames |
Fact | The renderer advertises exactly the types the tool description names. |
AHistogramNeedsNoCategoryColumnBecauseItLabelsItsOwnAxisAsync |
Fact | A histogram needs no category column because it labels its own axis. |
AHistogramBinsTheRawValuesRatherThanDrawingOneMarkPerRow |
Fact | A histogram bins the raw values rather than drawing one mark per row. |
ABinCountIsHonouredBecauseAThresholdHasToLandOnAnEdge |
Fact | A bin count is honoured because a threshold has to land on an edge. |
AnOrdinaryChartStillDemandsItsCategoryColumn |
Fact | An ordinary chart still demands its category column. |
TheRendererDrawsWithInlineStylesSoAnImageTagCanShowIt |
Fact | The renderer draws with inline styles so an image tag can show it. |
RepeatedToolLedgerTests
Jube.Test.AskJooby.RepeatedToolLedgerTests — 9 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheSameReadWithTheSameArgumentsIsAnsweredFromTheFirstOne |
Fact | The same read with the same arguments is answered from the first one. |
DifferentArgumentsAreADifferentQuestionAndRunAgain |
Fact | Different arguments are a different question and run again. |
ALiveReadingIsNeverRepeatedBecauseAskingTwiceMayBeThePoint |
Fact | A live reading is never repeated because asking twice may be the point. |
AWriteIsNeverRepeatedHoweverIdenticalTheArgumentsAre |
Fact | A write is never repeated however identical the arguments are. |
RememberingAnUnrepeatableToolIsIgnoredRatherThanStored |
Fact | Remembering an unrepeatable tool is ignored rather than stored. |
TheSearchesThatWentNowhereAreTheOnesWorthNotRepeating |
Fact | The searches that went nowhere are the ones worth not repeating. |
ARepeatableToolIsAnnouncedOnceAcrossTheWholeTurnHoweverManyAgentsAskForIt |
Fact | A repeatable tool is announced once across the whole turn however many agents ask for it. |
TheSameToolAskedADifferentQuestionIsStillAnnounced |
Fact | The same tool asked a different question is still announced. |
AToolThatIsNotRepeatableIsAlwaysAnnounced |
Fact | A tool that is not repeatable is always announced. |
ReplyDraftTests
Jube.Test.AskJooby.ReplyDraftTests — 6 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
NarrationWrittenBeforeAToolCallIsNotPartOfTheAnswer |
Fact | Narration written before a tool call is not part of the answer. |
FilingAMemoryAfterTheAnswerDoesNotDiscardTheAnswer |
Fact | Filing a memory after the answer does not discard the answer. |
AnAnswerDiscardedByAToolCallIsRecoveredWhenOnlyASignOffFollowsIt |
Fact | An answer discarded by a tool call is recovered when only a sign off follows it. |
AForwardedJoobriksActivityNeverTruncatesTheAnswerBeingWritten |
Fact | A forwarded joobriks activity never truncates the answer being written. |
ThinkingAndThoughtLeaveTheAnswerAlone |
Fact | Thinking and thought leave the answer alone. |
AnAnswerWithNoToolCallAtAllSurvivesWhole |
Fact | An answer with no tool call at all survives whole. |
RerankingToggleTests
Jube.Test.AskJooby.RerankingToggleTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
RerankingIsOnByDefaultSoAnOperatorHasToOptOut |
Fact | Reranking is on by default so an operator has to opt out. |
SettingTheFlagToFalseTurnsRerankingOff |
Fact | Setting the flag to false turns reranking off. |
OnlyTheLiteralFalseTurnsRerankingOff |
Fact | Only the literal false turns reranking off. |
ResponseReviserTests
Jube.Test.AskJooby.ResponseReviserTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
BuildTaskIncludesTheQuestionDraftFeedbackAndDocs |
Fact | Build task includes the question draft feedback and docs. |
BuildTaskTellsTheReviserToSearchRatherThanDefendTheOriginalGuess |
Fact | Build task tells the reviser to search rather than defend the original guess. |
BuildTaskAsksForSeveralDifferentSearchAttemptsRatherThanOneRepeat |
Fact | Build task asks for several different search attempts rather than one repeat. |
BuildTaskTellsTheReviserCodeOutranksDocsOnConflict |
Fact | Build task tells the reviser code outranks docs on conflict. |
BuildTaskNotesWhenTheOriginalHadNoDocsAtAll |
Fact | Build task notes when the original had no docs at all. |
ResponseValidatorTests
Jube.Test.AskJooby.ResponseValidatorTests — 14 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
IsApprovedWhenStatusIsPassed |
Fact | Is approved when status is passed. |
TrimsAndIgnoresCaseWhenMatchingPassed |
Fact | Trims and ignores case when matching passed. |
ReturnsTheReasonAsFeedbackWhenStatusIsFailed |
Fact | Returns the reason as feedback when status is failed. |
TreatsAnUnparseableResponseAsFailedUsingTheRawTextAsFeedback |
Fact | Treats an unparseable response as failed using the raw text as feedback. |
ParsesKindOmissionWhenTheValidatorFoundNothingEitherWay |
Fact | Parses kind omission when the validator found nothing either way. |
ParsesKindErrorWhenABiteActivelyContradictsTheClaim |
Fact | Parses kind error when a bite actively contradicts the claim. |
DefaultsToErrorWhenKindIsMissingOrUnparseable |
Fact | Defaults to error when kind is missing or unparseable. |
ApprovedResultsHaveNoFailureKind |
Fact | Approved results have no failure kind. |
BuildTaskIncludesTheQuestionDocsAndReply |
Fact | Build task includes the question docs and reply. |
BuildTaskTellsTheValidatorToSearchRatherThanTrustTheSuppliedDocsAlone |
Fact | Build task tells the validator to search rather than trust the supplied docs alone. |
BuildTaskFlagsEverythingAsUnconfirmedWhenNoDocsWereEverRetrieved |
Fact | Build task flags everything as unconfirmed when no docs were ever retrieved. |
BuildTaskTellsTheValidatorCodeOutranksDocsOnConflict |
Fact | Build task tells the validator code outranks docs on conflict. |
BuildTaskAsksForAKindFieldDistinguishingOmissionFromError |
Fact | Build task asks for a kind field distinguishing omission from error. |
BuildTaskTellsTheValidatorNotToKeepRephrasingTheSameSearch |
Fact | Build task tells the validator not to keep rephrasing the same search. |
RetrievedBiteLedgerTests
Jube.Test.AskJooby.RetrievedBiteLedgerTests — 5 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
ASecondAgentIsGivenTheBiteInFullRatherThanTheSuppressionNoticeAsync |
Fact | A second agent is given the bite in full rather than the suppression notice. |
TheSameAgentAskingTwiceIsToldToScrollUpRatherThanSentItAgainAsync |
Fact | The same agent asking twice is told to scroll up rather than sent it again. |
TheSearchAllowanceIsSpentByTheTurnAndNotByEachAgentSeparately |
Fact | The search allowance is spent by the turn and not by each agent separately. |
WhetherTheTurnRetrievedAnythingIsAnsweredAcrossEveryAgentInIt |
Fact | Whether the turn retrieved anything is answered across every agent in it. |
AnAgentWithNoIdentityFallsBackToTheOneUnattributedBucket |
Fact | An agent with no identity falls back to the one unattributed bucket. |
RoutingRulesCoverageTests
Jube.Test.AskJooby.RoutingRulesCoverageTests — 4 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryDomainIsReachableFromRouting |
Fact | Every domain is reachable from routing. |
EveryRoutingRuleNamesAnAgentThatActuallyExists |
Fact | Every routing rule names an agent that actually exists. |
EveryRoutingRuleCarriesExemplarsAndADescriptionForTheStagesThatUseThem |
Fact | Every routing rule carries exemplars and a description for the stages that use them. |
RoutingIsOfferedPerDomainRatherThanPerLeaf |
Fact | Routing is offered per domain rather than per leaf. |
RoutingTierAndHandBackTests
Jube.Test.AskJooby.RoutingTierAndHandBackTests — 16 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
ARoutingTierKeepsFreeFormSqlAsTheSameUniversalFallbackEveryAgentHolds |
Fact | A routing tier keeps free form sql as the same universal fallback every agent holds. |
TheVisualisationDefinitionRoutingTierCanFallBackToSqlRatherThanFabricateAHandBackTarget |
Fact | The visualisation definition routing tier can fall back to sql rather than fabricate a hand back target. |
ARoutingTierKeepsTheCachedResultReadersSoItCanReadWhatItsJoobriksProduced |
Fact | A routing tier keeps the cached result readers so it can read what its joobriks produced. |
ALeafKeepsFreeFormSqlBecauseAnAggregateAcrossSlicesIsARealNeed |
Fact | A leaf keeps free form sql because an aggregate across slices is a real need. |
EveryAgentWithoutOperationsOfItsOwnIsTreatedAsARoutingTier |
Fact | Every agent without operations of its own is treated as a routing tier. |
HandBackIsOfferedOnlyWhereSomeoneIsWaitingOnTheAnswer |
Fact | Hand back is offered only where someone is waiting on the answer. |
HandBackRecordsWhatIsNeededAndWhoOwnsIt |
Fact | Hand back records what is needed and who owns it. |
AnUnnamedOwnerIsCarriedAsUnknownRatherThanAsAnEmptyString |
Fact | An unnamed owner is carried as unknown rather than as an empty string. |
AFabricatedOwningAgentNameIsDroppedRatherThanPassedOn |
Fact | A fabricated owning agent name is dropped rather than passed on. |
ARealAgentNameStillPassesEvenWhenItIsNotTheRightOneForThisQuestion |
Fact | A real agent name still passes even when it is not the right one for this question. |
TheFirstHandBackWins |
Fact | The first hand back wins. |
ARoutingTierHoldsTheReadsOfItsDelegatesButNeverTheirWrites |
Fact | A routing tier holds the reads of its delegates but never their writes. |
AWorkerIsNotHandedAWriteThroughTheTierEvenWhenItsDelegateHoldsOne |
Fact | A worker is not handed a write through the tier even when its delegate holds one. |
StaticGraphAndFieldLookupsAreAnsweredOncePerTurn |
Fact | Static graph and field lookups are answered once per turn. |
TheWorkerIsNeverToldItHoldsNoSql |
Fact | The worker is never told it holds no sql. |
EveryLeafIsAHierarchyAgentThatCannotDelegateExceptToTheSharedWebResearchSpecialist |
Fact | Every leaf is a hierarchy agent that cannot delegate except to the shared web research specialist. |
RuleExtensionCatalogueTests
Jube.Test.AskJooby.RuleExtensionCatalogueTests — 8 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
TheCatalogueFindsTheWholeExtensionSurfaceAndNotAHandfulOfIt |
Fact | The catalogue finds the whole extension surface and not a handful of it. |
EverySignatureIsRenderedInVisualBasicAndNotInTheLanguageItWasWrittenIn |
Fact | Every signature is rendered in visual basic and not in the language it was written in. |
AParameterlessExtensionRendersAsTheCallARuleActuallyWrites |
Fact | A parameterless extension renders as the call a rule actually writes. |
AParamArrayIsAdvertisedAsOneRatherThanAsAnArrayArgument |
Fact | A param array is advertised as one rather than as an array argument. |
TheEvalMechanismIsNotOfferedAsSomethingToCall |
Fact | The eval mechanism is not offered as something to call. |
EveryAgentGivenTheseToolsIsOneThatActuallyWritesAFragment |
Fact | Every agent given these tools is one that actually writes a fragment. |
WhatTheModelActuallyReceivesIsTheVisualBasicDeclarationAndNotTheSameThingTwice |
Fact | What the model actually receives is the visual basic declaration and not the same thing twice. |
EveryToolNameBindsToARealMethodOnTheToolClass |
Fact | Every tool name binds to a real method on the tool class. |
RuleExtensionChainValidatorTests
Jube.Test.AskJooby.RuleExtensionChainValidatorTests — 8 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
AWellFormedChainResolvesAndCarriesTheTypeThroughIt |
Fact | A well formed chain resolves and carries the type through it. |
AMisspeltCallIsReportedRatherThanAbsorbedIntoTheThingBeingOperatedOn |
Fact | A misspelt call is reported rather than absorbed into the thing being operated on. |
AMethodCalledOnTheWrongTypeSaysWhichTypeItDoesLiveOn |
Fact | A method called on the wrong type says which type it does live on. |
TheWrongNumberOfArgumentsIsAnsweredWithTheShapesThatDoExist |
Fact | The wrong number of arguments is answered with the shapes that do exist. |
AnOptionalArgumentMayBeOmittedAndAParamArrayMayBeRepeated |
Fact | An optional argument may be omitted and a param array may be repeated. |
ADecimalPointInsideAnArgumentIsNotMistakenForALinkInTheChain |
Fact | A decimal point inside an argument is not mistaken for a link in the chain. |
AQuotedDotIsNotMistakenForALinkEither |
Fact | A quoted dot is not mistaken for a link either. |
AnExpressionNamingNothingAtAllSaysSoRatherThanPassing |
Fact | An expression naming nothing at all says so rather than passing. |
RuleTaxonomyWorkflowCoverageTests
Jube.Test.AskJooby.RuleTaxonomyWorkflowCoverageTests — 12 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
EveryDocumentedTaxonomyTypeHasAWorkflowAndNothingElseDoes |
Fact | Every documented taxonomy type has a workflow and nothing else does. |
EveryWorkflowKeepsTheTitleTheTaxonomyGaveIt |
Fact | Every workflow keeps the title the taxonomy gave it. |
EveryWorkflowCarriesEnoughSemanticsToBeChosenWithoutTheePasture |
Fact | Every workflow carries enough semantics to be chosen without thee pasture. |
EveryRuleTaxonomyNodeIsPerformableByAnAgent |
Fact | Every rule taxonomy node is performable by an agent. |
EveryWorkflowIdAndNodeIdIsUnique |
Fact | Every workflow id and node id is unique. |
NoNodeRequiresAnArtefactThatNoEarlierNodeProduces |
Fact | No node requires an artefact that no earlier node produces. |
EveryWorkflowLooksForSomethingItCouldReuseBeforeItCreatesAnything |
Fact | Every workflow looks for something it could reuse before it creates anything. |
EveryWorkflowEndsBySynchronisingAndCheckingTheFragmentCompiled |
Fact | Every workflow ends by synchronising and checking the fragment compiled. |
EveryNodeIsOwnedByAnAgentThatExists |
Fact | Every node is owned by an agent that exists. |
EveryNodeIsOwnedByAnAgentThatActuallyHoldsTheToolsItNames |
Fact | Every node is owned by an agent that actually holds the tools it names. |
EveryNodeNamesCataloguedToolsThatActuallyExist |
Fact | Every node names catalogued tools that actually exist. |
TheTwoTypesWhoseOrderingIsOppositeBothSaySoOnTheWorkflow |
Fact | The two types whose ordering is opposite both say so on the workflow. |
RunScriptToolTests
Jube.Test.AskJooby.RunScriptToolTests — 6 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
CheckRServerHealthReportsStatusAndScriptRulesAsync |
Fact | Check r server health reports status and script rules. |
ListRPackagesReportsEachPackageAsync |
Fact | List r packages reports each package. |
ValidateRScriptReportsErrorsWhenNotOkAsync |
Fact | Validate r script reports errors when not ok. |
RunScriptReportsConsoleOutputOnSuccessAsync |
Fact | Run script reports console output on success. |
RunScriptReportsTheErrorOnFailureAsync |
Fact | Run script reports the error on failure. |
RunScriptReturnsAFriendlyRejectionInsteadOfThrowingAsync |
Fact | Run script returns a friendly rejection instead of throwing. |
RunSqlQueryToolTests
Jube.Test.AskJooby.RunSqlQueryToolTests — 7 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
RunSqlQueryReturnsAPointerAndAPreviewOnSuccessAsync |
Fact | Run sql query returns a pointer and a preview on success. |
RunSqlQueryReturnsAFriendlyRejectionInsteadOfThrowingAsync |
Fact | Run sql query returns a friendly rejection instead of throwing. |
RunSqlQueryHandlesAnEmptyResultSetAsync |
Fact | Run sql query handles an empty result set. |
RunSqlQueryDoesNotStoreAnythingWhenTheQueryIsRejectedAsync |
Fact | Run sql query does not store anything when the query is rejected. |
RunSqlQueryWithholdsARowThatMatchesPromptInjectionScreeningButKeepsTheCleanRowsAsync |
Fact | Run sql query withholds a row that matches prompt injection screening but keeps the clean rows. |
RunSqlQueryRecordsAGuardRejectionWhenWithholdingARowAsync |
Fact | Run sql query records a guard rejection when withholding a row. |
RunSqlQueryRecordsNothingWhenNoRowIsWithheldAsync |
Fact | Run sql query records nothing when no row is withheld. |
SearchAskJoobyRagChunkQueryTests
Jube.Test.AskJooby.SearchAskJoobyRagChunkQueryTests — 3 tests. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
KeywordOnlySearchMatchesAChunkThatOnlyContainsOneOfSeveralQueryTermsAsync |
Fact | Keyword only search matches a chunk that only contains one of several query terms. |
KeywordOnlySearchStillHonoursTheMinScoreFloorAsync |
Fact | Keyword only search still honours the min score floor. |
HybridSearchDoesNotApplyTheMinScoreFloorToTheFusedRankScoreAsync |
Fact | Hybrid search does not apply the min score floor to the fused rank score. |
SnapshotOnWriteAiFunctionTests
Jube.Test.AskJooby.SnapshotOnWriteAiFunctionTests — 5 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
ASnapshotIsTakenBeforeTheChangeRunsAsync |
Fact | A snapshot is taken before the change runs. |
EveryChangeGetsItsOwnRestorePointRatherThanOnePerRunAsync |
Fact | Every change gets its own restore point rather than one per run. |
TheChangeDoesNotRunIfItsRestorePointCouldNotBeTakenAsync |
Fact | The change does not run if its restore point could not be taken. |
TheRestorePointIsAnnouncedWithTheIdNeededToUseItAsync |
Fact | The restore point is announced with the id needed to use it. |
AToolWithNoChannelStillRunsAndStillSnapshotsAsync |
Fact | A tool with no channel still runs and still snapshots. |
SpawnAgentToolTests
Jube.Test.AskJooby.SpawnAgentToolTests — 19 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
SpawnAgentIsRefusedWhenThePlanHasNoStepForTheSpecialistsStableAsync |
Fact | Spawn agent is refused when the plan has no step for the specialists stable. |
AStableIsRefusedAFanOutUntilItHasItsOwnPlanAsync |
Fact | A stable is refused a fan out until it has its own plan. |
SpawnAgentThrowsWhenTheCallerLacksThePermissionForTheRequestedSpecialistAsync |
Fact | Spawn agent throws when the caller lacks the permission for the requested specialist. |
SpawnAgentThrowsForAnUnknownAgentTypeAsync |
Fact | Spawn agent throws for an unknown agent type. |
SpawnAgentDelegatesToAPermittedSpecialistAndReturnsItsFinalAnswerAsync |
Fact | Spawn agent delegates to a permitted specialist and returns its final answer. |
SpawnAgentTellsTheCallerToSpeakUpWhenAHandBackLeavesNowhereFurtherToRouteItAsync |
Fact | Spawn agent tells the caller to speak up when a hand back leaves nowhere further to route it. |
SpawnAgentForwardsTheSpawnedJoobriksOwnStepsLiveLabelledWithItsAgentTypeAsync |
Fact | Spawn agent forwards the spawned joobriks own steps live labelled with its agent type. |
SpawnAgentForwardsTheSpawnedJoobriksOwnReasoningLabelledWithItsAgentTypeAsync |
Fact | Spawn agent forwards the spawned joobriks own reasoning labelled with its agent type. |
SpawnAgentAnnouncesTheAgentItIsPickingUpBeforeItStartsWorkingAsync |
Fact | Spawn agent announces the agent it is picking up before it starts working. |
SpawnAgentsThrowsForFewerThanTwoSubTasksAsync |
Fact | Spawn agents throws for fewer than two sub tasks. |
SpawnAgentsThrowsWhenExceedingMaxFanOutAsync |
Fact | Spawn agents throws when exceeding max fan out. |
SpawnAgentsRunsIndependentSubTasksConcurrentlyAndLabelsEachWithAnOrdinalAsync |
Fact | Spawn agents runs independent sub tasks concurrently and labels each with an ordinal. |
ACutOffChildIsRecordedAsCancelledRatherThanLeftRunningAsync |
Fact | A cut off child is recorded as cancelled rather than left running. |
ASingleHandoverNeedsNoPlanButIsCountedAsUnplannedAsync |
Fact | A single handover needs no plan but is counted as unplanned. |
GeneralCannotJumpStraightToASpecialistOutsideItsOwnStablesAsync |
Fact | General cannot jump straight to a specialist outside its own stables. |
GeneralCanStillReachOneOfItsOwnDeclaredStablesAsync |
Fact | General can still reach one of its own declared stables. |
SpawnAgentsAcrossTwoStablesIsRefusedUntilAPlanExistsAsync |
Fact | Spawn agents across two stables is refused until a plan exists. |
SpawnAgentIsRefusedWhenTheTurnHasNoLedgerAtAllAsync |
Fact | Spawn agent is refused when the turn has no ledger at all. |
ANestedJoobrikIsNotAskedToPlanAgainAsync |
Fact | A nested joobrik is not asked to plan again. |
SpawnAgentsConcurrencyDbTests
Jube.Test.AskJooby.SpawnAgentsConcurrencyDbTests — 1 test. Category: AskJooby. Collection: Database.
| Test | Kind | Verifies |
|---|---|---|
SpawnAgentsRunningConcurrentlyDoesNotRaceTheDatabaseConnectionAsync |
Fact | Spawn agents running concurrently does not race the database connection. |
SqlPreFlightToolTests
Jube.Test.AskJooby.SqlPreFlightToolTests — 9 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ValidateSqlQueryReportsTheDatabaseErrorRatherThanAGenericFailureAsync |
Fact | Validate sql query reports the database error rather than a generic failure. |
ValidateSqlQuerySaysNothingAboutCostWhenTheStatementIsValidAsync |
Fact | Validate sql query says nothing about cost when the statement is valid. |
ExplainSqlQueryNamesTheRelationsScannedSequentiallyAsync |
Fact | Explain sql query names the relations scanned sequentially. |
InspectTableStatisticsWarnsWhenTheTableIsLargeAsync |
Fact | Inspect table statistics warns when the table is large. |
InspectTableStatisticsStaysQuietForASmallTableAsync |
Fact | Inspect table statistics stays quiet for a small table. |
AnalyseQueryHistoryFallsThroughToExplainWhenNothingWasRecordedAsync |
Fact | Analyse query history falls through to explain when nothing was recorded. |
AnalyseQueryHistoryCallsOutSkewWhenTheWorstCaseDwarfsTheAverageAsync |
Fact | Analyse query history calls out skew when the worst case dwarfs the average. |
AnalyseQueryHistoryCallsOutDiskReadingAndWideReturnsTogetherAsync |
Fact | Analyse query history calls out disk reading and wide returns together. |
AnalyseQueryHistoryStaysQuietOnABusyButWellBehavedShapeAsync |
Fact | Analyse query history stays quiet on a busy but well behaved shape. |
SurfacedFailureAiFunctionTests
Jube.Test.AskJooby.SurfacedFailureAiFunctionTests — 4 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
TheServicesOwnValidationMessageReachesTheModelRatherThanAGenericFailureAsync |
Fact | The services own validation message reaches the model rather than a generic failure. |
TheInnermostMessageIsTakenBecauseAWrappedOneSaysNothingUsefulAsync |
Fact | The innermost message is taken because a wrapped one says nothing useful. |
CancellationStillPropagatesBecauseSomethingDeliberatelyAskedTheRunToStopAsync |
Fact | Cancellation still propagates because something deliberately asked the run to stop. |
AToolThatSucceedsIsPassedStraightThroughUntouchedAsync |
Fact | A tool that succeeds is passed straight through untouched. |
TavilyWebSearchClientTests
Jube.Test.AskJooby.TavilyWebSearchClientTests — 12 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
SendsTheApiKeyAsABearerTokenAsync |
Fact | Sends the api key as a bearer token. |
MapsSearchDepthOntoTheProviderOwnStringAsync |
Theory | Maps search depth onto the provider own string. |
MapsAnswerModeOntoTheProviderOwnIncludeAnswerValueAsync |
Theory | Maps answer mode onto the provider own include answer value. |
MapsRawContentModeOntoTheProviderOwnIncludeRawContentValueAsync |
Theory | Maps raw content mode onto the provider own include raw content value. |
SendsTheQueryAndMaxResultsAsync |
Fact | Sends the query and max results. |
ParsesTheAnswerAndResultsAsync |
Fact | Parses the answer and results. |
ARegularResultWithNoRawContentFieldLeavesItNullAsync |
Fact | A regular result with no raw content field leaves it null. |
CarriesTheRawResponseVerbatimAsync |
Fact | Carries the raw response verbatim. |
MissingAnswerAndEmptyResultsParseCleanlyAsync |
Fact | Missing answer and empty results parse cleanly. |
ThrowsWithTheStatusCodeAndBodyWhenTheProviderAnswersAnErrorAsync |
Fact | Throws with the status code and body when the provider answers an error. |
RecordsTheCallAgainstTheGivenRunWhenARecorderIsSuppliedAsync |
Fact | Records the call against the given run when a recorder is supplied. |
RecordsNothingWhenNoRecorderIsSuppliedAsync |
Fact | Records nothing when no recorder is supplied. |
ThinkingEffortLadderTests
Jube.Test.AskJooby.ThinkingEffortLadderTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
TheCheckSitsAtTheCheapestBandRatherThanInheritingAProviderDefault |
Fact | The check sits at the cheapest band rather than inheriting a provider default. |
TheShortUtilityCallsDoNotReasonAtAllByDefault |
Fact | The short utility calls do not reason at all by default. |
EveryModelRoleCarriesItsOwnSwitchRatherThanInheritingAnother |
Fact | Every model role carries its own switch rather than inheriting another. |
ThinkingOptionsTests
Jube.Test.AskJooby.ThinkingOptionsTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
RawOptionsDefaultsToHighWhenNoEffortIsSupplied |
Fact | Raw options defaults to high when no effort is supplied. |
RawOptionsMapsTheOrdinalToTheConfirmedDeepSeekEffortWord |
Theory | Raw options maps the ordinal to the confirmed deep seek effort word. |
TurningThinkingOffSendsNoEffortAtAll |
Fact | Turning thinking off sends no effort at all. |
EveryEffortWordOfferedIsOneTheProviderWillAccept |
Fact | Every effort word offered is one the provider will accept. |
RawOptionsFallsBackToHighForAnOutOfRangeOrdinal |
Theory | Raw options falls back to high for an out of range ordinal. |
TokenBudgetCacheWeightingTests
Jube.Test.AskJooby.TokenBudgetCacheWeightingTests — 5 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ACachedPrefixIsChargedAtItsWeightRatherThanInFull |
Fact | A cached prefix is charged at its weight rather than in full. |
NothingReportedAsCachedIsStillChargedInFull |
Fact | Nothing reported as cached is still charged in full. |
AWeightOfOneChargesCachedAndUncachedAlike |
Fact | A weight of one charges cached and uncached alike. |
AReportedCacheLargerThanTheInputIsNotPriced |
Fact | A reported cache larger than the input is not priced. |
TheDiscountDelaysExhaustionRatherThanRemovingIt |
Fact | The discount delays exhaustion rather than removing it. |
TokenBudgetTests
Jube.Test.AskJooby.TokenBudgetTests — 11 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ABudgetOfZeroIsNoBudgetAtAllRatherThanOneAlreadySpent |
Fact | A budget of zero is no budget at all rather than one already spent. |
SpendAccumulatesInputAndOutputTogetherUntilTheLimitIsReached |
Fact | Spend accumulates input and output together until the limit is reached. |
NegativeOrAbsentCountsAreIgnoredRatherThanCreditedBack |
Fact | Negative or absent counts are ignored rather than credited back. |
ConcurrentJoobriksSpendingAtOnceAreAllCounted |
Fact | Concurrent joobriks spending at once are all counted. |
TheHardCeilingSitsAboveTheSoftOneSoAgentsGetAChanceToWriteUpFirst |
Fact | The hard ceiling sits above the soft one so agents get a chance to write up first. |
ABudgetOfZeroIsNeverOverrunEither |
Fact | A budget of zero is never overrun either. |
AnOverrunMultipleOfOneCollapsesBothThresholdsOntoTheLimit |
Fact | An overrun multiple of one collapses both thresholds onto the limit. |
AToolRunsNormallyWhileThereIsBudgetLeftAsync |
Fact | A tool runs normally while there is budget left. |
AnExhaustedBudgetStopsTheToolRunningAndTellsTheModelToAnswerAsync |
Fact | An exhausted budget stops the tool running and tells the model to answer. |
UsageReportedByTheProviderIsCountedAgainstTheBudgetAsync |
Fact | Usage reported by the provider is counted against the budget. |
UsageArrivingMidStreamIsCountedTooAsync |
Fact | Usage arriving mid stream is counted too. |
TokenReductionTests
Jube.Test.AskJooby.TokenReductionTests — 7 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
ABiteAlreadyGivenThisTurnIsNamedRatherThanSentAgainAsync |
Fact | A bite already given this turn is named rather than sent again. |
AGenuinelyNewBiteStillComesBackInFullAsync |
Fact | A genuinely new bite still comes back in full. |
SearchingStopsOnceTheTurnsAllowanceIsSpentAsync |
Fact | Searching stops once the turns allowance is spent. |
ATurnThatRetrievedNothingIsDistinguishableFromOneThatDid |
Fact | A turn that retrieved nothing is distinguishable from one that did. |
ValidatorGroundingKeepsOneCopyOfEachBite |
Fact | Validator grounding keeps one copy of each bite. |
ValidatorGroundingNamesWhatItCouldNotAffordToQuote |
Fact | Validator grounding names what it could not afford to quote. |
ValidatorGroundingKeepsAnUnparseablePayloadRatherThanDroppingIt |
Fact | Validator grounding keeps an unparseable payload rather than dropping it. |
ToolCallAndResultGuardChatClientTests
Jube.Test.AskJooby.ToolCallAndResultGuardChatClientTests — 19 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
GetResponseAsync_passes_through_a_benign_tool_callAsync |
Fact | Get response async passes through a benign tool call. |
GetResponseAsync_blocks_a_tool_call_with_a_shell_command_chaining_patternAsync |
Fact | Get response async blocks a tool call with a shell command chaining pattern. |
GetResponseAsync_does_not_block_a_legitimate_union_select_for_the_allow_listed_sql_toolAsync |
Fact | Get response async does not block a legitimate union select for the allow listed sql tool. |
GetResponseAsync_still_blocks_the_same_union_pattern_for_a_tool_that_is_not_allow_listedAsync |
Fact | Get response async still blocks the same union pattern for a tool that is not allow listed. |
GetResponseAsync_does_not_block_delegation_text_mentioning_executeAsync |
Fact | Get response async does not block delegation text mentioning execute. |
GetResponseAsync_does_not_block_a_search_query_mentioning_executeAsync |
Fact | Get response async does not block a search query mentioning execute. |
GetResponseAsync_does_not_block_a_web_search_query_mentioning_executeAsync |
Fact | Get response async does not block a web search query mentioning execute. |
GetResponseAsync_still_blocks_an_execute_pattern_outside_the_declared_provenanceAsync |
Fact | Get response async still blocks an execute pattern outside the declared provenance. |
GetResponseAsync_does_not_block_r_source_for_the_allow_listed_validate_r_script_toolAsync |
Fact | Get response async does not block r source for the allow listed validate r script tool. |
GetResponseAsync_does_not_block_r_source_for_the_allow_listed_run_script_toolAsync |
Fact | Get response async does not block r source for the allow listed run script tool. |
GetResponseAsync_still_blocks_the_same_r_source_for_a_tool_that_is_not_allow_listedAsync |
Fact | Get response async still blocks the same r source for a tool that is not allow listed. |
GetResponseAsync_blocks_an_instruction_override_hidden_in_a_tool_result_before_calling_the_inner_clientAsync |
Fact | Get response async blocks an instruction override hidden in a tool result before calling the inner client. |
GetResponseAsync_passes_through_AskClarifyingQuestions_own_instruction_scaffoldingAsync |
Fact | Get response async passes through ask clarifying questions own instruction scaffolding. |
GetResponseAsync_still_blocks_the_same_instruction_field_shape_from_an_unexempted_toolAsync |
Fact | Get response async still blocks the same instruction field shape from an unexempted tool. |
GetResponseAsync_passes_through_a_benign_tool_resultAsync |
Fact | Get response async passes through a benign tool result. |
GetResponseAsync_does_not_block_a_SearchRag_result_quoting_AgentGuards_own_documentationAsync |
Fact | Get response async does not block a search rag result quoting agent guards own documentation. |
GetResponseAsync_still_blocks_the_same_injection_vocabulary_from_a_tool_that_is_not_exemptedAsync |
Fact | Get response async still blocks the same injection vocabulary from a tool that is not exempted. |
GetResponseAsync_passes_through_a_plain_text_reply_with_no_tool_callsAsync |
Fact | Get response async passes through a plain text reply with no tool calls. |
GetStreamingResponseAsync_passes_through_a_plain_text_reply_with_no_tool_callsAsync |
Fact | Get streaming response async passes through a plain text reply with no tool calls. |
TurnActivityLedgerTests
Jube.Test.AskJooby.TurnActivityLedgerTests — 6 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
AQuietTurnSaysNothingAboutReasoningAtAll |
Fact | A quiet turn says nothing about reasoning at all. |
AModelThatReasonsWithTheSwitchOffIsReportedRatherThanOnlyCounted |
Fact | A model that reasons with the switch off is reported rather than only counted. |
HandBacksAreCountedAcrossTheTurn |
Fact | Hand backs are counted across the turn. |
ATurnHasNoPlanUntilOneIsRecorded |
Fact | A turn has no plan until one is recorded. |
UnplannedHandoversAreCountedAcrossTheTurn |
Fact | Unplanned handovers are counted across the turn. |
AStablePlanIsKeptAgainstThatStableAndNotTheRootPlan |
Fact | A stable plan is kept against that stable and not the root plan. |
TurnCostPricingTests
Jube.Test.AskJooby.TurnCostPricingTests — 12 tests.
| Test | Kind | Verifies |
|---|---|---|
PriceModelCalls_WithNoCachedTokens_ChargesAllInputAtTheFullRate |
Fact | Price model calls with no cached tokens charges all input at the full rate. |
PriceModelCalls_PricesTheCachedSubsetSeparately_NotOnTopOfInputTokens |
Fact | Price model calls prices the cached subset separately not on top of input tokens. |
PriceModelCalls_WithNoCachedRateConfigured_FallsBackToTheFullInputRate |
Fact | Price model calls with no cached rate configured falls back to the full input rate. |
PriceModelCalls_SumsAcrossDifferentTimesOfDayInTheSameTurn_EachAtItsOwnBandsRate |
Fact | Price model calls sums across different times of day in the same turn each at its own bands rate. |
PriceModelCalls_WithATimeThatMatchesNoBand_ReturnsNullRatherThanAPartialFigure |
Fact | Price model calls with a time that matches no band returns null rather than a partial figure. |
PriceModelCalls_WithABandRestrictedToWeekdays_DoesNotMatchASaturdayCall |
Fact | Price model calls with a band restricted to weekdays does not match a saturday call. |
PriceModelCalls_WithAMidnightWrappingBand_MatchesBothSidesOfMidnightButNotTheMiddleOfTheDay |
Fact | Price model calls with a midnight wrapping band matches both sides of midnight but not the middle of the day. |
PriceEmbeddingCalls_PricesByInputTokensOnly |
Fact | Price embedding calls prices by input tokens only. |
PriceRerankCalls_WithNoTokensCompared_FallsBackToDocumentsCompared |
Fact | Price rerank calls with no tokens compared falls back to documents compared. |
PriceRerankCalls_PrefersTokensComparedWhenBothTheCallAndTheFeeHaveIt |
Fact | Price rerank calls prefers tokens compared when both the call and the fee have it. |
PriceRerankCalls_WithAnUnpricedModel_ReturnsNull |
Fact | Price rerank calls with an unpriced model returns null. |
PriceRerankCalls_WithNeitherAUsableTokenCountNorADocumentRateInCommon_ReturnsNull |
Fact | Price rerank calls with neither a usable token count nor a document rate in common returns null. |
UserQueryGuardChatClientTests
Jube.Test.AskJooby.UserQueryGuardChatClientTests — 3 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
PassesThroughWhenANonEmptyUserMessageIsPresentAsync |
Fact | Passes through when a non empty user message is present. |
ThrowsBeforeCallingTheInnerClientWhenThereIsNoUserMessageAsync |
Fact | Throws before calling the inner client when there is no user message. |
ThrowsWhenTheOnlyUserMessageIsBlankAsync |
Fact | Throws when the only user message is blank. |
WebSearchToolTests
Jube.Test.AskJooby.WebSearchToolTests — 20 tests. Category: AskJooby.
| Test | Kind | Verifies |
|---|---|---|
ResultStartsWithAMachineParseableCountLineAsync |
Fact | Result starts with a machine parseable count line. |
ReportsNoMatchingResultsWhenNothingComesBackAsync |
Fact | Reports no matching results when nothing comes back. |
IncludesTheSynthesisedAnswerWhenTheProviderGivesOneAsync |
Fact | Includes the synthesised answer when the provider gives one. |
PassesTheConfiguredDefaultMaxResultsThroughAsync |
Fact | Passes the configured default max results through. |
UsesTheModelSuppliedMaxResultsOverTheConfiguredDefaultAsync |
Fact | Uses the model supplied max results over the configured default. |
ClampsAModelSuppliedMaxResultsAboveTheCeilingAsync |
Fact | Clamps a model supplied max results above the ceiling. |
ClampsAModelSuppliedMaxResultsBelowOneAsync |
Fact | Clamps a model supplied max results below one. |
PassesTheConfiguredDepthAndAnswerModeThroughAsync |
Fact | Passes the configured depth and answer mode through. |
PassesTheConfiguredRawContentModeThroughAsync |
Fact | Passes the configured raw content mode through. |
DefaultsToMarkdownRawContentWhenNoneIsConfiguredAsync |
Fact | Defaults to markdown raw content when none is configured. |
IncludesTheFullExtractedPageWhenTheProviderReturnsOneAsync |
Fact | Includes the full extracted page when the provider returns one. |
OmitsTheFullExtractedPageSectionWhenNoneCameBackAsync |
Fact | Omits the full extracted page section when none came back. |
WithholdsAResultWhoseFullExtractedPageMatchesPromptInjectionScreeningAsync |
Fact | Withholds a result whose full extracted page matches prompt injection screening. |
PassesTheRecorderAndRunIdThroughToTheClientAsync |
Fact | Passes the recorder and run id through to the client. |
WithholdsAResultThatMatchesPromptInjectionScreeningAsync |
Fact | Withholds a result that matches prompt injection screening. |
ReportsOnlyTheWithholdingWhenEveryResultIsWithheldAsync |
Fact | Reports only the withholding when every result is withheld. |
RecordsAnAggregateGuardRejectionWhenWithholdingResultsAsync |
Fact | Records an aggregate guard rejection when withholding results. |
RecordsNothingWhenNoResultIsWithheldAsync |
Fact | Records nothing when no result is withheld. |
DoesNotSendTheSearchWhenTheQueryItselfMatchesPromptInjectionScreeningAsync |
Fact | Does not send the search when the query itself matches prompt injection screening. |
RecordsARequestSideGuardRejectionUnderItsOwnPipelineNameAsync |
Fact | Records a request side guard rejection under its own pipeline name. |
WithRealChunks
Jube.Test.AskJooby.AskJoobyChatAuditCodeGroundingTests+WithRealChunks — 1 test. Category: AskJooby. Collection:
Database.
| Test | Kind | Verifies |
|---|---|---|
BuildOrchestrationCodeAsyncRetrievesTheFixedOrchestrationChunksAsync |
Fact | Build orchestration code async retrieves the fixed orchestration chunks. |
WorkflowProgressToolTests
Jube.Test.AskJooby.WorkflowProgressToolTests — 9 tests. Category: Unit.
| Test | Kind | Verifies |
|---|---|---|
WithNothingDoneTheFirstStepIsTheNextOneAndNoneAreMarkedCompleteAsync |
Fact | With nothing done the first step is the next one and none are marked complete. |
AStepWhoseOperationsHaveAllRunIsCountedDoneWithoutAnyoneSayingSoAsync |
Fact | A step whose operations have all run is counted done without anyone saying so. |
AStepWithSomeOfItsOperationsRunIsNotCountedDoneAsync |
Fact | A step with some of its operations run is not counted done. |
AnAgentCanOverruleAnInferenceThatSaysAStepIsDoneAsync |
Fact | An agent can overrule an inference that says a step is done. |
AnOperatorStepIsOnlyEverCompletedByBeingStatedAsync |
Fact | An operator step is only ever completed by being stated. |
TheReasonIsCarriedWithTheStatementRatherThanDiscardedAsync |
Fact | The reason is carried with the statement rather than discarded. |
AStepIdThatIsNotInTheGraphIsRefusedAndTheRealOnesAreNamedAsync |
Fact | A step id that is not in the graph is refused and the real ones are named. |
AnUnknownWorkflowIsRefusedByBothOperationsRatherThanReportedEmptyAsync |
Fact | An unknown workflow is refused by both operations rather than reported empty. |
EveryStepDoneSaysSoRatherThanOfferingANextStepAsync |
Fact | Every step done says so rather than offering a next step. |
