Mailing List Archive

RE: Some features I'd like to see
This mail got really huge. Maybe I should have gone through it some more
times just to be sure. The dependency links will be there in
RT 2.0, the rest is mostly thinking about how to develope it after 2.0.

I suddently realized that both "Grouping", "Parent-Child" and
"Interrelationships" can be done by only using my Dependency links if
they're made a bit more powerful. I don't think it makes much sense making
a difference on the tickets regarding how they're linked together. Any
ticket might be dependent on any other ticket. I think it makes sense.

> Jesse>Eventually I see several distinct ticket types:
> Jesse> * User Request
> Jesse> * Trouble Ticket
> Jesse> * Bug
> Jesse> * Task

I think what Jesse is thinking about here are extentions to the "regular"
ticket today ... related to the different usages for RT. I hope we can
get this possible through some kind of "extention module" system rather as
static, integrated part of RT. RT 2.0 is missing some way to add/modify
ticket actions "dynamicly", but I hope we can do some changes after the
2.0 release.

As it is in 2.0, we only have one class, Ticket. As of 2.0 it has some
things related to worktask, but else it's quite close to "User Request",
I'd daresay ... and why not, RT (both 1.0 and 2.0) is primarly designed
for handling user requests.


1. USER REQUEST

A pure user request have one (and only one) requestor, is typically
initiated by an email (but eventually a phone call or similar) and doesn't
contain much more information than the communication, the status, the
owner and the timestamps.

On some sites a priority field is needed. In a pure user request, it
should be set automaticly, based on site (queue) policy. One way is by
looking up the priority from a requestor table ... it would typically be
sane to give people who are paying for proffesional support highest
priority, while giving a very low priority to stupid non-paying people who
are frequently nagging for help. It might also make sense to alter the
priority after certain rules, i.e. respecting priority wishes from the
requestor, if the subject line contains a significant amount of exlamation
marks ('!') or uppercase letters, the priority should drop considerably
for requestors not registered as paying customers, while it should
increase fot the paying customers, if the word "windows" or "microsoft" is
mentionated, the priority should drop, etc.

Some sites might need due dates. Those should also be set automaticly,
based on site (queue) policy. It might make sense to have policies like
"all requests should be answered to within 60 minutes for registered
paying customers and 24 hours for non-registered users", etc.

A pure user request does not involve more work than giving an answer. The
due date / priority affects are typically used for selecting the order
mails are answered in. It's not common to postpone resolving requests.

2. TROUBLE TICKET

I'd daresay this is the typical requests a technical support department
might get ... configuration troubles, etc. It can be a bit similar to
bugs, but it's not related to software development.

3. BUG TICKET

Bug ticket has with software bugs to do. This is not relevant for all RT
users, so I'd daresay we should try to make it as an extention package.
but quite a lot of us use RT in environments where software is developed
or maintained, and it might make some sense using RT as a light-weight bug
tracking tool. The requestor is either the person reporting the bug, or a
person working as 1st line support.

In a typical bug tracking tool, some extra information about the status
is needed, typically containing something like "could not reproduce
bug", "bug fixed", "will not be fixed", "could not locate bug", "duh -
this is not a bug, this is a feature!" etc.

There should also be more information related to the priority, i.e.
"critical security bug", "critical stability bug", "bug might be worked
around", etc.

A persistant, editable comment field might be nice in addition to the
normal correspondence/comments.

Each bug is associated with a module of code and/or a project (might be a
worktask). Etc.

Priorities will usually be set by the requestor (bug report submitter).
Usually the due dates are for "remove all (critical) bugs (related to
module X)" rather than for the individual bugs.

A typical bug requires a small and quite unpredictable amount of work.


4. (WORK)TASK

A task is a worktask, a Ticket in a project management tool. RT is not a
project management tool, but it might make sense storing small
worktasks there anyway. Some bugs will eventually need more work, thus
they become (or initiates) a worktask.

We would at least need those extra fields when/if we're going to
develope RT into a full-fledged project manager:

- Time/Resources spent (billing field - will be included in the 2.0
Tickets)

- Planned start date

- Estimated total time consume

- Progress done (i.e. "60% finished")

- Maybe multiple workers might be associated with one ticket
(though, I'd say that in most cases it's better/easier to create new
subtickets).

- Due date

- Static Priority (how important it is to get started and finished
quickly)

- Final Priority (how important it is to reach the deadline)

- Dynamic Priority (automaticly set priority, dependent on the static
priority, the due date and the progress)

.......

As I see it, workflow and category overlapping might be handled by
creating new tickets and setting up dependency links. What we get is not
one hierarchy, rather a n:n relationship between tickets. I can't see a
problem with that. A user can, but should not, make any loops. Maybe the
"link" action should always check for loops and eventually return an
error.

Loops aren't really a problem in the scheme below anyway. It's possible
to send a reply to "requestors of this ticket + tickets dependent on this
ticket" instead of just "requestors of this ticket" ... but not possible
to do a recursive scan after requestors. Actually I think that for the
very most practical situations you only want to send a reply to two levels
of a hierarchy. Eventually it should be possible to kill off requests
which has dependencies, and the dependency links should bypass the killed
request (for dealing i.e. with duplicated bug reports).

I think it should be possible/wishable to set some attributes at the
dependency links, but in the examples below I'm only using a general
"dependency link"

Examples:


SEVERAL USER REQUESTS -> ONE BUG:
=================================

1. A user sends a mail which arrives as a User Request (1)
ticket (#41). The mail sounds something like "I have problems".

2. First line support initiates a dialogue with the requestor, to get the
problems a bit clearer defined.

3. First line support clicks at a link with the name "Search in bug
database". He discovers that Ticket #23 is a Bug Report (3) that matches
the bug found.

4. First line support presses a "Link" button. #41 gets marked as
"dependent" on #23. #41 gets stalled.

5. Somebody fixes the bugs and resolve #23. All dependent, including #41
gets opened.

6. First line support sees one of the opened user requests, and he
decides to send a mail to all those that has reported the bug that it's
now fixed.

7. First line support enters #23 and chooses "write reply". He writes a
message, he choose "resolve" and ticks a box for "Include the dependent
ticket(s)". The message goes to all dependent ticket, that is all user
requests about this bug. All dependent tickets that are not dependent on
other non-resolved tickets gets resolved.

Many user requests can be dependent on one bug report. One user request
can also be dependent on several bug reports if the requestor reports more
than only one bug in the same email.


ONE BUG THAT ACTUALLY IS A WORKTASK
===================================

8. Request #42 comes in, action 1., 2. and 3. is repeated but nothing
found in the bug database. First line support resolves the request,
becuase the external user is not really interessted in the bugfix.

9. 1st line support clicks at "create new bug report" and enter
information about the bug. Ticket #43 is created, #42 is dependent on
#43.

10. #43 gets worked on, and somebody discovers that the software module
has to be redesigned completely to fix this bug. A Work Task (4) (Ticket
#44) is created (redesign this piece of shit). #43 gets dependent on #44
and stalled.

11. New tickets #45, 46 and 47 is made (Work Tasks (4), subtasks of #44),
and ticket #44 is made dependent on those. Every time a subtask is
completed, a reply/resolve at "this and dependent" is done (like in action
7).

12. Eventually as the last of the three subtasks gets resolved, Ticket #44
also gets resolved. As #44 is resolved, #43 (the bug) is opened. The
owner of the bug fixes up what might be left of the bug and resolves it.
The user request is resolved and stays so.

One user request can be dependent on one bug report that can be dependent
on one worktask which might be dependent on several (sub) worktasks.


THE FULL HARDDISK SYNDROME
==========================
13. The mail server harddisk goes full, and 50 users report that the mail
server seems jammed.

14. 1st line support writes a Trouble Ticket (2) (#158) "mail server is
down" to technical support.

15. 1st line support links all the 50 user reports to the trouble ticket
somehow (the cli is usually a nice to have in such cases).

16. Technical support immediately logs in and finds a big old log file he
which can be deleted. He resolves the request, and writes three new
requests. One to himself; "Clean up the disk" (#159) and one to the local
hard disk provider (#78 at the HD providers site) asking them to send more
disks, and one to himself; "Install disk" (#160). #158 is marked dependent
on #161, #161 is dependent on HD #78, and #158 is also dependent on #159.

17. 1st line support goes to #158 and writes a reply to all those 50
users.

50 user requests can be dependent on one trouble ticket that is taken care
of immediately. This (resolved) trouble ticket can be dependent on two
worktasks (...well, probably it's easier to use trouble tickets here), and
one of the worktasks can even be dependent on an external request.

I hope those examples are understandable, and that you agree this is a
quite possible way to do things. If you need more examples to be
convinced, just name it ... the same if you think other ideas (mainly to
separate dependency linking and different kinds of hierarchicallness)

Instead of "transitions", we just spawn new requests. We have been doing
that for a long time locally with great success.

> ticket - an item that has an assigned ID number takes up space in queue
> etc. It can have one or more derivedtickets, if it does then
> it is the parent of the derived tickets. (alias ticket)

I think all kind of tickets should be a subclass of Ticket. I think
you're doing it more complex than necessary when making differences like
this, and I also thinks it gets more static. I think differing tickets by
the (content) class of the request makes more sense, I hope it will make
it easier to build site-specific extentions.

> Daniel>that things like orphaned requests didn't appear in the
> relationships.
>
> What's an orphaned request? Derived, component and grouptickets are
> all first class tickets. In a rtq they should all show up. The
> derived, component, group etc are just a series of links that impose a
> different logic on the ticket. At worst case an "orphaned" request
> would just be a ticket.

I agree, all tickets should by default not be linked (other than to
which queue they appear in), thus beeing "orphans".

A queue is defined by which group of persons should handle it more than
content and class. Our keyword system should do it easy to sort and
classify requests.

> Agreed. However something like this can be the output of rtq (sorted by num)
> for the diagram above:

I agree there must be a minimum of linking information at the queue
view, i.e. the total count of dependent requests and the count of
dependencies. It would also be nice to get up a graph-view of linked
requests.

> I don't know about intuitive, but I think this is
> understandable.

I think both mine and your appraoch isn't too intuitive - particularly not
when more complex issues are dealt with. I hope Meri might do some
miracles regarding that issue... :) We have good experiences creating new
dependent requests to the production from the 1st line support, I've made
a "spawn" button beside the reply/comment buttons. It quotes a
transaction just like reply/comment, but makes a request in a new queue.
If the 1st line support don't think the user wants to be bothered more,
they resolve the dependent request ... eventually it gets stalled until
the production has resolved their request. At the other hand, I don't
think anyone but me understands the usage of the rather cryptical form
"Mark this request as dependent at request #<input ...>" which might make
the request dependent on an existing ticket, like a bug report or an
existing "the disk is full" trouble ticket in the technical support queue.

> I digess a bit. Buy some disk would be appropriate if the trouble
> ticket was "Can we stop running out of disk space every thursday" but
> not if the ticket was "I'm getting an out of disk space error".

In my model, it's completely OK to make a resolved request dependent on
another request. What it really means is either "This request is stalled
until the dependencies are resolved" or "the new request is originating
from the old one". Therefore it might make sense creating a new trouble
ticket "Can we stop running out of disk space every thursday" which the
resolved trouble ticket "Out of disk space error!" is dependent on.

> If the message was the latter, then the "buy more disk space ticket"
> should become a separate request. This separate request may have
> derived tickets of "analyze disk space needs", "bid purchase of
> disks", "take systems down for disk install"....

Quite often there are limits for how much it is interessting to store in
RT. I think RT should be more a tool for communication and request
tracking than documenting every piece of work a person has done and is
going to do during a day :) "Spawning" requests make most sense when
it's done to a new queue. I.e. if another person/department is in charge
of "buying disks" and/or "analyze disk needs" and/or "bid purchase of
disks" it makes sense "spawning" the request, if not it's better to
actually do the work. :)

> If the user is complaining about running out of disk space every
> thursday, then "clean out a bit of space" and "buy some disk" would be
> appropriate derived tasks. In fact the ticket may become a component
> ticket for an already outstanding ticket on "need to get more disk".

If "need to get more disk" is already there, "The mail server shouldn't go
down every thursday" should clearly be marked as dependent on "need to get
more disk".

> >Then there is a third kind of "hierarchicalliness" which we've already
> >implemented here and which we use freqently. It might be quite related to
> >the first kind ... it's dependency.
>
> Actually, it is the first kind. Project management is primarily
> workflow/depenndency tracking and finding out which tasks have to be
> don in parallel or serial order and the longest path to get the task
> done.

Yeah, I guess you're right. Actually I think everything can be done by a
proper usage of dependency links :)

--
Tobias Brox (alias TobiX) - +4722925871 - _urgent_ emails to
sms@tobiasb.funcom.com. Check our upcoming MMORPG at
http://www.anarchy-online.com/ (Qt) and play multiplayer Spades,
Backgammon, Poker etc for free at http://www.funcom.com/ (Java)
RE: Some features I'd like to see [ In reply to ]
> I think all kind of tickets should be a subclass of Ticket. I think

That's a very good idea. This then allows people to extend RT with
site specific tickets or ticket logic while still enabling the overall
system to be useful out of the box. The fun then becomes figuring out how
to deal with the marshaling of information between a ticket object and
the DB.

> > Daniel>that things like orphaned requests didn't appear in the
> > relationships.
> > What's an orphaned request? Derived, component and grouptickets are
> I agree, all tickets should by default not be linked (other than to
> which queue they appear in), thus beeing "orphans".

I was thinking that given a ticket X and two dependent sub tickets
Y & Z, logic is going to need to exist so that if someone kills/deletes X
from the system Y & Z then also disappear or something else appropriate
happens to them. I was mainly trying to get at some of the complexity
involved in keeping the relationships between tickets in a known good
state.

-- Daniel R. <danielr@ccs.neu.edu> [http://www.ccs.neu.edu/home/danielr/]
RE: Some features I'd like to see [ In reply to ]
> That's a very good idea. This then allows people to extend RT with
> site specific tickets or ticket logic while still enabling the overall
> system to be useful out of the box. The fun then becomes figuring out how
> to deal with the marshaling of information between a ticket object and
> the DB.

My idea about this is to set up extra tables having site-specific data or
data specific to some special kind of Ticket.

> I was thinking that given a ticket X and two dependent sub tickets
> Y & Z, logic is going to need to exist so that if someone kills/deletes X
> from the system Y & Z then also disappear or something else appropriate
> happens to them.

With my idea, it's possible to kill ticket X and then have a check-box
that might be checked if the WebRT user wants to kill Y & Z also. I don't
really think it's a problem in this case that "orphans" might be produced.
If anybody should try to accessing the ticket Y or X is dependent on, it
should be handled as if he/she tried accessing any other killed object.
It's not handled very nice in 1.0.

Apropos killings, I think it makes sense to just change the status, and
not actually kill it ... and then have a cleanup tool which might be used
on old tickets whenever we run low on disk space. As I see it, that's the
only problem we have with storing killed requests/tickets, maybe with an
exception of if it's something secret/private that really shouldn't be
seen by other users of RT.

> I was mainly trying to get at some of the complexity
> involved in keeping the relationships between tickets in a known good
> state.

With my suggestions, nothing really bad will happen if the linking breaks
somehow. I don't think it will be needed to do stuff recursively, I only
think it will be needed to do things on a ticket and the dependent
tickets. So a loop will be harmless, though it usually won't make any
sense to have a loop (and eventually we should have a test on this).

If a ticket that is linked up "both ways" is killed, then there might be
some problems handling that. I think it might be wishable that if ticket
A is dependent on ticket B is dependent on ticket C, and ticket B is
killed, A should be dependent on C.

--
Tobias Brox (alias TobiX) - +4722925871 - _urgent_ emails to
sms@tobiasb.funcom.com. Check our upcoming MMORPG at
http://www.anarchy-online.com/ (Qt) and play multiplayer Spades,
Backgammon, Poker etc for free at http://www.funcom.com/ (Java)
RE: Some features I'd like to see [ In reply to ]
> -----Original Message-----
> From: Tobias Brox [mailto:tobiasb@tobiasb.funcom.com]
> Apropos killings, I think it makes sense to just change the status, and
> not actually kill it ... and then have a cleanup tool which might be used
> on old tickets whenever we run low on disk space.

Agreed. I think you already have a "dead" ticket status that can be used for
that.

> With my suggestions, nothing really bad will happen if the linking breaks
> somehow. I don't think it will be needed to do stuff recursively, I only
> think it will be needed to do things on a ticket and the dependent
> tickets. So a loop will be harmless, though it usually won't make any
> sense to have a loop (and eventually we should have a test on this).
>
> If a ticket that is linked up "both ways" is killed, then there might be
> some problems handling that. I think it might be wishable that if ticket
> A is dependent on ticket B is dependent on ticket C, and ticket B is
> killed, A should be dependent on C.

Transitivity I think is implicit both ways. Both as dependency (component)
and as derived tickets. That's why I suggested the tree structure in my
original message. The problem comes in where you can have loops, then
transitivity isn't true, and where to assign the tickets is no longer
obvious (well obvious to me 8-).

Example A

Ticket1 is componet of ticket3
Ticket2 is component of ticket3
ticket4 is derived from ticket1

does that mean that ticket4 is derived from ticket2 as well? Not necessarily
since ticket4 may not be required for ticket2 to be solved. In my model,
ticket1 can't be a component of another ticket if it has a derived ticket.
Ticket4 is ok as a derived ticket of ticket3. Killing ticket3 would result
in the following:

ticket1 stands alone
ticket2 stands alone
ticket3 is a derived ticket for both ticket1 and ticket2

This keeps the dependencies of the original system since all requirements
flow from the top downward (i.e. there is an implicit tree transversal
order).

General directed graphs are useful beasts, but I think they are overly
general for a trouble ticket system. They also bring up dependency problems
that we couldn't find firm rules for at my previous job (we didn't want
people solving the relationship issue in an ad-hoc fashion).

One other thing I haven't seen mentioned is searching ticket text (like
reqglimpse). That was very useful when new people had to solve problems.
They would do a reqglimpse looking for certain words and see what the old
tickets had to say. It was a great learning/teaching tool. It was wonderful
for help desk people.

-- rouilj
Re: Some features I'd like to see [ In reply to ]
On Mon, Mar 20, 2000 at 11:57:39AM -0500, Rouillard, John wrote:
> One other thing I haven't seen mentioned is searching ticket text (like
> reqglimpse). That was very useful when new people had to solve problems.
> They would do a reqglimpse looking for certain words and see what the old
> tickets had to say. It was a great learning/teaching tool. It was wonderful
> for help desk people.
>

We get that for free now that ticket content is in the database :)

> -- rouilj
>
>
> _______________________________________________
> Rt-devel mailing list
> Rt-devel@lists.fsck.com
> http://lists.fsck.com/mailman/listinfo/rt-devel
>

--
jesse reed vincent -- jrvincent@wesleyan.edu -- jesse@fsck.com
pgp keyprint: 50 41 9C 03 D0 BC BC C8 2C B9 77 26 6F E1 EB 91
--------------------------------------------------------------
. . . when not in doubt, get in doubt. -- Old Discordian Proveb
RE: Some features I'd like to see [ In reply to ]
> Agreed. I think you already have a "dead" ticket status that can be used for
> that.

Yep. In our locally hacked version of rt 1.0, killed requests are never
physically deleted.

> Transitivity I think is implicit both ways. Both as dependency (component)
> and as derived tickets. That's why I suggested the tree structure in my
> original message. The problem comes in where you can have loops, then
> transitivity isn't true, and where to assign the tickets is no longer
> obvious (well obvious to me 8-).

Loops don't make sense at all, I guess we agree on that. If a user
creates a loop, it means that he has done something wrong - so it would
make sense to do a loop-test and give an error message. Anyway, I think
nothing really bad can happen if somebody creates a loop on mistake.

In our locally hacked RT, an open request always indicate that somebody
has to do some work. The workflow works quite well, I don't know of any
incidents where a ticket have just been lost in the system.

In my system, it would not make sense to make a ticket dependent
on a request that is either stalled or resolved. I think it makes sense
to test this as well.

If I understand you correct, your terminology looks like this, explained
with my terminology (:

Several component tickets are dependent on one group ticket
One parent ticket is dependent on (several) derived tickets

A reply to one group ticket should go to all dependent tickets.
When a group ticket is resolved, the dependent tickets should be resolved.

All derived tickets must be resolved before the dependent might be
resolved.

> Example A
>
> Ticket1 is componet of ticket3
> Ticket2 is component of ticket3
> ticket4 is derived from ticket1

Translated into my terminology:

#1 and #2 is dependent on #3
When #3 is resolved, #1 and #2 should also be resolved
Replies to #3 should go to #1 and #2.

#1 is dependent on #4
#4 should be resolved before #1 is resolved.

A real life example:

#1: user A says "mail server is not working, and i demand compensation
since I've paid for using this mail server"
#2: user B says "mail server is not working"
#3: 1st line support "spawns" #3: "mail server is not working"
to techincal support
#4: request from 1st line support to the customer billing department:
"please make a reduction for user A"

> does that mean that ticket4 is derived from ticket2 as well?

Uhm ... no? Absolutely not?

Request #4 and #3 will be open, the others stalled, in my system.

> Ticket4 is ok as a derived ticket of ticket3. Killing ticket3 would result
> in the following:
>
> ticket1 stands alone
> ticket2 stands alone
> ticket3 is a derived ticket for both ticket1 and ticket2

It might be an idea setting up the system to reopen #1 and #2 if #3 is
killed.

> This keeps the dependencies of the original system since all requirements
> flow from the top downward (i.e. there is an implicit tree transversal
> order).

In my "thoughts" I'm going from left to right; the left ticket is
dependent on the right ticket. The leftmost tickets are from the external
user, the rightmost might be worktasks that needs to be done. The work
flow is from left to right, but there might be an information flow from
the right to the left.

> General directed graphs are useful beasts, but I think they are overly
> general for a trouble ticket system.

It's a general approach, and I love it.

> They also bring up dependency problems
> that we couldn't find firm rules for at my previous job (we didn't want
> people solving the relationship issue in an ad-hoc fashion).

