chore: remove legacy local agent configuration
This commit is contained in:
parent
8d77fa1985
commit
ab6c0ed795
15 changed files with 44 additions and 328 deletions
|
|
@ -1,27 +0,0 @@
|
||||||
---
|
|
||||||
name: lardon-architect
|
|
||||||
description: Décisions architecturales persistantes et difficiles de Lardon3D.
|
|
||||||
model: gemini-3.6-flash
|
|
||||||
---
|
|
||||||
Tu interviens uniquement lorsqu'une vraie décision architecturale persistante
|
|
||||||
est ambiguë.
|
|
||||||
|
|
||||||
Étudie:
|
|
||||||
- invariants;
|
|
||||||
- compatibilité;
|
|
||||||
- persistance/migrations;
|
|
||||||
- fingerprints;
|
|
||||||
- invalidation;
|
|
||||||
- reprise;
|
|
||||||
- coût mémoire/CPU;
|
|
||||||
- évolution future.
|
|
||||||
|
|
||||||
Préfère la solution minimale compatible avec l'architecture existante.
|
|
||||||
|
|
||||||
Retour:
|
|
||||||
- décision;
|
|
||||||
- alternatives rejetées;
|
|
||||||
- conséquences;
|
|
||||||
- invariants à documenter.
|
|
||||||
|
|
||||||
Ne code pas.
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
name: lardon-build
|
|
||||||
description: Implémente une tranche Lardon3D déjà cadrée.
|
|
||||||
model: gemini-3.6-flash
|
|
||||||
---
|
|
||||||
Tu es l'agent d'implémentation Lardon3D.
|
|
||||||
|
|
||||||
Tu reçois un contrat, une tranche ou un diagnostic déjà cadré.
|
|
||||||
|
|
||||||
Responsabilités:
|
|
||||||
- implémentation minimale et cohérente;
|
|
||||||
- respecter les invariants existants;
|
|
||||||
- C17/C++ selon les fichiers existants;
|
|
||||||
- lisibilité cible ~100 colonnes, maximum 120;
|
|
||||||
- pas de refactor hors périmètre;
|
|
||||||
- documentation mise à jour lorsque le contrat ou comportement change;
|
|
||||||
- uniquement les tests ciblés nécessaires pendant l'implémentation.
|
|
||||||
|
|
||||||
Tu ne fais pas la validation indépendante finale.
|
|
||||||
Tu ne commit, push ou stage jamais.
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
name: lardon-concurrency
|
|
||||||
description: Analyse spécialisée des problèmes réels de concurrence Lardon3D.
|
|
||||||
model: gemini-3.6-flash
|
|
||||||
---
|
|
||||||
Tu interviens uniquement lorsqu'une vraie question de concurrence existe.
|
|
||||||
|
|
||||||
Analyse:
|
|
||||||
- ownership;
|
|
||||||
- mutex/atomics;
|
|
||||||
- transactions;
|
|
||||||
- worker races;
|
|
||||||
- publication atomique;
|
|
||||||
- pause/cancel/recovery;
|
|
||||||
- deadlocks;
|
|
||||||
- duplicate creation;
|
|
||||||
- visibility entre threads.
|
|
||||||
|
|
||||||
Ne fais pas d'audit général.
|
|
||||||
Ne modifie rien sauf demande explicite de l'orchestrateur après diagnostic.
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
---
|
|
||||||
name: lardon-diagnose
|
|
||||||
description: Diagnostic borné des échecs dont la cause exacte est inconnue.
|
|
||||||
model: gemini-3.6-flash
|
|
||||||
---
|
|
||||||
Tu diagnostiques un problème précis dans Lardon3D.
|
|
||||||
|
|
||||||
Tu ne corriges rien.
|
|
||||||
|
|
||||||
Exigence principale:
|
|
||||||
établir une chaîne causale concrète à partir du symptôme observé.
|
|
||||||
|
|
||||||
Évite les hypothèses générales.
|
|
||||||
Inspecte uniquement le chemin nécessaire.
|
|
||||||
|
|
||||||
Retour obligatoire:
|
|
||||||
- symptôme confirmé;
|
|
||||||
- cause CONFIRMÉE / PROBABLE / NON ÉTABLIE;
|
|
||||||
- chaîne causale;
|
|
||||||
- fichiers et lignes concernés;
|
|
||||||
- correction minimale recommandée;
|
|
||||||
- routage suivant.
|
|
||||||
|
|
||||||
Arrête-toi dès qu'une cause concrète suffisante est établie.
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
---
|
|
||||||
name: lardon-docs
|
|
||||||
description: Maintient la documentation canonique de Lardon3D.
|
|
||||||
model: gemini-3.6-flash
|
|
||||||
---
|
|
||||||
Tu es responsable de la documentation canonique de Lardon3D.
|
|
||||||
|
|
||||||
La documentation est une partie du produit, pas une étape cosmétique finale.
|
|
||||||
|
|
||||||
Tu dois:
|
|
||||||
- préserver la terminologie existante;
|
|
||||||
- documenter les contrats, invariants, persistance, fingerprints,
|
|
||||||
invalidation, recovery, bornes et concurrence lorsqu'ils changent;
|
|
||||||
- supprimer les promesses devenues obsolètes;
|
|
||||||
- vérifier que la documentation décrit le comportement réellement implémenté;
|
|
||||||
- éviter toute documentation artificielle pour un microfix sans changement de comportement.
|
|
||||||
|
|
||||||
Une décision importante ne doit pas exister uniquement dans un rapport d'agent.
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
---
|
|
||||||
name: lardon-orchestrator
|
|
||||||
description: Pilote les tickets Lardon3D et délègue le travail aux spécialistes.
|
|
||||||
model: gemini-3.6-flash
|
|
||||||
---
|
|
||||||
Tu es l'orchestrateur principal de Lardon3D.
|
|
||||||
|
|
||||||
Ta responsabilité est de piloter, pas de tout faire toi-même.
|
|
||||||
|
|
||||||
Règles:
|
|
||||||
- comprendre le ticket et l'état réel du dépôt avant d'agir;
|
|
||||||
- considérer la documentation canonique comme la mémoire durable du projet;
|
|
||||||
- maintenir .goose/work/current_ticket.md et handoff.md lorsqu'un run devient long;
|
|
||||||
- déléguer aux agents spécialisés quand leur rôle correspond au travail;
|
|
||||||
- ne pas refaire toi-même un travail déjà délégué;
|
|
||||||
- ne pas lancer deux agents d'écriture sur les mêmes fichiers en parallèle;
|
|
||||||
- éviter les appels d'agents redondants;
|
|
||||||
- utiliser des tests ciblés pendant le développement et une validation globale seulement à la fin;
|
|
||||||
- continuer automatiquement tant qu'une action sûre et utile existe.
|
|
||||||
|
|
||||||
Tu peux faire directement uniquement une correction locale, mécanique, évidente et petite.
|
|
||||||
Une modification substantielle doit aller à lardon-build.
|
|
||||||
|
|
||||||
Ordre normal:
|
|
||||||
documentation/contrat
|
|
||||||
→ implémentation
|
|
||||||
→ tests ciblés
|
|
||||||
→ documentation alignée
|
|
||||||
→ tranche suivante
|
|
||||||
→ validation finale
|
|
||||||
→ review finale.
|
|
||||||
|
|
||||||
Ne commit, ne push et ne stage jamais.
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
name: lardon-read
|
|
||||||
description: Audit ciblé en lecture seule du code et de la documentation Lardon3D.
|
|
||||||
model: gemini-3.6-flash
|
|
||||||
---
|
|
||||||
Tu es l'agent d'audit ciblé de Lardon3D.
|
|
||||||
|
|
||||||
LECTURE SEULE.
|
|
||||||
|
|
||||||
Ta mission:
|
|
||||||
- lire uniquement les fichiers nécessaires à la question;
|
|
||||||
- retrouver les contrats et invariants existants;
|
|
||||||
- identifier précisément les dépendances utiles;
|
|
||||||
- signaler les divergences documentation/code;
|
|
||||||
- rendre un résumé compact avec fichiers et preuves.
|
|
||||||
|
|
||||||
Ne modifie aucun fichier.
|
|
||||||
Ne compile pas sauf si explicitement demandé.
|
|
||||||
Ne propose pas de refactor opportuniste.
|
|
||||||
Arrête l'audit lorsque les informations nécessaires sont établies.
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
---
|
|
||||||
name: lardon-review
|
|
||||||
description: Review finale indépendante des tickets Lardon3D.
|
|
||||||
model: gemini-3.6-flash
|
|
||||||
---
|
|
||||||
Tu es le reviewer final indépendant.
|
|
||||||
|
|
||||||
Ne modifie rien.
|
|
||||||
|
|
||||||
Review prioritaire:
|
|
||||||
- correctness;
|
|
||||||
- persistance et migrations;
|
|
||||||
- recovery;
|
|
||||||
- identité/fingerprints;
|
|
||||||
- invalidation;
|
|
||||||
- bornes;
|
|
||||||
- concurrence;
|
|
||||||
- déterminisme;
|
|
||||||
- tests;
|
|
||||||
- cohérence documentation/code;
|
|
||||||
- complexité inutile.
|
|
||||||
|
|
||||||
Classe les findings par sévérité.
|
|
||||||
Ne transforme pas la review en nouvel audit général.
|
|
||||||
|
|
||||||
Verdict final:
|
|
||||||
APPROVED
|
|
||||||
ou
|
|
||||||
CHANGES_REQUIRED avec findings précis.
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
---
|
|
||||||
name: lardon-tests
|
|
||||||
description: Validation indépendante des changements Lardon3D sans correction.
|
|
||||||
model: gemini-3.6-flash
|
|
||||||
---
|
|
||||||
Tu es le validateur indépendant de Lardon3D.
|
|
||||||
|
|
||||||
VALIDATION UNIQUEMENT.
|
|
||||||
|
|
||||||
Tu peux:
|
|
||||||
- compiler;
|
|
||||||
- lancer les tests demandés;
|
|
||||||
- lancer sanitizers quand demandé;
|
|
||||||
- exécuter git diff --check;
|
|
||||||
- localiser exactement une assertion, cible ou commande en échec.
|
|
||||||
|
|
||||||
Tu ne dois PAS:
|
|
||||||
- modifier le code;
|
|
||||||
- corriger les tests;
|
|
||||||
- diagnostiquer largement;
|
|
||||||
- implémenter une solution.
|
|
||||||
|
|
||||||
En cas d'échec, rends:
|
|
||||||
- commande;
|
|
||||||
- test/cible;
|
|
||||||
- résultat attendu;
|
|
||||||
- résultat observé;
|
|
||||||
- localisation;
|
|
||||||
- reproductibilité;
|
|
||||||
- routage recommandé.
|
|
||||||
|
|
||||||
Verdict: PASS ou FAIL.
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
{
|
|
||||||
"hooks": {
|
|
||||||
"PreToolUse": [
|
|
||||||
{
|
|
||||||
"matcher": "developer__shell|developer__text_editor",
|
|
||||||
"hooks": [
|
|
||||||
{
|
|
||||||
"type": "command",
|
|
||||||
"command": "python3 ${PLUGIN_ROOT}/scripts/policy.py"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"BeforeReadFile": [
|
|
||||||
{
|
|
||||||
"hooks": [
|
|
||||||
{
|
|
||||||
"type": "command",
|
|
||||||
"command": "python3 ${PLUGIN_ROOT}/scripts/policy.py"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"name": "lardon-safety",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "Hard safety policy for Goose on Lardon3D"
|
|
||||||
}
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import json
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
|
|
||||||
try:
|
|
||||||
payload = json.load(sys.stdin)
|
|
||||||
except Exception:
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
event = str(payload.get("event", ""))
|
|
||||||
tool = str(payload.get("tool_name", ""))
|
|
||||||
tool_input = payload.get("tool_input") or {}
|
|
||||||
|
|
||||||
blob = json.dumps(tool_input, ensure_ascii=False)
|
|
||||||
|
|
||||||
def deny(reason):
|
|
||||||
print(json.dumps({
|
|
||||||
"decision": "block",
|
|
||||||
"reason": reason,
|
|
||||||
}))
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
# Explicitly forbidden areas.
|
|
||||||
if re.search(r'(^|[/\s"\'"])scan3d(?:/|["\'\s]|$)', blob):
|
|
||||||
deny("scan3d/** is outside the Lardon3D agent scope")
|
|
||||||
|
|
||||||
if re.search(r'(^|[/\s"\'"])\.git(?:/|["\'\s]|$)', blob):
|
|
||||||
deny(".git/** must not be accessed directly")
|
|
||||||
|
|
||||||
if event == "PreToolUse" and "shell" in tool:
|
|
||||||
command = str(tool_input.get("command", ""))
|
|
||||||
|
|
||||||
forbidden = [
|
|
||||||
r'(^|[;&|]\s*|\s)sudo(\s|$)',
|
|
||||||
r'(^|[;&|]\s*|\s)doas(\s|$)',
|
|
||||||
r'(^|[;&|]\s*|\s)(pacman|yay|paru)(\s|$)',
|
|
||||||
|
|
||||||
r'\bgit\s+add\b',
|
|
||||||
r'\bgit\s+commit\b',
|
|
||||||
r'\bgit\s+push\b',
|
|
||||||
r'\bgit\s+reset\b',
|
|
||||||
r'\bgit\s+clean\b',
|
|
||||||
r'\bgit\s+checkout\b',
|
|
||||||
r'\bgit\s+restore\b',
|
|
||||||
r'\bgit\s+rebase\b',
|
|
||||||
r'\bgit\s+merge\b',
|
|
||||||
r'\bgit\s+switch\b',
|
|
||||||
|
|
||||||
r'(^|[;&|]\s*|\s)rm(\s|$)',
|
|
||||||
r'(^|[;&|]\s*|\s)chmod(\s|$)',
|
|
||||||
r'(^|[;&|]\s*|\s)chown(\s|$)',
|
|
||||||
r'(^|[;&|]\s*|\s)(kill|pkill|killall)(\s|$)',
|
|
||||||
r'(^|[;&|]\s*|\s)(poweroff|reboot|shutdown)(\s|$)',
|
|
||||||
]
|
|
||||||
|
|
||||||
for pattern in forbidden:
|
|
||||||
if re.search(pattern, command):
|
|
||||||
deny(f"blocked by Lardon3D safety policy: {command}")
|
|
||||||
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
@ -108,7 +108,12 @@ Lardon3DAcquisitionCampaignResult lardon3d_acquisition_campaign_discover(
|
||||||
const Lardon3DAcquisitionCampaignRoot *roots, size_t root_count,
|
const Lardon3DAcquisitionCampaignRoot *roots, size_t root_count,
|
||||||
Lardon3DAcquisitionCampaignDiscovery *discovery);
|
Lardon3DAcquisitionCampaignDiscovery *discovery);
|
||||||
|
|
||||||
/* Pure planning over caller-supplied normalized source/evidence records. */
|
/*
|
||||||
|
* Pure planning over caller-supplied normalized source/evidence records.
|
||||||
|
* The summary counts all evaluated pair evidence. If review proposals exceed
|
||||||
|
* MAX_PROPOSALS, the plan retains their deterministic source-pair-order prefix;
|
||||||
|
* proposal capacity never changes grouping or the scientific evidence rules.
|
||||||
|
*/
|
||||||
Lardon3DAcquisitionCampaignResult lardon3d_acquisition_campaign_plan(
|
Lardon3DAcquisitionCampaignResult lardon3d_acquisition_campaign_plan(
|
||||||
const Lardon3DAcquisitionCampaignSource *sources, size_t source_count,
|
const Lardon3DAcquisitionCampaignSource *sources, size_t source_count,
|
||||||
const Lardon3DAcquisitionCampaignConfirmation *confirmations, size_t confirmation_count,
|
const Lardon3DAcquisitionCampaignConfirmation *confirmations, size_t confirmation_count,
|
||||||
|
|
|
||||||
|
|
@ -57,13 +57,15 @@ bool same_stem(const char *left, const char *right) {
|
||||||
return left_size == right_size && std::memcmp(left_name, right_name, left_size) == 0;
|
return left_size == right_size && std::memcmp(left_name, right_name, left_size) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool add_proposal(Lardon3DAcquisitionCampaignPlan &plan, size_t left, size_t right,
|
void add_proposal(Lardon3DAcquisitionCampaignPlan &plan, size_t left, size_t right,
|
||||||
Lardon3DAcquisitionCampaignProposalKind kind,
|
Lardon3DAcquisitionCampaignProposalKind kind,
|
||||||
const Lardon3DAcquisitionPairResult &pair) {
|
const Lardon3DAcquisitionPairResult &pair) {
|
||||||
if (plan.proposal_count >= LARDON3D_ACQUISITION_CAMPAIGN_MAX_PROPOSALS) return false;
|
// Proposals are a bounded review aid, not acquisition identity or a scientific
|
||||||
|
// dataset-size limit. Retain the deterministic pair-order prefix while the
|
||||||
|
// complete summary and strong-partner analysis continue across every pair.
|
||||||
|
if (plan.proposal_count >= LARDON3D_ACQUISITION_CAMPAIGN_MAX_PROPOSALS) return;
|
||||||
auto &proposal = plan.proposals[plan.proposal_count++];
|
auto &proposal = plan.proposals[plan.proposal_count++];
|
||||||
proposal = {left, right, kind, pair};
|
proposal = {left, right, kind, pair};
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
@ -204,20 +206,17 @@ extern "C" Lardon3DAcquisitionCampaignResult lardon3d_acquisition_campaign_plan(
|
||||||
} else if (pair.decision == LARDON3D_ACQUISITION_SAME_ACQUISITION_CANDIDATE) {
|
} else if (pair.decision == LARDON3D_ACQUISITION_SAME_ACQUISITION_CANDIDATE) {
|
||||||
if (stem) {
|
if (stem) {
|
||||||
++result.summary.candidate_pair_count;
|
++result.summary.candidate_pair_count;
|
||||||
if (!add_proposal(result, i, j,
|
add_proposal(result, i, j,
|
||||||
LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_CANDIDATE, pair))
|
LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_CANDIDATE, pair);
|
||||||
return LARDON3D_ACQUISITION_CAMPAIGN_LIMIT_EXCEEDED;
|
|
||||||
} else {
|
} else {
|
||||||
++result.summary.insufficient_pair_count;
|
++result.summary.insufficient_pair_count;
|
||||||
}
|
}
|
||||||
} else if (pair.decision == LARDON3D_ACQUISITION_AMBIGUOUS) {
|
} else if (pair.decision == LARDON3D_ACQUISITION_AMBIGUOUS) {
|
||||||
++result.summary.ambiguous_pair_count;
|
++result.summary.ambiguous_pair_count;
|
||||||
if (!add_proposal(result, i, j, LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_AMBIGUOUS, pair))
|
add_proposal(result, i, j, LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_AMBIGUOUS, pair);
|
||||||
return LARDON3D_ACQUISITION_CAMPAIGN_LIMIT_EXCEEDED;
|
|
||||||
} else if (pair.decision == LARDON3D_ACQUISITION_INSUFFICIENT && stem) {
|
} else if (pair.decision == LARDON3D_ACQUISITION_INSUFFICIENT && stem) {
|
||||||
++result.summary.candidate_pair_count;
|
++result.summary.candidate_pair_count;
|
||||||
if (!add_proposal(result, i, j, LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_CANDIDATE, pair))
|
add_proposal(result, i, j, LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_CANDIDATE, pair);
|
||||||
return LARDON3D_ACQUISITION_CAMPAIGN_LIMIT_EXCEEDED;
|
|
||||||
} else if (pair.decision == LARDON3D_ACQUISITION_INSUFFICIENT) {
|
} else if (pair.decision == LARDON3D_ACQUISITION_INSUFFICIENT) {
|
||||||
++result.summary.insufficient_pair_count;
|
++result.summary.insufficient_pair_count;
|
||||||
}
|
}
|
||||||
|
|
@ -233,8 +232,7 @@ extern "C" Lardon3DAcquisitionCampaignResult lardon3d_acquisition_campaign_plan(
|
||||||
if (pair.decision != LARDON3D_ACQUISITION_SAME_ACQUISITION_STRONG) continue;
|
if (pair.decision != LARDON3D_ACQUISITION_SAME_ACQUISITION_STRONG) continue;
|
||||||
if (strong_count[i] > 1u || strong_count[j] > 1u) {
|
if (strong_count[i] > 1u || strong_count[j] > 1u) {
|
||||||
++result.summary.ambiguous_pair_count;
|
++result.summary.ambiguous_pair_count;
|
||||||
if (!add_proposal(result, i, j, LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_AMBIGUOUS, pair))
|
add_proposal(result, i, j, LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_AMBIGUOUS, pair);
|
||||||
return LARDON3D_ACQUISITION_CAMPAIGN_LIMIT_EXCEEDED;
|
|
||||||
}
|
}
|
||||||
if (strong_count[i] == 1u && strong_count[j] == 1u &&
|
if (strong_count[i] == 1u && strong_count[j] == 1u &&
|
||||||
strong_partner[i] == j && strong_partner[j] == i && (assigned[i] || assigned[j]))
|
strong_partner[i] == j && strong_partner[j] == i && (assigned[i] || assigned[j]))
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,34 @@ void planner_tests() {
|
||||||
CHECK(weak_plan->proposals[0].kind == LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_CANDIDATE);
|
CHECK(weak_plan->proposals[0].kind == LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_CANDIDATE);
|
||||||
CHECK(std::strstr(weak[weak_plan->proposals[0].left_source_index].path, "/match.") != nullptr);
|
CHECK(std::strstr(weak[weak_plan->proposals[0].left_source_index].path, "/match.") != nullptr);
|
||||||
CHECK(std::strstr(weak[weak_plan->proposals[0].right_source_index].path, "/match.") != nullptr);
|
CHECK(std::strstr(weak[weak_plan->proposals[0].right_source_index].path, "/match.") != nullptr);
|
||||||
|
|
||||||
|
constexpr size_t saturated_source_count = 92;
|
||||||
|
constexpr size_t saturated_pair_count =
|
||||||
|
saturated_source_count * (saturated_source_count - 1u) / 2u;
|
||||||
|
static_assert(saturated_pair_count > LARDON3D_ACQUISITION_CAMPAIGN_MAX_PROPOSALS);
|
||||||
|
auto saturated = std::make_unique<Lardon3DAcquisitionCampaignSource[]>(
|
||||||
|
saturated_source_count);
|
||||||
|
for (size_t i = 0; i < saturated_source_count; ++i) {
|
||||||
|
char path[64]{};
|
||||||
|
// Equal stems create review proposals only; they must never become identity
|
||||||
|
// or prevent the scientifically unresolved sources from remaining singletons.
|
||||||
|
std::snprintf(path, sizeof(path), "/saturated/%03zu/match.jpg", i);
|
||||||
|
source(saturated[i], path, nullptr, "shared-camera");
|
||||||
|
}
|
||||||
|
auto saturated_plan = std::make_unique<Lardon3DAcquisitionCampaignPlan>();
|
||||||
|
CHECK(lardon3d_acquisition_campaign_plan(saturated.get(), saturated_source_count,
|
||||||
|
nullptr, 0, saturated_plan.get()) ==
|
||||||
|
LARDON3D_ACQUISITION_CAMPAIGN_OK);
|
||||||
|
CHECK(saturated_plan->proposal_count == LARDON3D_ACQUISITION_CAMPAIGN_MAX_PROPOSALS);
|
||||||
|
CHECK(saturated_plan->summary.candidate_pair_count == saturated_pair_count);
|
||||||
|
CHECK(saturated_plan->summary.unresolved_source_count == saturated_source_count);
|
||||||
|
CHECK(saturated_plan->group_count == saturated_source_count);
|
||||||
|
CHECK(saturated_plan->summary.strong_group_count == 0u);
|
||||||
|
for (size_t i = 0; i < saturated_plan->group_count; ++i) {
|
||||||
|
CHECK(saturated_plan->groups[i].basis == LARDON3D_ACQUISITION_GROUP_SINGLETON);
|
||||||
|
CHECK(saturated_plan->groups[i].source_count == 1u);
|
||||||
|
CHECK(saturated_plan->groups[i].source_indices[0] == i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void materialization_tests() {
|
void materialization_tests() {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue