Baffling Dashboard Behavior

Hi folks,

I have set up a dashboard to track grading progress, and it is doing something very strange. I use the dashboard to keep count have how many theses I have to grade, how many I’m waiting on revisions for, etc. I have a *student note prototype, and I move the students between smart adornments as I finish a paper. I usually use a stamp to change the $GradingStatus attribute.

The problem is that the dashboard is counting some students twice, and I cannot figure out why. In other words, when I stamp “Burton, Joe” with $GradingStatus of “NeedToGrade”, the dashboard shows an addition of one student. When I add “Cook, Thomas,” it shows an addition of 2 new students. I see no pattern among the students who are double-counted.

Here is the code for the dashboard, located in an edict:

$MyList=find(inside ("Students") & $Prototype="*Student" & inside("Need to Grade-First Round"));$Subtitle=$MyList.count

And this code produces the same result:

var:list vList=find(inside("Students") & $Prototype="*Student" & inside("Need to Grade-First Round")); $Subtitle=vList.count;

I have rebooted multiple times. It even works the same in a duplicated version of the document with everything else deleted except the two student notes, the smart adornments, and the dashboard note.

Running Tinderbox 9.7.3
MBP M1 Pro
Sonoma 14.4.1

I’d appreciate any ideas!

Thanks,

Kent

  1. If you save, quit, and reload the document, does the problem resolve?

  2. Can you upload a sample document? If not, can you send a confidential copy to bernstein@eastgate.com?

I wonder if the use of a List, which can have duplicate members, rather than a Set, which cannot have duplicate members, is one of the issues here.

2 Likes

I solved the mystery, for now. I know what was happening, though I still don’t understand why it was happening.

The dashboard is supposed to find all notes that are:

a) in the container “Students”,
b) use the “*Student” prototype, and
c) on the “Need to Grade” adornment.

I realized that I had created a note called “Missing Assignments” in the container “Students,” but not located on the “Need to Grade” adornment. I had created a table of those missing assignments using aliases in that “Missing Assignments” note/container. The dashboard was double-counting the notes that had aliases in that “Missing Assignments” container.

But I don’t understand why. The only reasons I can think of are:

  • Something about making the “Need to Grade” adornment into a smart adornment (an edict collecting all notes with the $GradingStatus of “NeedToGrade”) meant that it collected aliases in a child container.
  • Something about creating a Table in a child note that I do not understand (still figuring that out).

It may be important to note that there are many notes that fulfill parts a) and b) but not c) of the dashboard criteria that are not counted on the dashboard.

This is a tricky case! inside(X) is true if a note or any of its aliases is inside X. This is often handy. For example, if you have two agents, Important Things and Overdue Things, then it’s nice to be able to ask for all the notes inside(Important Things) & inside(Overdue Things).

But here, it caused confusion. Using a set instead of a list would resolve the problem.

I tried using a set, though perhaps I got some syntax wrong? This code produced the same counting of the alias and the original:

$MySet=find(inside (“Students”) & $Prototype=“*Student” & inside(“Need to Grade”));$Subtitle=$MySet.count

You may need to get the original of the notes you find, to disambiguate the set.

Per @Eastgate’s response, try adding this condition to find() to not grab aliases.

& $IsAlias==false

Thanks! The $IsAlias condition worked, Paul.

I was not sure how to use original, though, Mark. What would the syntax be for a Find() query?

I’m also left wondering why the condition & Inside (the smart adornment) did not exclude the aliases, which were in a sibling container that was not on/in the adornment. I thought they would be logically excluded from the Find() query.

This is a special oddity of inside(). A note is inside(X) is (a) X contains this note, or (b) X contains an alias of this note, or (c) X is an adornment, and this note overlaps X.

That is good for working with lots of agents, and less good for working with find() and its relatives.

Alternative: you can always test whether the parent of this note is X: $Path(parent)==$Path(X) or $Path(parent)=="/tiny/container/X"