I haven't encountered any problems with our dependency model, and I can't
see much problems with it anyway.

> One other thing I haven't seen mentioned is searching ticket text (like
> reqglimpse). That was very useful when new people had to solve problems.
> They would do a reqglimpse looking for certain words and see what the old
> tickets had to say. It was a great learning/teaching tool. It was wonderful
> for help desk people.

In addition for plain textsearching in the database, Jesse also have a
Knowledge Base system witch eventually will be better linked up to RT. It
doesn't work very well as of today, but the concepts behind it is
just brilliant.

--
Tobias Brox (alias TobiX) - +4722925871 - _urgent_ emails to
sms@tobiasb.funcom.com. Check our upcoming MMORPG at
http://www.anarchy-online.com/ (Qt) and play multiplayer Spades,
Backgammon, Poker etc for free at http://www.funcom.com/ (Java)
RE: Some features I'd like to see [ In reply to ]
> From: Tobias Brox [mailto:tobiasb@tobiasb.funcom.com]
...
> Loops don't make sense at all, I guess we agree on that. If a user
> creates a loop, it means that he has done something wrong - so it would
> make sense to do a loop-test and give an error message.

Agreed.

> Anyway, I think nothing really bad can happen if somebody creates a
> loop on mistake.

I'm not sure about that. The easiest way to find ticket dependencies/track
completion is to do a traveral of the tree. If a loop is created, then the
traversal code need to determine that a loop exists and stop walking that
portion of the tree. I guess the loop detection code wouldn't be that bad,
but I would prefer it not to be necessary
for heavily used programs like rtq or the web interface.

