birddog 2.0.0
birddog 2.0.0 makes sniff_trajectory_braid() the single canonical trajectory detector and is a pre-launch reset: the dynamic-programming (DP) per-group detector is REMOVED, not deprecated (the package had not been publicized; this is the one hard break — future removals will go through a deprecation window). Why removed: the DP routes leak across groups (nodes that globally belong to other centrals), the main route duplicates the flow trunk, and the genuine tributary chaining is already explicit in flow$tree. The last 1.x state is preserved at git tag v1.0.7 and in the CRAN archive.
Renamed
-
sniff_trajectory_flow()is nowsniff_trajectory_braid(). “Flow” names only the object kind (thebirddog_flowreturned by every detector, validated byis_flow()/validate_flow()); the canonical detector is named for the braided river it decomposes, a symmetric sibling ofsniff_trajectory_channel(). The object contract is unchanged. -
sniff_citation_cycle_time()is nowsniff_cct()– the short name pairs the per-trajectorysniff_trajectory_cct(), mirroring thesniff_entropy()/sniff_trajectory_entropy()pattern. -
sniff_trajectory_prestige()is nowsniff_trajectory_hubs(), pairingsniff_groups_hubs(); thesniff_trajectory_dynamics()argumentprestigeis likewise renamedhubs.
Removed (migration table)
| birddog 1.x (removed) | birddog 2.0 |
|---|---|
detect_main_trajectories(gct, group) |
sniff_trajectory_braid(gct) |
filter_trajectories(tr_tbl, top_n) |
subset(flow, ...) (object) or dplyr on flow$trajectories (table) |
sniff_trajectory_formations(all_detected, dpg) |
sniff_trajectory_formation(flow, target) |
sniff_trajectory_destinations(all_detected, dpg) |
sniff_trajectory_destination(flow, source) |
sniff_groups_trajectories(gc) |
sniff_groups_lineage(gc) |
sniff_citations_cycle_time(...) |
sniff_cct(...) |
plot_group_trajectories_2d(gct, group) |
plot_groups_lineage_2d(gct, group) |
plot_group_trajectories_3d(gct, group) |
plot_groups_lineage_3d(gct, group) |
plot_group_trajectories_lines_2d(traj, tf) |
plot_trajectory_lines_2d(flow, target) |
plot_group_trajectories_lines_3d(traj, tf) |
plot_trajectory_lines_3d(flow, target) |
plot_trajectory_destination(d) |
plot_trajectory_dispersion(d) with d <- sniff_trajectory_destination(flow, source)
|
attach_docs_to_vertices(g, docs) |
none (internal helper) |
legacy (DP-object) input to sniff_trajectory_formation/destination/self_sufficiency()
|
pass a flow object |
Breaking changes
-
sniff_trajectory_dag(): first argument renameddocs_per_group->x; it now also accepts thesniff_groups_lineage()object directly. -
sniff_trajectory_dag()andsniff_trajectory_braid()return classed objects (birddog_dag,birddog_flow) with print methods. Objects saved by 1.x (RDS) are still accepted everywhere. -
plot_trajectory_formation_linear()renamed toplot_trajectory_formation(): with the 3D view gone it is the single formation plot, mirroringsniff_trajectory_formation(). -
plot_trajectory_formation_3d()removed; the 3D view is covered byplot_trajectory_lines_3d()and the per-target river byplot_trajectory_confluence(conf, target = ...).
New features
-
subset()method for flow objects: contract-preserving filtering by predicate (subset(flow, size >= 50)) or watershed (subset(flow, target = "tr::c1g1")keeps the central and its whole tributary subtree). The result is still a valid flow; orphaned tributaries reattach to their nearest kept ancestor, and the pruning call is shown byprint(). Works for any detector whose result inherits frombirddog_flow. - Per-trajectory emergence indicators in
sniff_trajectory_dynamics():emergence_index_intensive(a rate-only ranking that drops the size-carryingrecruitmentpillar),emergence_density(staying power – the share of a lineage’s years still growing at the emergence rate, after Carley et al. 2017), andreach_ratio(downstream propagation in the DAG, after Marino & Silva 2023). -
sniff_trajectory_community()andsniff_trajectory_emergence_owners(): the FUSE community pillar – distinct-author breadth per trajectory, and the authors who own each living trajectory’s emergence (Total / sqrt-normalized, after Garner et al. 2017). -
sniff_trajectory_entropy()and a rewrittensniff_trajectory_cct(): per-year keyword diversity (Pielou’s J’) and citation cycle time, recomputed from each trajectory’s own node documents and returned astibble(year, value)list-columns. They join intosniff_trajectory_dynamics()via the newcct,entropyandhubsarguments. -
sniff_trajectory_dag(similarity = "coupling"): route the soft DAG by bibliographic coupling (shared references) instead of document overlap;sniff_trajectory_coherence()warns when scored on the same references. -
plot_trajectory_dynamics()andplot_trajectory_dynamics_interactive(): every state region stays in view even when the points cluster, region names sit on legible boxes clear of the nodes, and each point-label leader starts at the bubble’s outer edge.
birddog 1.0.7
New features
-
sniff_trajectory_formation()andsniff_trajectory_formations(): the inverse ofsniff_trajectory_destination(). Given a living target trajectory, find every other trajectory whose terminal cohort was absorbed into it (its feeders), for one target or all targets at once. Each feeder carries the documents transferred, its cohort size and handoff year, plus two measured growth series:size_curve(its cluster size per year) andinflow_curve(the contributed papers accumulating within the feeder’s own year-nodes, so the curve stays inside the feeder’s lifespan instead of reaching back to a paper’s corpus first-appearance year);target_infoalso reports the target’s own document count. -
plot_trajectory_formation_linear()andplot_trajectory_formation_3d(): draw the confluence of feeders into a target trajectory – a 2D cumulative-river timeline or an interactive 3D plotly view (X = year, Y = feeder lane, Z = documents). Each feeder grows along its length on the same proportional scale as the target, set by afeeder_curveargument ("inflow", the papers that entered the target, or"size", the feeder’s whole community); the 2D feeders are labelled on the right in the target’s two-line style. Both include terminal-node markers and optional manual hover descriptions. -
sniff_trajectory_self_sufficiency(): per-trajectory endogenous-growth index,1 - imported / size, distinguishing lineages that grew on their own from confluences of other communities. -
plot_group_trajectories_2d(): newcolor_byargument with"final_group_share", colouring each node by the share of its documents that belong to the group’s last-year cluster (plasma palette), with white-haloed labels for readability over dark nodes. -
plot_group_trajectories_lines_3d(): newdescriptionsargument for manual per-trajectory hover text, plus terminal-node markers sized by document count.
birddog 1.0.6
New features
-
sniff_trajectory_destination(): track where the papers of an incomplete trajectory (one that stops before the last year) end up. Takes adetect_main_trajectories()result and atraj_id, follows the terminal node’s documents forward, and returns the final-year destiny vector, the dormant share, the dominant continuation group, and a per-year flow table. With the optionalall_detectedargument (all groups’detect_main_trajectories()outputs) it also resolves the destination at the trajectory level, identifying which living trajectory absorbed the stagnant one (destination_traj,continuation_traj). -
plot_trajectory_destination(): render the destinations fromsniff_trajectory_destination()as variable-width lines on a Sugiyama time layout, matchingplot_group_trajectories_lines_2d(). Each destination is one line whose width tracks the papers carried;color_byswitches between destination group and destination trajectory, andmin_propfolds minor destinations into a grey(other)line. -
plot_trajectory_dispersion(): draw the stagnant trajectory and the trajectory that absorbed it as two timelines on a shared year axis, with an arrow at the handoff year. -
sniff_citations_cycle_time(): newnormalizeargument ("none"|"domain") to divide each group’s annual CCT by the per-year network median, enabling within-domain comparability following Lee (2024). -
sniff_citations_cycle_time(): newdispersionargument (logical) that addsp25andp75columns to the returned data tibble, useful for detecting bimodal citation-age distributions. -
sniff_citations_cycle_time(): newcitation_scopeargument ("global"|"local") to restrict CCT to intra-corpus citations. Currently supported for OpenAlex data; Web of Science data falls back to"global"with a warning.
birddog 1.0.5
Bug fixes
-
sniff_groups_terms(): replace basetolower()withstringr::str_to_lower()to avoid locale-dependent failures on non-ASCII UTF-8 text. -
sniff_groups_terms(): fixtryCatchscoping bug where error-handler assignments tostats[[i]]were lost, causingpurrr::map_int(stats, nrow)to abort the whole run on a single failing group. Skipped groups are now dropped cleanly viapurrr::compact().
birddog 1.0.4
CRAN release: 2026-04-04
New features
-
mixed_sort(): exported for external use, with improved documentation. -
plot_group_trajectories_lines_2d(): newwidth_by_traj_sizeparameter to scale line width by trajectory size (default TRUE). -
plot_group_trajectories_lines_3d(): newwidth_by_traj_sizeparameter to scale line width by trajectory size (default TRUE).
birddog 1.0.2
New features
-
sniff_key_route(): support for multiple key-routes and natural group ordering. -
sniff_key_route(): newcompact_gapsanddirectionarguments. -
sniff_entropy(): newmodeandwindow_sizearguments. -
get_openalex_fields(): cache saved batches to skip duplicate API downloads.
Improvements
- Optimize SPC and key-route search with pre-built adjacency lists.
- Pre-render horizon plots to reduce gt object size in
sniff_groups_attributes(). - Improve key-route plot layout, axis labels, and data output.
- Improve horizon plot x-axis: vertical year labels, removed title.
- Use 95th percentile for entropy diff plot y-axis range.
- Swap diff colors in index plots: red for negative, blue for positive.
- Add
y_limits_diffparameter toindexes_plots().
Bug fixes
- Fix y-axis scale across entropy plots for group comparison.
- Fix dplyr variable collision in
sniff_key_route()group filter. - Fix
rlang.envimport to resolve R CMD check NOTE. - Fix plot issues: diff colors and same-year node spreading.
birddog 1.0.0
CRAN release: 2026-02-19
- Initial CRAN release.
- Rewrite of
sniff_key_route(),sniff_citations_cycle_time(), andsniff_entropy(). - Added
testthattest suite with 102 tests across 16 files. - Fix BibTeX parser for Windows CRLF line endings.
- Fix CRAN check issues: Unicode chars,
\dontrunexamples, DOI URLs. - Replace
\dontrunwith\donttestin all examples. - Add error guards to vignettes to prevent crashes.
birddog 0.1.0
- Initial development version.
- Added
sniff_key_route()function for main path analysis. - Includes visualization capabilities.
- Implements methodology from Liu & Lu (2012).