> In my system, it would not make sense to make a ticket dependent
> on a request that is either stalled or resolved. I think it
> makes sense to test this as well.

Strange. That happens a lot where I have been.

ticketa:ticketb:ticketc -> ticketd -> tickete:ticketf:ticketg

where the : separated tickets are all at the same level. If ticketg is
stalled pending more information (say from a vendor), work can still
progress on tickete and ticketf, but should ticketd, or ticketa, ticketb or
ticketc be stalled? In our system we said no. Only if all of tickete,
ticketf, and ticketg are stalled is ticketd (and therefore ticketa, ticketb,
and ticketc) stalled (note in our system we used real merging, so ticket a,
b, and c didn't really exist outside of ticket d).

If you mean making a new link on a stalled ticket, that happens as well.
E.G. The new disk comming in could be used to solve tickets: "Running out of
mail spool space", "need more room on userdisk2", and "need to decomission
RL02 drive".

> If I understand you correct, your terminology looks like
> this, explained with my terminology (:
>
> Several component tickets are dependent on one group ticket
> One parent ticket is dependent on (several) derived tickets

Correct I think. Don't forget that a parent ticket can be a group ticket.

> A reply to one group ticket should go to all dependent tickets.
> When a group ticket is resolved, the dependent tickets should
> be resolved.

Agreed. And a group ticket can't be resolved unless all of the ticket that
have that group ticket as a parent are resolved.

> All derived tickets must be resolved before the dependent might be
> resolved.

Um if dependent in this case means parent tickets to the derived tickets,
then yes
your statement is correct.

> > Example A
> >
> > Ticket1 is componet of ticket3
> > Ticket2 is component of ticket3
> > ticket4 is derived from ticket1
>
> Translated into my terminology:
>
> #1 and #2 is dependent on #3
> When #3 is resolved, #1 and #2 should also be resolved
> Replies to #3 should go to #1 and #2.

Correct.


> #1 is dependent on #4
> #4 should be resolved before #1 is resolved.

Correct.


> A real life example:
>
> #1: user A says "mail server is not working, and i demand compensation
> since I've paid for using this mail server"
> #2: user B says "mail server is not working"
> #3: 1st line support "spawns" #3: "mail server is not working"
> to techincal support
> #4: request from 1st line support to the customer billing department:
> "please make a reduction for user A"
>
> > does that mean that ticket4 is derived from ticket2 as well?
>
> Uhm ... no? Absolutely not?
>
> Request #4 and #3 will be open, the others stalled, in my system.

But 1 and 2 aren't stalled (see below) really. Work is progressing just
under another ticket number. The state of ticket 3 is also the state of
tickets 1 and 2. In my scheme ticket4 is the problem. You are right in that
it belong to ticket1, but it makes
life a hassle, because closing ticket 3 no longer implies that ticket1 can
be closed. Only when ticket4 and ticket3 are closed is ticket1 closed.

> > Ticket4 is ok as a derived ticket of ticket3. Killing ticket3 would
result
> > in the following:
> >
> > ticket1 stands alone
> > ticket2 stands alone
> > ticket3 is a derived ticket for both ticket1 and ticket2
>
> It might be an idea setting up the system to reopen #1 and #2 if #3 is
> killed.

In my case, they would never have been closed/stalled. Maybe we need
another status for those tickets. Then they would be moved to open status
from this new status.

Also we seem to be using stalling differently. Stalling was used for
suspending work pending an outside event. Ticket stalled too long implied
that somebody wasn't getting the assistance they needed to do their job.
E.G. "We need more disk space" would be stalled pending shipment of disks
from vendor, or getting price quote from vendor. In either case if I saw the
ticket stalled beyond its expected reopening date, I would call the person
who stalled it and find out what was up and if I could help unstall the
ticket.

> > This keeps the dependencies of the original system since all
requirements
> > flow from the top downward (i.e. there is an implicit tree transversal
> > order).
>
> In my "thoughts" I'm going from left to right; the left ticket is
> dependent on the right ticket. The leftmost tickets are from
> the external
> user, the rightmost might be worktasks that needs to be done.
> The work flow is from left to right, but there might be an information
> flow from the right to the left.

That's fine I can handle top == left and bottom == right. I think both ways
work.
I was just using an analogy to a tree (um the CS kind with the trunk at the
top).

> > General directed graphs are useful beasts, but I think they are overly
> > general for a trouble ticket system.
>
> It's a general approach, and I love it.

But then the algebra of the system is more complex.

> > They also bring up dependency problems that we couldn't find firm
> > rules for at my previous job (we didn't want
> > people solving the relationship issue in an ad-hoc fashion).
>
> I haven't encountered any problems with our dependency model,
> and I can't see much problems with it anyway.

Well one issue I see is that you can't close ticket1 when you close ticket3
in the
example above. Sending email on ticket3 that the problem is solved isn't
true for ticket1 because s/he still want's a fee reduction which may or may
not be done.

How do you handle that issue? The easiest way would be to enforce no ticket
is closed till all of its dependents are closed, but it breaks the rule that
a group ticket closing closes all its components.

Wait a sec. I just thought of a different way of looking at it that I think
is your view. Lets see now. A group ticket is just a derived ticket from
multiple user tickets. So I guess you only have to define derived tickets,
and component tickets are merely a derive link looked at in reverse (from
the group ticket). Actually with this definition the rule for closing
tickets at the next higher level can simply be:

if the ticket I'm derived from has no unresolved derived tickets,
resolve the ticket I'm derived from.

That would still leave ticket 1 open till ticket 4 was resolved and
resolving ticket 4 would resolve ticket 1.

Still doesn't address reply's to ticket3 tickets are closed when they
aren't, but that might not be a big deal since the linking of ticket 1 to
ticket 3 should generate a message to ticket1's requestor notifying him of
the change, so that s/he know to look at the new ticket for further
information.

-- rouilj
RE: Some features I'd like to see [ In reply to ]
> > Anyway, I think nothing really bad can happen if somebody creates a
> > loop on mistake.
>
> I'm not sure about that. The easiest way to find ticket dependencies/track
> completion is to do a traveral of the tree. If a loop is created, then the
> traversal code need to determine that a loop exists and stop walking that
> portion of the tree. I guess the loop detection code wouldn't be that bad,
> but I would prefer it not to be necessary
> for heavily used programs like rtq or the web interface.

Well, if you're worried about wasting processor cycles, I don't think
that's a big issue. As I see it, at a typical installation, only some
small part (20% maybe) of the tickets needs to be linked somehow, and only
some small part of this needs to be linked more than once. There won't
really be often that a loop check would need to traverse a big graph.

> > In my system, it would not make sense to make a ticket dependent
> > on a request that is either stalled or resolved. I think it
> > makes sense to test this as well.
>
> Strange. That happens a lot where I have been.

Ok, you're right.

> > #1: user A says "mail server is not working, and i demand compensation
> > since I've paid for using this mail server"
> > #2: user B says "mail server is not working"
> > #3: 1st line support "spawns" #3: "mail server is not working"
> > to techincal support
> > #4: request from 1st line support to the customer billing department:
> > "please make a reduction for user A"
> >
> > > does that mean that ticket4 is derived from ticket2 as well?
> >
> > Uhm ... no? Absolutely not?
> >
> > Request #4 and #3 will be open, the others stalled, in my system.
>
> But 1 and 2 aren't stalled (see below) really.

In my system (that is actually up running today) they will be - and it
generally makes sense, I think. We don't want to bother more with the
individual users complaining that the mail server is down until we've
actually fixed the mail server, and when we've actually fixed the mail
server we'd like to send mail to all of them. (the latter is not possible
as of my system today)

> Work is progressing just under another ticket number.

Exactly! Work is progressing under ticket #3 and #4, which is individual
tickets, except that they are linked up to #1 and #2. When #3 and #4 was
created, parts from #1 was quoted, so the content is easy available in #3
and #4. #1 and #2 will be opened as soon as #3 and #4 is resolved.
Anyone that are viewing #3 or #4 through the web ui might click links to
have a look at the stalled requests. That's how my system of today works,
and it actually works quite nice.

> The state of ticket 3 is also the state of
> tickets 1 and 2.

In your system, maybe. In my ideas, it's only up to the user to
distinguish "group tickets" from "parent tickets". When handling the
pending ticket, the WebRT user should indicate if the dependent should be
resolved and/or if the reply should go also to the dependent requestors.
If #3 is resolved, and #4 is open, and a user asks for "resolve parent
ticket", then #2 will be resolved, but not #1. Anyway, in my system a
WebRT user can force #1 to be resolved. And it might make sense (it
quite often does make sense here) when the external requestor doesn't need
to be informed about the outcome of request #4 (i.e. if a lot of
users report about a serious abuse done by an employee, it might result
into new tickets, "investigate incident" and "see what we can do with this
employee". Those things are seldom relevant for the external requestor,
but it makes sense to link it up anyway).

> In my scheme ticket4 is the problem. You are right in that
> it belong to ticket1, but it makes
> life a hassle, because closing ticket 3 no longer implies that ticket1 can
> be closed. Only when ticket4 and ticket3 are closed is ticket1 closed.

I just don't think it is a problem using my general dependencies. With
group tickets and derived tickets there are such problems - because the
design is a bit too static.

> In my case, they would never have been closed/stalled. Maybe we need
> another status for those tickets. Then they would be moved to open status
> from this new status.

We've come down (particularly by investigating usage and theoretical usage
patterns here) that the open/stalled/resolved/killed statuses are
sufficient when combined with the possibility to "spawn" new requests.
People often want to have more/different status settings, and it also
makes sense allowing it, but it always boils down to that each
site-specific status can be mapped into one of the four above.

We had an old in-house-built bug tracking tool with slightly different
status levels. There were "fixed" which ment that it was fixed, but QA
should still have a look at it, and it was "resolved" which ment that QA
had actually tested the fix. In my system, it would be one queue for QA
and one queue for the programmers - when somebody finds a bug, they enter
a ticket into the QA queue ("seems like a bug, test this"), and QA
"spawns" the ticket into a bug report ticket in the programmers queue. At
this point, the ticket in the QA queue is stalled, and the bug report is
open. Eventually the programmers resolve the bug report, and the ticket
in the QA queue will reopen.

> Also we seem to be using stalling differently. Stalling was used for
> suspending work pending an outside event. Ticket stalled too long implied
> that somebody wasn't getting the assistance they needed to do their job.

That's where alarm tools come into play. There already exists such a tool
for rt 1.0, and it's quite important I think. My idea is to always set
the due date (i.e. auto-set it to some monthes in advance) and
unresolved tickets approaching the due date should initiate an email
alarm.

> That's fine I can handle top == left and bottom == right. I think both ways
> work.
> I was just using an analogy to a tree (um the CS kind with the trunk at the
> top).

I think that what we have is a graph, and not a tree. Well, maybe it
usually will be like a tree with a root anyway.

[ about general directed graphs ]
> > It's a general approach, and I love it.
>
> But then the algebra of the system is more complex.

No, actually I've kept complexity at a bare minimum in my current RT.
People are allowed to set up dependency links, which might be followed
(as clickable links) through the UI. Except for this, the only
"automatic" thing there is in the system is that a stalled dependent
ticket gets reopened when the dependency (lower/righter) gets resolved ...
and that an open ticket gets stalled if we make it dependent on an open
ticket. This tiny simple little algoritm handles the workflow great in
our company!

The additions I'd like to see for 2.0 is:

- Possibility for a user to send replies to the requestors of the
dependent tickets. As I see it, we don't need recursivity here, so it
shouldn't be complex and it wouldn't really need to check for loops.

- Possibility for a user to request the dependent tickets to be resolved.
This might be a little bit complex, but I see no problems with it.

- Nice view of graphs. This might be complex, but it's not that
important, I think (Bugzilla has such a graph view, as there is seldom
more than only a few tickets beeing linked together, I've never seen it
be used for anything other than bragging about how nice it would be if
there was more dependencies.. :)

> Well one issue I see is that you can't close ticket1 when you close ticket3
> in the example above.

That's very easy - in my system, there is nothing stopping a user from
doing just that. And I think it's OK.

> Sending email on ticket3 that the problem is solved isn't
> true for ticket1 because s/he still want's a fee reduction which may or may
> not be done.

Well, that might be an issue, but as long as the support workers pay
attention, it will be just OK.

First of all, I think any site should have a strict policy that any email
sent out to more than one requestor should not appear as a private email.
So I think it's wrong to send this email:

"We've just received your email about the mail server beeing down. Well,
the problem is fixed now. Thanks for your report, and have a happy
weekend".

...while this one is OK to send, also to requestor of #1:

"This email is sent to everybody that have been complaining about our mail
server beeing down. Well, it's now up running again - and we're going to
buy more disk so this won't happen again. If this email doesn't answer
your original request, please write a reply. Thanks for your report."

...particularly if support (when handling #1) also wrote a more specific
reply ("We've sent your request about compensation to the billing
department").

> How do you handle that issue? The easiest way would be to enforce no ticket
> is closed till all of its dependents are closed, but it breaks the rule that
> a group ticket closing closes all its components.

Keep It Simple Stupid. No enforcements, no rules and it will work just
fine. No distinction between "group tickets", "derived tickets", etc,
except maybe in the users mind ... it's all just tickets to RT.

--
Tobias Brox (alias TobiX) - +4722925871 - _urgent_ emails to
sms@tobiasb.funcom.com. Check our upcoming MMORPG at
http://www.anarchy-online.com/ (Qt) and play multiplayer Spades,
Backgammon, Poker etc for free at http://www.funcom.com/ (Java)